Docker

[Docker]#21 도커 보안 - 보안 모범 사례

TitediosKW 2024. 9. 4. 19:00
반응형

앞서 살펴봤듯 Docker는 애플리케이션을 컨테이너로 패키징하고 배포하는 도구로 현대 애플리케이션 개발에 매우 유용한 도구입니다. 그러나 컨테이너화된 환경에서 보안은 매우 중요합니다. 이 블로그 포스팅에서는 Docker 환경에서 보안을 강화하기 위한 모범 사례를 살펴보겠습니다. 이러한 방법을 통해 잠재적인 보안 위협으로부터 시스템을 보호할 수 있습니다.


목차

  1. 최신 버전의 Docker 사용
  2. 최소 권한 원칙 적용
  3. 이미지 신뢰성 검증
  4. 불필요한 기능 비활성화
  5. 이미지 크기 최소화
  6. distroless 이미지 사용
  7. 이미지 스캔 도구 사용
  8. 리소스 제한 설정
  9. Docker 네트워크 보안 강화
  10. 로그 및 모니터링 활성화
  11. 결론

1. 최신 버전의 Docker 사용

당연하게도 Docker 엔진과 관련 도구를 항상 최신 버전으로 유지하는 것이 중요합니다. 최신 버전에는 새로운 기능뿐만 아니라 보안 패치도 포함되어 있으므로, 주기적으로 업데이트하여 알려진 취약점으로부터 시스템을 보호해야 합니다. 특히, 중요 보안 패치가 있는 경우 업데이트를 필수적으로 수행해 보안 취약점을 해결하는 것이 중요합니다.

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

2. 최소 권한 원칙 적용

컨테이너에서 실행되는 프로세스에 최소한의 권한만 부여하는 것이 중요합니다. 기본적으로 Docker는 컨테이너를 루트 사용자로 실행합니다. 그러나 이는 보안상의 위험을 초래할 수 있습니다. 가능한 경우, 컨테이너 내부에서 루트 사용자가 아닌 일반 사용자로 애플리케이션을 실행하는 것이 좋습니다.

 

Dockerfile에서 사용자 설정:

# Dockerfile 예시
FROM node:14

# 사용자 추가
RUN useradd -m appuser
USER appuser

WORKDIR /app
COPY . .
CMD ["node", "app.js"]

3. 이미지 신뢰성 검증

Docker 이미지를 생성하거나 사용할 때는 항상 공식 이미지나 신뢰할 수 있는 소스에서 이미지를 가져와야 합니다. 신뢰할 수 없는 출처의 이미지를 사용하는 것은 악성 코드나 취약점을 포함할 위험이 있습니다. 대부분 docker hub에서 이미지를 가져와 사용자 정의 즉, 커스텀 이미지를 만드는 것을 추천합니다.

  • 공식 이미지 사용: 가능하면 Docker Hub의 공식 이미지를 사용합니다.
  • 이미지 서명 검증: Docker Content Trust(DCT)를 활성화하여 이미지의 서명을 검증할 수 있습니다.
반응형

4. 불필요한 기능 비활성화

Docker 컨테이너에서 사용하지 않는 기능이나 권한은 비활성화하는 것이 좋습니다. 예를 들어, 컨테이너가 호스트의 네트워크나 IPC 네임스페이스에 접근할 필요가 없다면, 이를 명시적으로 제한해야 합니다. 기능을 제한함으로써 우리가 사용하는 기능은 문제없이 사용이 가능하지만 취약점이 될 수 있는 기능들은 제한되므로 해커의 공격이나 의도치 않은 동작을 미연에 방지할 수 있습니다.

  • 네트워크 모드 설정: 네트워크 접근이 불필요한 경우 --network=none 옵션을 사용합니다.
  • 캡스드롭 사용: 불필요한 Linux 기능을 제거하여 공격 표면을 줄일 수 있습니다.
 

Running containers

Running and configuring containers with the Docker CLI

docs.docker.com

 

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-container

5. 이미지 크기 최소화

이미지 크기를 줄이면 공격 표면도 줄어듭니다. 작은 이미지일수록 포함된 소프트웨어와 라이브러리가 적어 관리와 보안이 용이합니다. 이를 위해 여러 단계로 구성된 멀티스테이지 빌드를 사용하여 최종 이미지를 최적화할 수 있습니다.

# Dockerfile 예시
FROM golang:alpine as builder
WORKDIR /app
COPY . .
RUN go build -o myapp

FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]

