Contents
see List개요
컨테이너 기술이 보편화되면서 보안 이슈도 중요한 화두가 되었습니다. 기본 Docker 설정에서 컨테이너는 root 권한의 데몬에 의해 관리되며, 컨테이너 탈출(escape) 공격이 성공하면 호스트 시스템 전체가 위험해집니다. rootless 컨테이너와 Podman은 이러한 근본적인 보안 문제를 해결하기 위한 접근법입니다. 이 글에서는 rootless Docker 설정 방법, Podman으로의 전환, 그리고 컨테이너 보안 강화 실전 기법을 다룹니다.
핵심 개념
rootless 컨테이너: 컨테이너 런타임이 일반 사용자 권한으로 실행됩니다. 컨테이너 내부에서 root처럼 보이지만 실제로는 user namespace를 통해 호스트의 일반 사용자로 매핑됩니다.
Podman: Red Hat이 개발한 daemonless 컨테이너 엔진입니다. Docker CLI와 호환되면서도 root 데몬이 필요 없으며, systemd와 자연스럽게 통합됩니다.
User Namespace: 컨테이너 내부의 UID/GID를 호스트의 다른 UID/GID로 매핑하는 Linux 커널 기능입니다. 컨테이너의 root(UID 0)를 호스트의 일반 사용자(예: UID 100000)로 매핑하여 권한 상승을 방지합니다.
seccomp/AppArmor: 컨테이너가 사용할 수 있는 시스템 콜을 제한하여 공격 표면을 줄입니다. Docker는 기본 seccomp 프로파일을 적용하지만, 커스텀 프로파일로 더욱 강화할 수 있습니다.
실전 예제
rootless Docker 설정입니다.
# rootless Docker 설치 (기존 Docker와 공존 가능)
dockerd-rootless-setuptool.sh install
# 환경 변수 설정
echo 'export PATH=/usr/bin:$PATH' >> ~/.bashrc
echo 'export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock' >> ~/.bashrc
source ~/.bashrc
# rootless 모드 확인
docker info | grep -i "root"
# 출력: rootless: true
# systemd 사용자 서비스로 관리
systemctl --user start docker
systemctl --user enable docker
# 로그아웃 후에도 유지
loginctl enable-linger $(whoami)
Podman으로의 전환과 활용입니다.
# Podman 설치 (Ubuntu)
sudo apt install podman
# Docker 호환 명령 (그대로 사용 가능)
podman pull nginx:alpine
podman run -d --name web -p 8080:80 nginx:alpine
podman ps
podman logs web
# rootless 자동 (별도 설정 불필요)
podman info | grep rootless
# Podman으로 compose 사용
pip install podman-compose
podman-compose up -d
# systemd 서비스 생성 (Podman 고유 기능)
podman generate systemd --new --name web > ~/.config/systemd/user/container-web.service
systemctl --user daemon-reload
systemctl --user enable --now container-web
컨테이너 보안 강화 설정입니다.
# 읽기 전용 루트 파일시스템
podman run --read-only --tmpfs /tmp nginx:alpine
# capabilities 제한
podman run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx:alpine
# 메모리/CPU 제한
podman run --memory=256m --cpus=0.5 nginx:alpine
# 보안 스캔 (Trivy 활용)
brew install trivy # 또는 apt/dnf
trivy image nginx:alpine
trivy image --severity HIGH,CRITICAL myapp:latest
# no-new-privileges 플래그
podman run --security-opt=no-new-privileges nginx:alpine
활용 팁
- 이미지 최소화: Alpine이나 distroless 이미지를 베이스로 사용하면 공격 표면이 크게 줄어듭니다. 불필요한 쉘이나 도구가 없으면 공격자도 할 수 있는 것이 제한됩니다.
- multi-stage 빌드: 빌드 도구가 최종 이미지에 포함되지 않도록 multi-stage Dockerfile을 사용하세요.
- 이미지 서명: cosign으로 컨테이너 이미지에 서명하고, 서명된 이미지만 배포하는 정책을 적용하세요.
- 네트워크 격리: 기본 bridge 네트워크 대신 사용자 정의 네트워크를 생성하여 컨테이너 간 통신을 제한하세요.
- 정기 업데이트: Renovate Bot이나 Dependabot으로 베이스 이미지 업데이트를 자동화하면 알려진 취약점을 빠르게 패치할 수 있습니다.
마무리
rootless 컨테이너와 Podman은 컨테이너 보안의 근본적인 개선을 가져왔습니다. Docker에서 Podman으로의 전환은 CLI 호환성 덕분에 비교적 쉬우며, rootless 모드와 systemd 통합은 서버 운영에서 큰 이점을 제공합니다. 이미지 스캔, capabilities 제한, 읽기 전용 파일시스템 등의 기법을 조합하면 프로덕션 수준의 컨테이너 보안을 달성할 수 있습니다.