Featured image of post Docker 컨테이너 이미지 보안 모범 사례Featured image of post Docker 컨테이너 이미지 보안 모범 사례

Docker 컨테이너 이미지 보안 모범 사례

Docker 컨테이너 이미지를 보호하고 프로덕션의 취약성을 최소화하는 방법을 알아보세요.

최신 클라우드 네이티브 개발에서는 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. 요약

컨테이너 보안의 절대 규칙은 최소화입니다. 필요한 것만 제공하고 최소한의 권한으로 실행함으로써 외부 공격으로부터 프로덕션 워크로드를 보호합니다.