최신 클라우드 네이티브 개발에서는 Docker 컨테이너가 웹 애플리케이션 배포를 위한 기본 표준입니다.
그러나 일반 Dockerfile은 OS 취약점, 불필요한 도구 또는 루트 프로세스 권한이 포함된 이미지를 생성하는 경우가 많습니다. 이 가이드에서는 프로덕션용 Docker 컨테이너 이미지를 강화하기 위한 필수 모범 사례를 다룹니다.
1. 다단계 빌드 시행
최종 런타임 이미지 내에 빌드 도구, 컴파일러 캐시 또는 개발자 종속성(예: npm 또는 git)을 남겨두면 컨테이너 크기가 늘어나고 공격 표면이 넓어집니다.
다단계 빌드를 사용하면 전용 환경에서 바이너리를 컴파일한 다음 정적 아티팩트만 최소 런타임 레이어에 복사할 수 있습니다.
# Stage 1: Build Environment
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp main.go
# Stage 2: Final Secure Layer
FROM alpine:3.19
WORKDIR /app
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]
2. 컨테이너를 루트로 실행하지 마세요.
기본적으로 Docker 컨테이너 프로세스는 **루트(수퍼유저)**로 실행됩니다. 공격자가 코드 취약점을 악용하는 경우 기본 호스트 커널 및 파일 시스템에 대한 전체 액세스 권한을 얻을 수 있습니다.
Dockerfile 내에서 루트가 아닌 시스템 사용자를 선언하여 이 문제를 완화하세요.
# Create a dedicated system user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
CMD ["./myapp"]
3. 보안 기본 이미지 선택
전체 OS 배포판(예: Ubuntu)을 기반으로 설정하는 대신 가볍고 최소한의 기준선을 선택하세요.
- Alpine Linux(
-alpine): 작은 패키지 공간을 갖춘 최소 OS(약 5MB)로 보안 취약성을 줄입니다. - Distroless 이미지(Google): 패키지 관리자, 셸 및 터미널 도구를 완전히 제외하고 컴파일된 애플리케이션과 해당 런타임 종속성만 포함합니다.
4. 취약점 검색 통합(Trivy)
CI/CD 파이프라인(예: GitHub Actions) 중에 빌드된 이미지를 스캔하여 보안 감사를 자동화합니다.
**Trivy**을 사용하면 배포 전에 이미지에서 알려진 CVE를 검색할 수 있습니다.
# Auditing your local Docker image with Trivy
trivy image myapp:latest
5. 요약
컨테이너 보안의 절대 규칙은 최소화입니다. 필요한 것만 제공하고 최소한의 권한으로 실행함으로써 외부 공격으로부터 프로덕션 워크로드를 보호합니다.

