Docker는 매우 편리한 컨테이너 플랫폼이지만, 기본 상태로는 보안상 취약한 부분이 있습니다. 이 글에서는 도커 보안에 대해 실전에서 반드시 알아야 할 네 가지 고급 보안 기법을 상세하게 설명합니다.


📑 목차

  1. 루트리스 도커 (Rootless Docker)
  2. Docker Content Trust (이미지 서명)
  3. AppArmor (컨테이너 권한 제한)
  4. TLS/SSH로 Docker 데몬 보호하기
  5. 🧩 마무리: 도커 보안을 위한 태도

1. 루트리스 도커 (Rootless Docker)

🔍 개요

기존 Docker는 데몬(dockerd)이 루트(root) 권한으로 실행되므로, 악성 컨테이너가 시스템 전체를 제어할 수 있습니다. Rootless Docker는 일반 사용자 권한으로 실행되어 보안성을 높여줍니다.

✅ 장점

  • 루트 권한을 요구하지 않음 → 시스템 안전성 증가
  • 다른 사용자 또는 시스템 전체에 영향을 주기 어려움

⚙️ 주의사항

  • 루트 권한 없이 실행되므로, 1024번 미만 포트(예: 80, 443)는 바인딩 불가 → 8080:80과 같이 높은 포트를 사용해야 함

🧪 예제

# 루트리스 도커 환경에서 실행
docker run -d -p 8080:80 nginx

위 명령은 호스트의 8080 포트를 컨테이너의 80 포트와 연결합니다. 브라우저에서 http://localhost:8080 접속 시 Nginx 환영 페이지를 확인할 수 있습니다.

🔧 설치 방법

curl -fsSL https://get.docker.com/rootless | sh

설치 후 .bashrc 또는 .zshrc에 환경변수를 추가해야 하고, systemctl --user enable docker 로 사용자 단위로 도커를 실행합니다.

사용자 계정에서 실행해야 합니다 (root 아님!)
설치가 완료되면 .bashrc에 환경변수를 추가하라고 안내해줍니다.
설치 위치는 보통 ~/.docker 아래에 루트리스용 도커가 깔립니다.
기존 도커(루트 모드)와는 별도로 실행됩니다.


2. Docker Content Trust (이미지 서명)

🔐 개요

Docker Content Trust (DCT)는 이미지가 서명되었는지 검증하는 기능으로, 신뢰되지 않은 이미지 실행을 막아줍니다.

✅ 핵심 동작 방식

  • DOCKER_CONTENT_TRUST=1 설정 시, 서명되지 않은 이미지는 pull, run, push 불가

🧪 예제

# 서명 기능 활성화
export DOCKER_CONTENT_TRUST=1

# 이미지 서명 후 푸시
docker trust sign [레지스트리 주소]/[이미지 이름]:[태그]
docker trust sign registry.example.com/myapp:1.0

docker push registry.example.com/myapp:1.0

# 실행 시에도 서명이 없으면 실패
docker run registry.example.com/myapp:1.0

💡 docker trust sign은 개인 키로 이미지를 서명하며, Notary 서버가 필요합니다.

❗ 주의사항

  • Docker Hub의 공식 이미지는 대부분 서명되어 있지 않습니다. → 개인 Registry에서 사용하는 것이 일반적입니다.

3. AppArmor (컨테이너 권한 제한)

🔍 개요

AppArmor는 리눅스 보안 모듈로, 특정 프로세스(여기서는 Docker 컨테이너)의 파일, 네트워크, 시스템 콜 사용을 제한합니다.

✅ 주요 특징

  • 컨테이너가 시스템 리소스에 접근하는 범위를 세밀하게 제어
  • 커널 수준에서 실행되므로 우회가 어렵습니다

🔧 기본 사용법

  1. 프로파일 작성: /etc/apparmor.d/containers/docker-nginx
profile docker-nginx flags=(attach_disconnected) {   #docker-nginx는 AppArmor 프로파일
  # 기본 권한
  # 읽기, 실행만 허용 (쓰기 금지)
  file,

  # 네트워크 제한
  network inet,
  deny network raw,

  # 특정 실행 파일 허용
  /usr/sbin/nginx ix,

  # capability 제한 (예: 포트 바인딩)
  capability net_bind_service,
}
  1. 프로파일 등록
sudo apparmor_parser -r /etc/apparmor.d/containers/docker-nginx
  1. 컨테이너 실행 시 적용
docker run --rm -d \
  --security-opt apparmor=docker-nginx \
  --name secure-nginx \
  -p 8080:80 nginx

컨테이너가 /usr/sbin/nginx 외의 실행 파일을 사용하거나 raw socket을 쓰면 실행이 제한됩니다.

📌 확인 명령

sudo aa-status | grep docker-nginx

4. TLS/SSH로 Docker 데몬 보호하기

🔐 개요

Docker 데몬은 강력한 권한을 가지므로, 외부에서 접근할 경우 반드시 안전한 방식으로 접근해야 합니다. TLS 또는 SSH를 통해 보안 통신을 구성할 수 있습니다.

✅ SSH로 원격 접근 (비밀번호 없이 안전하게)

# 도커 컨텍스트 생성

docker context create \
  --docker host=ssh://user@remote-host \
  ssh-remote

# 해당 컨텍스트로 전환

docker context use ssh-remote

docker ps

이 방식은 SSH 키 인증을 사용하며 별도 포트 개방 없이도 안전하게 원격 도커 데몬에 접속할 수 있습니다.

✅ TLS로 보안 설정 (CA 인증 필요)

1) 인증서 구성 흐름

  • CA 인증서 생성 → 서버/클라이언트 인증서 발급
  • 도커 데몬 TLS로 실행
  • 클라이언트 인증서로 접속

2) 도커 데몬 실행 예시

dockerd \
  --tlsverify \
  --tlscacert=/etc/docker/ca.pem \
  --tlscert=/etc/docker/server-cert.pem \
  --tlskey=/etc/docker/server-key.pem \
  -H=0.0.0.0:2376

3) 클라이언트 접속 예시

export DOCKER_HOST=tcp://remote-host:2376
export DOCKER_TLS_VERIFY=1

docker --tlsverify \
  --tlscacert=ca.pem \
  --tlscert=cert.pem \
  --tlskey=key.pem \
  info

5. 🧩 마무리: 도커 보안을 위한 태도

도커는 편리하지만, 기본값은 안전하지 않습니다. 직접 보안 설정을 적용해야 실전 환경에서도 안전하게 운영할 수 있습니다.

🧷 요약 정리

기능목적주요 효과
루트리스 Docker루트 권한 제거시스템 전체 보호
Docker Content Trust이미지 검증신뢰된 이미지만 실행
AppArmor리소스 제한침해 범위 최소화
TLS/SSH 접근데몬 보호안전한 원격 제어

👉 참고 문서:

0개의 댓글