-
[Docker][보안]Dockerfile ARG와 ENV에 비밀값을 넣으면 안 되는 이유기타개발지식/풀스택개발 2026. 6. 20. 14:05
IT 실무 리서치
[Docker][보안]Dockerfile ARG와 ENV에 비밀값을 넣으면 안 되는 이유
Dockerfile의 ARG와 ENV는 secret 저장소가 아니다. 빌드 중 private package를 설치해야 한다면 BuildKit secret mount로 필요한 순간에만 읽고, 이미 사용한 토큰은 노출 가능성을 전제로 폐기해야 한다.
1. 개요
Dockerfile에 `ARG NPM_TOKEN`이나 `ENV API_KEY=...`를 넣으면 빌드가 끝난 뒤에도 이미지 레이어, 빌드 로그, 캐시, 레지스트리에 흔적이 남을 수 있다. 멀티스테이지 빌드를 썼다고 자동으로 안전해지는 것도 아니다.
private package 설치처럼 빌드 중에만 필요한 값은 BuildKit secret으로 전달한다. 런타임 secret은 컨테이너 실행 환경에서 주입하고, Dockerfile에는 공개 설정값만 남긴다.
2. ARG와 ENV가 남기는 흔적
공식 문서에서 볼 지점은 secret mount가 빌드 중에만 값을 읽도록 설계됐다는 점이다. 전체 문서 캡처보다 이 차이를 코드로 재현하는 것이 더 중요하다.
문서 확인 후에는 Dockerfile을 직접 본다. 토큰처럼 회수해야 하는 값이 ARG/ENV에 있다면 설계부터 바꿔야 한다.
아래 캡처는 일부러 나쁜 예를 만든 것이다. 화살표로 표시해야 할 줄은 토큰 이름이 들어간 ARG와 그 값을 쓰는 RUN 명령이다. 파일을 열고 해당 줄을 확인한 뒤 바로 제거 대상을 표시한다.
토큰을 base64로 바꾸거나 변수명을 살짝 바꾸는 것은 해결이 아니다. 값이 회수되어야 하는 정보라면 Dockerfile의 빌드 변수에 넣지 않는다. 수정 후에는 다시 빌드하고 로그에 토큰 이름이 남는지 확인한다.
3. 나쁜 Dockerfile 재현
예제 값은 placeholder다. 실제 토큰, API key, private key, 계정 이메일은 Dockerfile, 블로그, 로그에 남기지 않는다.
실행 결과는 단순 경고로 넘기면 안 된다. 아래처럼 secret 이름이 ARG/ENV에 잡히면 이미지가 이미 레지스트리에 올라갔는지도 확인한다.
이미 빌드와 push가 끝난 토큰은 안전하다고 가정하지 않는다. token revoke 후 새 토큰을 secret store에서 주입하는 방식으로 바꾼다.
4. BuildKit secret으로 고치기
수정 흐름은 어렵지 않다. 박스와 화살표 순서대로 토큰이 필요한 단계만 좁히고, 그 단계에서만 secret mount를 사용한다. CI 설정 화면에서는 secret 이름을 입력하고 Dockerfile에서는 값이 아니라 파일 경로만 읽는다.
BuildKit secret은 빌드 컨텍스트에 파일을 넣는 방식과 다르다. `.env`나 인증서를 build context에 포함하지 않도록 `.dockerignore`도 같이 확인한다. 변경 후 `docker build --check`를 다시 실행한다.
이 방식은 빌드 중 필요한 줄에서만 secret을 읽는다. CI에서는 `npm_token` 값을 secret store에서 전달하고, Dockerfile에는 실제 값이 남지 않는다.
5. 이미 쓴 토큰 처리
이미 토큰을 ARG/ENV에 넣어 빌드했다면 코드 수정으로 끝내지 않는다. 네모 박스가 있는 첫 단계처럼 토큰을 먼저 폐기한다.
그 다음 레지스트리 접근 범위와 로그 보관 기간을 본다. 빌드 캐시를 공유하는 환경이라면 캐시 정리 정책도 같이 확인한다.
6. 결론
Dockerfile에는 공개 설정값만 남긴다. 회수해야 하는 값은 ARG와 ENV가 아니라 BuildKit secret, CI secret store, 런타임 secret으로 분리한다.
이미 토큰을 넣어 빌드했다면 Dockerfile 수정으로 끝내지 말고 토큰 폐기, 이미지 접근 범위, 로그와 캐시를 같이 확인한다.
7. 참고 링크
'기타개발지식 > 풀스택개발' 카테고리의 다른 글
[iOS][Privacy Manifest]Required Reason API 경고가 뜰 때 먼저 확인할 항목 (0) 2026.06.20 [Cloudflare Workers][비용]CPU time과 subrequests 제한을 배포 전에 확인하는 법 (0) 2026.06.20 [AWS][비용]EC2를 꺼도 요금이 나오는 항목을 EBS와 Public IPv4 기준으로 확인하기 (0) 2026.06.20 [GitHub][보안]Fine-grained PAT 만들 때 권한과 만료일을 어디까지 줄여야 하나 (0) 2026.06.20 [ChatGPT][업무자동화]Projects와 Custom GPT 차이를 실제 사용 기준으로 정리하기 (0) 2026.06.20