6. distroless 이미지 사용

애플리케이션과 해당 런타임 종속성만 포함하는 distroless 이미지를 사용할 수도 있습니다. 이런 이미지는 패키지 관리자 또는 셸을 포함하지 않습니다. 위의 이미지 크기 최소화와 관련한 것과 유사하게 동작합니다.

  • distroless 이미지(디스트로리스 이미지): 애플리케이션을 실행하는 데 필요한 최소한의 런타임과 라이브러리만 포함하는 이미지
############################
# STEP 1 build executable binary
############################
FROM golang:alpine AS builder
# Install git.
# Git is required for fetching the dependencies.
RUN apk update && apk add --no-cache git
WORKDIR $GOPATH/src/mypackage/myapp/
COPY . .
# Fetch dependencies.
# Using go get.
RUN go get -d -v
# Build the binary.
RUN go build -o /go/bin/hello

############################
# STEP 2 build a small image
############################
FROM scratch
# Copy our static executable.
COPY --from=builder /go/bin/hello /go/bin/hello
# Run the hello binary.
ENTRYPOINT ["/go/bin/hello"]

2 단계로 빌드를 함으로써 최종적인 이미지에는 빌드 도구 및 기타 불필요한 바이너리가 없는 컨테이너 이미지를 생성합니다. 빌드 도구 및 기타 불필요한 바이너리가 없는 컨테이너 이미지는 이미지의 공격 표면을 줄여 보안 태세를 향상합니다.


7. 이미지 스캔 도구 사용

컨테이너 이미지에 취약점이 포함되어 있는지 확인하려면 이미지 스캔 도구를 사용해야 합니다. 이를 통해 이미지 빌드 시점에 잠재적인 취약점을 탐지하고, 수정할 수 있습니다.

  • Clair: CoreOS에서 제공하는 이미지 취약점 스캐너
  • Anchore: 이미지를 분석하고 보안 정책을 적용하는 도구
  • Trivy: 간편한 이미지 취약점 스캐너

8. 리소스 제한 설정

컨테이너의 리소스를 제한하여 악의적인 코드가 호스트 시스템의 자원을 과도하게 사용하지 못하도록 해야 합니다. Docker는 CPU, 메모리, IO 등의 리소스 사용량을 제한할 수 있는 옵션을 제공합니다. 컨테이너를 실행할 때 옵션으로 컨테이너에 할당할 리소스를 제한할 수 있습니다.

docker run --memory=512m --cpus="1.0" my-container

9. Docker 네트워크 보안 강화

Docker 네트워크 설정을 통해 컨테이너 간의 불필요한 통신을 제한할 수 있습니다. 네트워크 분리를 통해 중요한 서비스가 외부로부터 노출되지 않도록 구성해야 합니다.

  • 네트워크 분리: 컨테이너를 별도의 사용자 정의 네트워크에 배치하여 외부로부터 격리합니다.
  • 방화벽 설정: iptables와 같은 방화벽 도구를 사용하여 네트워크 트래픽을 제어합니다.
docker network create --driver bridge isolated_network
docker run --network=isolated_network my-container

10. 로그 및 모니터링 활성화

보안 사고를 조기에 탐지하고 대응할 수 있도록, Docker 컨테이너의 로그와 메트릭스를 모니터링해야 합니다. 이를 통해 비정상적인 활동을 파악하고 즉각적인 조치를 취할 수 있습니다. 흔히 애플리케이션이나 서비스를 운영할 때 로그기반으로 모니터링을 하는 것과 같은 보안활동입니다.

  • ELK 스택: Elasticsearch, Logstash, Kibana를 사용하여 로그를 수집, 저장 및 시각화합니다.
  • Prometheus 및 Grafana: 컨테이너 메트릭스를 모니터링하고 알림을 설정합니다.

결론

Docker 보안을 강화하는 것은 복잡하지만 필수적인 작업입니다. 위에서 언급한 모범 사례를 준수함으로써, 컨테이너 환경에서 발생할 수 있는 보안 위협을 크게 줄일 수 있습니다. 항상 최신 상태를 유지하고, 정기적으로 보안 설정을 검토하여 안전한 컨테이너화된 애플리케이션을 개발 또는 운영한다면 해커의 침입 등으로 여러분의 서비스가 망가지는 것을 미연에 방지할 수 있습니다.


도움이 되셨다면 공감 부탁드리겠습니다. 여러분의 공감이 정말 큰 힘이 됩니다.


감사합니다!

반응형