[CKS] 28. Docker Securing the Daemon
도커 데몬 원격 접속 시 발생할 수 있는 보안 위협을 방지합니다. TLS 인증으로 트래픽을 암호화하고 허가된 사용자만 접속을 제어하여 시스템과 데이터를 안전하게 보호할 수 있습니다.
개요
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
일반적으로 권장되는 방식은 다음과 같습니다.
- CA 설정과 서버 인증서(
server.pem
/serverkey.pem
)을 생성합니다. - 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는 트래픽 암호화를 보장하지만, 클라이언트 인증을 자체적으로 강제하지는 않는다는 점을 주의해야합니다.