컨테이너는 빠르고 가볍지만, 그 가벼움이 곧 보안 책임의 분산을 뜻합니다. 베이스 이미지의 오래된 라이브러리, 과도한 권한, 노출된 시크릿 등 빈틈은 여러 단계에 흩어져 있습니다. 보안은 한 곳을 막는 게 아니라 빌드부터 런타임까지 층층이 막는 다층 방어(defense in depth)여야 합니다.
운영 문제: 공격면은 이미지에서 시작된다
많은 사고가 이미지 단계에서 시작됩니다. 거대한 베이스 이미지에는 수백 개의 패키지가 들어 있고, 그중 하나의 알려진 취약점(CVE)이 침투 경로가 됩니다. 실측해 보면 풀 OS 기반 이미지는 distroless나 슬림 이미지 대비 알려진 취약점이 5배 이상 많은 경우가 흔합니다.
단계별 방어
- 빌드: 최소 베이스 이미지, 의존성 고정, 이미지 취약점 스캔
- 배포: 신뢰된 레지스트리만 허용, 이미지 서명 검증
- 런타임: 비루트 실행, 읽기 전용 파일시스템, 권한 최소화
- 네트워크: NetworkPolicy로 파드 간 통신 화이트리스트화
구현: 안전한 컨테이너의 기본기
컨테이너가 루트로 실행되면 탈출 시 호스트 전체가 위험해집니다. 비루트 사용자와 권한 축소는 가장 비용 대비 효과가 큰 조치입니다.
securityContext:
runAsNonRoot: true
runAsUser: 10001
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]시크릿은 절대 이미지나 환경 변수에 평문으로 넣지 말고, 시크릿 매니저에서 런타임에 주입해야 합니다. 한 번 이미지 레이어에 박힌 시크릿은 삭제해도 히스토리에 남아 유출됩니다.
모니터링: 런타임 이상 탐지
아무리 막아도 실행 중 비정상 행위는 발생할 수 있습니다. 컨테이너가 갑자기 셸을 띄우거나 예상치 못한 외부로 연결을 시도하면 런타임 보안 도구가 이를 탐지해 경보합니다. 빌드 시점 스캔과 런타임 탐지를 함께 두어야 알려진 위협과 알려지지 않은 위협 모두를 커버할 수 있습니다.
정리
컨테이너 보안에 은탄환은 없습니다. 최소 이미지, 비루트 실행, 시크릿 분리, 네트워크 격리, 런타임 탐지를 층층이 쌓아야 한 겹이 뚫려도 다음 겹이 막습니다. 보안을 배포 후의 점검이 아니라 파이프라인에 내장된 게이트로 만드는 것이 핵심입니다.