Docker는 매우 편리한 컨테이너 플랫폼이지만, 기본 상태로는 보안상 취약한 부분이 있습니다. 이 글에서는 도커 보안에 대해 실전에서 반드시 알아야 할 네 가지 고급 보안 기법을 상세하게 설명합니다.
기존 Docker는 데몬(dockerd)이 루트(root) 권한으로 실행되므로, 악성 컨테이너가 시스템 전체를 제어할 수 있습니다. Rootless Docker는 일반 사용자 권한으로 실행되어 보안성을 높여줍니다.
# 루트리스 도커 환경에서 실행
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 아래에 루트리스용 도커가 깔립니다.
기존 도커(루트 모드)와는 별도로 실행됩니다.
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 서버가 필요합니다.
AppArmor는 리눅스 보안 모듈로, 특정 프로세스(여기서는 Docker 컨테이너)의 파일, 네트워크, 시스템 콜 사용을 제한합니다.
/etc/apparmor.d/containers/docker-nginxprofile docker-nginx flags=(attach_disconnected) { #docker-nginx는 AppArmor 프로파일
# 기본 권한
# 읽기, 실행만 허용 (쓰기 금지)
file,
# 네트워크 제한
network inet,
deny network raw,
# 특정 실행 파일 허용
/usr/sbin/nginx ix,
# capability 제한 (예: 포트 바인딩)
capability net_bind_service,
}
sudo apparmor_parser -r /etc/apparmor.d/containers/docker-nginx
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
Docker 데몬은 강력한 권한을 가지므로, 외부에서 접근할 경우 반드시 안전한 방식으로 접근해야 합니다. TLS 또는 SSH를 통해 보안 통신을 구성할 수 있습니다.
# 도커 컨텍스트 생성
docker context create \
--docker host=ssh://user@remote-host \
ssh-remote
# 해당 컨텍스트로 전환
docker context use ssh-remote
docker ps
이 방식은 SSH 키 인증을 사용하며 별도 포트 개방 없이도 안전하게 원격 도커 데몬에 접속할 수 있습니다.
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
export DOCKER_HOST=tcp://remote-host:2376
export DOCKER_TLS_VERIFY=1
docker --tlsverify \
--tlscacert=ca.pem \
--tlscert=cert.pem \
--tlskey=key.pem \
info
도커는 편리하지만, 기본값은 안전하지 않습니다. 직접 보안 설정을 적용해야 실전 환경에서도 안전하게 운영할 수 있습니다.
| 기능 | 목적 | 주요 효과 |
|---|---|---|
| 루트리스 Docker | 루트 권한 제거 | 시스템 전체 보호 |
| Docker Content Trust | 이미지 검증 | 신뢰된 이미지만 실행 |
| AppArmor | 리소스 제한 | 침해 범위 최소화 |
| TLS/SSH 접근 | 데몬 보호 | 안전한 원격 제어 |
👉 참고 문서: