[CKS] Docker Securing the Daemon

Docker 데몬의 외부 노출 시 TLS 및 mTLS 암호화 통신을 통해 보안을 강화하고, 클라이언트 인증서로 상호 인증을 구현하여 Kubernetes 보안을 확보하는 방법입니다.

[CKS] Docker Securing the Daemon
Photo by rc.xyz NFT gallery / Unsplash

개요

CKS 시험 만료가 얼마 남지않아 다시 시작하고 있습니다.

Certified Kubernetes Security Specialist (CKS) | KodeKloud

보안 설정 없는 Docker Daemon

기본적으로 Docker는 Docker API를 Unix 소켓에 바인딩합니다. 이로써 외부 접근을 차단하고 호스트에 로그인한 사용자만 접근할 수 있게 제한합니다. 하지만 외부에서 접근해야한다면 추가적인 보안 조치가 필요합니다.

만약 보안조치 없이 외부 악의적인 사용자가 접근한다면 원격지의 컴퓨터를 탈취 당한 것과 유사합니다.

  • 애플리케이션을 호스팅하는 컨테이너를 삭제하여 서비스 중단 발생
  • 중요 애플리케이션 데이터가 저장된 Docker 볼륨을 삭제하면 데이터 손실이 발생
  • 호스트 시스템 및 기타 네트워크 장치를 손상시키기 위해 액세스 권한을 조정하여 자체 컨테이너를 실행

따라서 Docker 데몬의 외부 연결을 허용하려면 추가적인 보안 조치를 구현하는 것이 중요합니다.

Docker 호스트 보안 설정

표준 서버 보안 강화 절차는 다음과 같습니다.

  • 루트 사용자의 직접 로그인 비활성화
  • 신뢰할 수 있는 사용자에게만 접근 권한 부여
  • 비밀번호 기반 인증 대신 SSH 키 기반 인증 사용
  • 사용하지 않는 네트워크 포트 제한하거나 차단

해당 구성을 어떻게 설정할 수 있을지 정리했습니다.

Docker 데몬을 외부로 노출하기

Docker 데몬을 외부에 노출하기 위한 TLS 암호화 통신 구성입니다.

서버는 CA(인증기관)을 설정하고 server.pem , serverkey.pem , cacert.pem 을 생성해야합니다.

설정하면 TLS 기반의 암호화 통신을 수행할 수 있습니다. 하지만 통신의 암호화를 보장할 뿐, 클라이언트의 인증이 없으므로 누구나 접근하여 악의적인 코드를 수행할 수 있게 됩니다.

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

따라서 mTLS 통신을 위해 tlsverify를 활성화하고, 클라이언트에게 세 가지 파일을 제공해야 합니다.(mTLS)

  • client.pem → 클라이언트의 인증서(client 공개 키 + CA 개인키 서명)
  • client-key.pem → 클라이언트의 개인키
  • cacert.pem → CA의 공개키

<mTLS(참고)>

  • 서버가 사용자에게 server.pem 을 전달합니다.
  • 사용자는 cacert.pem을 통해 인증서를 검증하고 서버에게 랜덤 데이터의 개인키 서명을 요구합니다.
  • 서버는 본인의 serverkey.pem으로 서명 후 전송하고 클라이언트는 server.pem으로 검증합니다.
  • 데이터 검증이 완료되었다면 클라이언트도 동일한 로직을 수행합니다.
  • 최종적으로 CA를 통해 인증되었다는 것을 양쪽 다 확인하면 통신이 시작됩니다.