
API 키, DB 비밀번호, 클라우드 자격증명 같은 비밀값(시크릿) 유출은 침입이 아니라 실수로 시작되는 경우가 대부분입니다. 그리고 그 실수는 거의 늘 배포 파이프라인 어딘가에서 일어납니다. 점검하면서 반복해서 본 다섯 경로와, 각각을 막는 현실적인 방법을 정리했습니다.

1. 소스 저장소에 커밋된 키
가장 흔하고 가장 오래 남는 경로입니다. .env 파일, 서비스 계정 JSON, 테스트용으로 넣어 둔 하드코딩 키. 한 번 커밋되면 삭제 커밋을 해도 이력에 남습니다. 막는 법은 두 겹입니다. 커밋 전에 시크릿 패턴을 잡는 훅(pre-commit)을 두고, 저장소 전체 이력을 주기적으로 스캔합니다. 전체 이력 스캔은 처음 돌릴 때 생각보다 많이 나옵니다. 나온 것은 지우는 게 아니라 폐기·교체합니다.
2. CI 로그에 찍힌 환경변수
디버깅하느라 set -x 를 켜 두거나 env 를 출력한 스크립트가 그대로 남아, CI 로그 열람 권한이 있는 모든 사람에게 키가 보이는 경우입니다. CI 도구의 마스킹 기능을 쓰되 마스킹은 '등록된 값'만 가리므로, 파생된 값(인코딩·조합)은 새어 나갑니다. 로그 보존 기간을 줄이고, 로그 열람 권한을 배포 권한과 분리합니다.
3. 컨테이너 이미지에 구워진 비밀값
빌드 인자(ARG)나 빌드 단계의 COPY 로 들어간 키는 이미지 레이어에 남습니다. 이미지를 레지스트리에 올리는 순간 그 레지스트리를 볼 수 있는 모두에게 공개된 것과 같습니다. 비밀값은 런타임에 주입합니다 — 시크릿 매니저에서 읽거나 파일로 마운트합니다. 그리고 이미지 레이어를 스캔하는 단계를 파이프라인에 넣어 빌드 시점에 잡습니다.
4. 개발·스테이징 환경에 재사용된 운영 키
"급해서" 운영 키를 개발 환경에 복사해 쓰기 시작하면, 보안 수준이 가장 낮은 환경이 운영 권한을 갖게 됩니다. 환경마다 키를 분리하고, 개발 환경 키는 권한을 읽기·샌드박스로 최소화합니다. 키 이름에 환경을 넣어(prod-, dev-) 섞이면 눈에 띄게 합니다.
5. 사람에게 묶인 장기 토큰
퇴사자나 외주 개발자가 발급받은 개인 액세스 토큰이 CI 에 그대로 쓰이는 경우입니다. 그 사람이 떠나도 토큰은 살아 있고, 누가 쓰는지 아무도 모릅니다. 토큰에는 만료를 두고, 서비스 계정 토큰으로 바꾸며, '어느 토큰이 어디에 쓰이는가' 목록을 유지합니다.
이미 샜다면 — 그날 안에

순서가 중요합니다. 저장소에서 지우는 것은 넷째입니다. 첫째는 언제나 폐기·교체입니다. 지운 뒤에도 포크, 로컬 클론, CI 캐시 어딘가에 남아 있다고 가정해야 합니다.

마무리
완벽한 금고를 만드는 것보다, 비밀값이 짧게 살고 자동으로 바뀌게 하는 쪽이 현실적입니다. 다섯 경로 가운데 하나라도 오늘 막으면 그만큼 사고 확률이 줄어듭니다. 저장소 전체 이력 스캔 한 번이 가장 좋은 출발점입니다.
댓글