[CKS] 28. Docker Securing the Daemon

도커 데몬 원격 접속 시 발생할 수 있는 보안 위협을 방지합니다. TLS 인증으로 트래픽을 암호화하고 허가된 사용자만 접속을 제어하여 시스템과 데이터를 안전하게 보호할 수 있습니다.

[CKS] 28. Docker Securing the Daemon
Photo by Kaffeebart / Unsplash

개요

Docker Daemon을 보호하는 방법과 데몬에 대한 보안을 수행해야하는 이유를 설명합니다.

Docker 데몬을 해킹한다면

  • 애플리케이션 삭제로 인한 서비스 중단 및 데이터 손실
  • 악성 컨테이너 및 호스트 시스템 네트워크 손상

기본적으로 Docker API는 Unix 소켓에 바인딩되어 엑세스를 제한하고 있습니다.

내부의 인터폰처럼 내부 프로세스들끼리만 통신하는 유닉스 소켓을 구성하며 /var/run/docker.sock 파일 형태로 존재합니다. 이는 기본적으로 root 사용자나 docker 그룹에 속한 사용자만 /var/run/docker.sock 파일에 접근(읽기/쓰기)할 수 있는 권한을 가지며 자연스럽게 네트워크 혹은 권한이 없는 일반 사용자에게는 접속이 허가되지 않습니다.

Docker host 보안

하지만 외부 연결을 허용하는 경우 host에 대한 보안 조치를 수행해야하는데 이는 다음과 같은 체크리스트가 존재합니다.

  • 루트 사용자 로그인을 비활성화합니다.
  • 신뢰할 수 있는 사용자로 접근 제어를 수행합니다.
  • SSH key 기반 인증을 사용합니다.
  • 사용하지 않는 네트워크나 포트는 제한합니다.

Docker 데몬 expose

여러 시나리오에서는 Docker 데몬에 대한 외부 엑세스를 허용하곤 합니다.

앞선 자료를 통해 정리했듯이 hosts 옵션을 추가하여 수정하는데, 각 접속 위치에 따라 host ip를 추가합니다.

  • Port Well-known 2375
{
  "hosts": [ "tcp://<HOST_IP>:2375" ]
}

TLS

일반적으로 권장되는 방식은 다음과 같습니다.

  1. CA 설정과 서버 인증서(server.pem / serverkey.pem)을 생성합니다.
  2. TLS를 활성화하고 포트를 변경하거나 숨깁니다.

인증서를 소유한 클라이언트로만 제한하기 위해선 tlsverify 옵션을 활성화합니다.

  • Client는 client.pem , client-key.pem , cacert.pem 을 소유해야합니다.
  • 아래 명령어와 같이 등록합니다.
docker --tlscert=<path_to_cert> --tlskey=<path_to_key> --tlscacert=<path_to_ca_cert> ps

서버 구성은 다음과 같습니다.

{
  "hosts": ["tcp://<HOST_IP>:2376"],
  "tls": true,
  "tlscert": "/var/docker/server.pem",
  "tlskey": "/var/docker/serverkey.pem",
  "tlsverify": true,
  "tlscacert": "/var/docker/cacert.pem"
}

TLS는 트래픽 암호화를 보장하지만, 클라이언트 인증을 자체적으로 강제하지는 않는다는 점을 주의해야합니다.