자동 백업과 배포가 비밀을 실어 간다

사람에게 건 규칙은 로봇에게 걸려 있지 않다

작은 조직 AI·서버 보안 기본기의 둘째 갈래입니다. 「비밀은 git에 넣지 마라」는 규칙을 사람은 압니다. 매 턴 도는 자동 백업과 한 번 걸어 두면 잊히는 배포 저장소는 그 규칙을 모릅니다.

1. 「전부 올린다」는 판단하지 않는다

AI 작업 환경에서는 대화가 끝날 때마다 바뀐 파일을 저장소에 올리는 자동 백업을 흔히 겁니다. 현장 기록에 따르면 그 백업이 「전부 추가」 한 줄로 되어 있어서, 원고 파일에 들어간 일회용 기기 가입 키를 비공개 저장소에 그대로 실어 보냈습니다. 키가 일회용이라 이미 소진된 뒤여서 피해는 없었습니다. 그러나 같은 날 다른 원고 세 건에도 또 다른 키 두 개가 들어 있었고, 앞선 백업에 이미 실려 있었습니다.

규칙은 있었지만 사람에게만 걸려 있었고 매 턴 도는 로봇에게는 걸려 있지 않았다는 것이 그 기록의 결론입니다.

따라 하기: 커밋 직전 비밀값 검사

  • 자동 백업이 커밋하기 직전에 비밀값 검사기를 돌립니다. 걸린 파일만 이번 커밋에서 빼고 나머지는 평소대로 올립니다. 파일 하나 때문에 백업 전체를 멈추면 더 큰 사고가 납니다.
  • 검사기는 값을 절대 출력하지 않고 걸린 파일의 경로만 돌려줍니다.
  • 패턴은 키의 머리 글자만이 아니라 그 뒤에 이어지는 몸통 길이까지 요구합니다. 그래야 「이런 글자로 시작하는 키」를 설명한 문서가 잘못 걸리지 않습니다.
  • 진짜 비밀이 든 가짜 파일과 평범한 파일을 함께 넣어 대조군으로 시험합니다. 걸려야 할 것이 걸리고 지나가야 할 것이 지나가는지 둘 다 봅니다.

다른 조직의 자료도 같은 문으로 들어옵니다. 다른 조직의 총회 자료집 PDF를 텍스트로 뽑아 작업 폴더에 두었더니 자동 백업이 그대로 올렸습니다. 그 안에는 대의원 110명의 실명 명단과 재무제표 원문이 있었습니다. 무시 목록이 PDF 같은 바이너리 파일만 막고 있었기 때문입니다.

PDF를 텍스트로 바꾸는 순간 그 파일의 분류가 바뀝니다. 다른 조직의 명단과 재무 원문은 로컬 작업본으로만 두고, 게이트는 파일을 내려놓는 그 시점에 겁니다.

2. 배포 저장소에 둔 것은 전부 공개다

설계 문서를 사이트 배포 저장소에 커밋했더니 그 주소가 그대로 열렸습니다. 같은 규칙을 이미 적어 둔 뒤에 다시 난 일이었습니다. 배포 저장소에 새 파일을 만들 때는 「이것이 웹에 열려도 되는가」를 먼저 묻고, 같은 일이 두 번 나면 그때는 훅으로 막습니다.

정적 호스팅에서는 차단하려고 넣은 미들웨어 코드가 아예 실행되지 않을 수 있습니다. 한 사이트의 기록에 따르면 깃허브 페이지에 올린 서버 소스와 내부 문서 13개가 모두 열려 있었습니다. 차단은 발행 제외 설정으로 하고, 막혔는지는 코드를 읽지 말고 실제로 요청을 보내 확인합니다.

위키의 등급별 열람 게이트는 렌더되는 문서에만 걸립니다. 같은 폴더에 둔 문서의 백업 파일은 원래 경로 그대로 로그인 없이 나갔습니다. 문서 백업은 저장소 밖에 두고, 빌드 설정과 마지막 삭제 단계까지 세 겹으로 막습니다. 게이트가 필요한 PDF 같은 자산은 정식 게이트 폴더에 둡니다.

문서 머리의 「상태: 초안」 표시도 게이트가 아닙니다. 우리가 쓰는 정적 위키 빌드 도구는 초안 여부를 정해진 칸 하나로만 판단했고, 등급 칸이 빠진 문서는 공개로 빌드됐습니다. 그렇게 초안 19개가 협력 조직의 사업 구조를 담은 채 공개돼 있었습니다.

누출 1건을 고치면 같은 폴더와 같은 원인을 전부 뒤집니다. 한 건만 고치고 끝내면 옆에 같은 이유로 열린 문서가 남습니다.

3. 백업을 남의 기계에 두면 비밀도 같이 간다

클라우드 드라이브 전체를 내려받아 다른 사람이 쓰는 작업 PC에 옮긴 일이 있었습니다. 기록을 보면 그 백업 안에 서비스 계정 키, 로그인 연동용 비밀값, 갱신 토큰이 모두 10개 들어 있었고, 그 PC의 다른 계정이 실제로 읽을 수 있었습니다.

남의 기계로 백업을 옮기기 전에 비밀값 패턴으로 한 번 훑습니다. 이미 옮겼다면 비밀 파일 몇 개를 골라 빼는 것으로 끝내지 않고 디렉터리 권한으로 막습니다. 백업 전체가 개인 자료였기 때문입니다. 차단해야 할 자료와 돌아가야 할 서비스가 같은 디스크를 쓸 때는 경계를 한 층 아래에 긋습니다.

4. 검사기가 잘못 막으면 우회하지 말고 내용으로 푼다

한국 행정 문서의 법인등록번호 같은 식별번호는 주민등록번호나 계좌번호와 형식이 같아서 개인정보 검사기에 걸립니다. 공개해서 얻을 것이 없는 값이면 본문에서 뺍니다. 꼭 필요한 오탐만 패턴을 다듬어 풀고, 다듬은 뒤에도 진짜 키가 여전히 잡히는지 다시 시험합니다. 파일을 통째로 예외 처리하는 것은 맨 마지막 수단입니다.

도구 메모

  • 검사기 판정은 종료코드로: 걸리면 1, 깨끗하면 0. 출력은 경로만
  • 남의 기계로 옮기기 전 훑기: 확장자가 json, env, pem, key인 파일에서 비밀키·토큰 표지를 찾아 경로만 출력
  • 새 폴더를 만들면 그 폴더가 git 추적 대상인지, 배포 대상인지부터 확인

관련 노드