운영 중인 컨테이너 이미지에 CVE가 몇 개 박혀 있는지 마지막으로 확인해본 게 언제인가. Docker Scout 돌려보면 대부분 놀란다. node:20 공식 이미지 하나에 Low 이상 취약점이 20개 넘게 딸려 나오는 게 현실이다. Docker가 이 문제에 대해 꽤 과감한 카드를 꺼냈다.
1,000개 넘는 강화 이미지, Apache 2.0으로 전면 무료화
Docker Hardened Images(DHI)는 원래 유료 엔터프라이즈 기능이었다. Docker Business 구독자만 쓸 수 있었고, 가격도 만만치 않았다. 그런데 2025년 12월부터 이걸 통째로 Apache 2.0 라이선스로 풀어버렸다. Debian과 Alpine 기반으로 빌드된 1,000개 이상의 이미지가 Docker Hub에서 누구나 가져다 쓸 수 있다.
이게 왜 의미 있냐면, 기존에 distroless 이미지를 직접 만들어 쓰던 팀이라면 그 수고를 상당 부분 덜 수 있기 때문이다. Google의 distroless 프로젝트를 포크해서 커스텀하고, 패키지 하나 추가할 때마다 멀티스테이지 빌드를 손봐야 했던 그 과정. DHI는 그 결과물을 이미 만들어서 제공한다.
패키지 90% 줄이고, 취약점 95% 감소
숫자가 좀 과장처럼 들릴 수 있는데, 실제 비교 데이터를 보면 납득이 간다. 공식 Node.js 이미지 기준으로:
| 항목 | 공식 이미지 | DHI |
|---|---|---|
| 시스템 패키지 수 | ~289개 | ~29개 |
| Medium 이상 CVE | 1개 | 0개 |
| Low CVE | 24개 | 0개 |
패키지를 90% 줄였다는 건 단순히 용량 절감이 아니다. 컨테이너 안에 bash도 없고 curl도 없으니, 누군가 런타임에 침투해도 할 수 있는 게 극히 제한된다. exec로 셸 붙어서 이것저것 뒤지는 전형적인 포스트-익스플로잇 시나리오가 원천 차단되는 셈이다.
근데 디버깅은 어떻게 하냐고
여기서 항상 나오는 반론이 있다. "셸도 없는 이미지에서 장애 나면 어떻게 디버깅하냐?" 현실적인 걱정이다.
몇 가지 방법이 있다.
첫째, kubectl debug로 ephemeral container 붙이면 된다. K8s 1.25부터 stable이니까 대부분의 클러스터에서 쓸 수 있다. 디버그 컨테이너에는 원하는 도구를 다 넣어두면 되고, 프로덕션 이미지 자체는 깨끗하게 유지한다.
둘째, Docker Scout로 DHI와 기존 이미지를 나란히 비교할 수 있다. 뭐가 빠졌는지 한눈에 보이니까, 정말 필요한 바이너리가 있으면 멀티스테이지 빌드에서 복사해 넣으면 된다.
셋째, 로그와 메트릭에 더 투자한다. 어차피 컨테이너에 직접 들어가서 디버깅하는 건 안티패턴이다. OpenTelemetry 계측을 제대로 해놓으면 셸 접근 없이도 대부분의 문제를 진단할 수 있다.
SBOM과 SLSA — 공급망 보안의 기본기
DHI의 진짜 가치는 이미지 경량화만이 아니다. 모든 이미지에 서명된 SBOM(Software Bill of Materials)이 포함되고, 빌드 과정이 SLSA Build Level 3 provenance를 만족한다.
SLSA Level 3이 뭔지 간단히 짚으면, 빌드 프로세스가 격리된 환경에서 실행되고, 빌드 설정이 외부에서 변조 불가능하며, 출처 증명이 빌드 서비스에 의해 자동 생성된다는 뜻이다. 누군가 빌드 파이프라인 중간에 악성 코드를 끼워넣는 게 구조적으로 매우 어려워진다.
지난주 Trivy 공급망 공격 사건을 떠올려보면, 이런 기본기가 왜 중요한지 체감될 거다. 보안 도구 자체가 뚫리는 세상에서, 베이스 이미지라도 출처가 검증 가능해야 한다.
실무 마이그레이션 — 뭐부터 바꿀까
전체 이미지를 한꺼번에 바꿀 필요는 없다. 우선순위를 정하자.
외부 트래픽을 직접 받는 서비스부터 시작한다. API 게이트웨이, 웹 서버 같은 놈들. 공격 표면이 가장 넓으니까 경량화 효과도 크다. 내부 배치 잡이나 크론 워커는 나중에 해도 된다.
Dockerfile 변경은 의외로 간단하다:
# 기존
FROM node:20-slim
# DHI로 변경
FROM docker.io/docker/node:20-dhi
태그 컨벤션이 조금 다르니까 Docker Hub에서 확인하고 쓰면 된다. CI 파이프라인에서 Docker Scout 비교를 자동화해두면 전환 전후 취약점 변화를 리포트로 뽑을 수 있다.
한 가지 주의할 점. DHI 무료 버전은 업스트림 릴리스 주기를 따른다. 보안 패치가 더 빠르게 필요하거나, EOL 이후에도 지원이 필요하면 DHI Enterprise나 Extended Lifecycle Support를 따로 구매해야 한다. 규제 산업에 있다면 이 부분은 검토가 필요하다.
컨테이너 보안에 대해 "나중에 해야지" 하면서 미뤄왔다면, 베이스 이미지 교체가 가장 ROI 높은 첫 번째 스텝이다. 이제 무료니까 핑계도 없다.