관리 메뉴

IT창고

Docker SSL / TLS 적용 본문

서버운영/Virtualization

Docker SSL / TLS 적용

방구석여포 2021. 2. 1. 00:06

Docker Daemon에 SSL / TLS 적용에 대해 알아보도록 하겠습니다.

 

테스트 환경은 CentOS 7.9, RAM 1GB, Docker Engine CE Version 20.10.2 입니다. 

도커 설치 방법은 아래의 링크에서 확인가능 합니다.

2021/01/28 - [서버운영/Virtualization] - Docker 설치 (CentOS)

 

 

도커 데몬에 적용시킬 인증서는 CentOS 7에 있는 OpenSSL를 통해 사설인증서를 만들어보도록 하겠습니다.

CA(Certificate Authority)파일부터 만들어 보도록 하겠습니다. 

openssl genrsa -aes256 -out gsk-ca-key.pem 4096

위와 같이 파일 이름을 정하고 사용할 패스워드를 두 번 입력해주면 키 파일이 생성됩니다. 

 

openssl req -new -x509 -days 365 -key gsk-ca-key.pem -sha256 -out ca.pem

키파일을 생성하였다면 위와 같이 ca파일을 생성하도록 합니다. 

Common Name만 해당 테스트 서버의 호스트이름으로 작성하였으며 그 외에는 KR로 넘기도록 하겠습니다.  

위와 같이 ca.pem 파일이 생성된걸 확인해 볼 수 있습니다.

 

ca.pem파일을 만들었다면 이젠 도커 서버용 인증서를 만들어 보도록 하겠습니다. 

openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=centgsk2" -sha256 -new -key server-key.pem -out server.csr

위와 같이 서버 키를 만들고 CSR(Certificate Signing Request) 파일을 만들도록 합니다. 

DNS이름이 있을 경우 -subj 에 본인의 DNS 이름을 넣도록 합니다. 저는 테스트서버의 호스트이름인 centgsk2로 통일 시키도록 하겠습니다. 

 

TLS 연결은 IP 주소와 DNS 이름을 통해 연결되므로 인증서를 생성 할 때 본인이 허용할 IP를 지정해야 합니다. 

저의 경우는 위와 같이 127.0.0.1과 테스트 서버의 IP(100.100.100.3)를 지정하였으며 위의 과정은 서버 인증에만 사용할 수 있도록 Docker 데몬의 확장 사용 속성을 설정합니다.

(중요) 테스트 시 본인의 네트워크 대역에 맞는 IP 및 DNS 이름을 설정하도록 합니다. 

 

openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey gsk-ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf

이제 마지막으로 서명된 인증서를 생성하도록 합니다. 

위의 명령어를 입력하면 server-cert.pem 파일이 생성된걸 확인해 볼 수 있습니다. CA키 패스워드는 처음 CA파일을 생성 시 입력한 패스워드 입니다.

 

 

도커 서버용 인증서를 만들었으므로 도커 클라이언트를 위한 인증서를 만들어 보도록 하겠습니다. 

openssl genrsa -out client-key.pem 4096
openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile-client.cnf

과정은 서버키를 만들었던 과정과 비슷하며 위와 같이 클라이언트 인증에 적합한 새 확장 구성 파일을 추가로 생성합니다. 

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey gsk-ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile-client.cnf

마찬가지로 서명된 인증서를 생성하도록 합니다. 

CA키 패스워드까지 입력하면  client-cert.pem 파일이 생성된 걸 확인해 볼 수 있습니다. 

사용할 인증서 파일 외에 필요없는 파일은 지웠으며 위의 파일들이 준비되었는지 마지막으로 확인합니다.

 

 

이제 필요한 인증서는 모두 만들었으므로 도커 서버에 인증서를 적용하도록 하겠습니다. 

적용방법은 두 가지가 있는데 도커 데몬에 직접 설정하는 방법과 도커 구성 파일(daemon.json)에 설정하는 방법 입니다. 

 

추천 방법인 도커 구성파일(daemon.json)에 설정해보도록 하겠습니다. 

vi /etc/docker/daemon.json 명령어로 위와 같이 설정하도록 합니다 인증서 파일은 절대경로로 지정이 가능하며 절대경로를 사용하지 않을 경우 기본값 경로인 ~/.docker 디렉토리에 있는 인증서 파일이 지정 됩니다. 

 

본격적인 테스트 진행을 위해 systemd 데몬의 docker 서비스 파일을 변경하지 않고 직접 docker 데몬을 실행 시켜 보았습니다. 

도커 서버 쉘에서 dockerd -H=100.100.100.3:2376 명령어를 입력하면 에러나 오류 없이 도커 데몬이 실행됩니다. 

테스트용이 아닌 상용 및 직접 사용하는 환경이라면 docker 서비스 파일에 직접 등록해두는 편이 좋습니다. 

기본값 경로는 /usr/lib/systemd/system/docker.service 입니다. 

 

테스트만 진행한다면 위와 같이 도커 데몬에 옵션만 넣어서 바로 실행 시키도록 합니다. 

도커 구성 파일이나 도커 데몬에 직접 설정해서 도커 데몬에 TLS 적용을 시키며 혹시 모르니 아래에 도커 데몬에서 바로 TLS 적용 시키는 방법까지 작성해 두었습니다. 

1. 데몬구성파일 작성 
vi /etc/docker/daemon.json
{
"tlsverify": true,
"tlscacert": "/root/ca.pem",
"tlscert": "/root/server-cert.pem",
"tlskey": "/root/server-key.pem"
}

도커 데몬 실행 


2. 도커 데몬에서 직접 TLS 적용
dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:2376

 

도커 엔진 20.10.2 버전에서는 api 통신이 막혀있으며 1.13.1 버전에서는 127.0.0.1로 열려있으므로 테스트를 위해 H옵션을 사용하여 소켓을 열어둡니다. 

 

도커 서버에서 만들었던 클라이언트 인증서는 테스트할 다른 서버에 옮겨두도록 합니다. ex) lrzsz, ftp 등 

 

클라이언트용 인증서는 ca.pem, client-cert.pem, client-key.pem 파일이며 타 서버의 테스트 서버 환경은 CentOS 7.9 RAM 1GB, Docker Engine CE Client Version 19.03.9 입니다.

위의 사진은 도커 클라이언트용 테스트 서버 정보입니다. 

클라이언트 인증서 모두 준비되어있고 Docker Engine CE Client Version 19.03.9가 설치되어 있습니다. 

Docker Remote API 통신 전 방화벽은 두 서버 모두 내려 두었습니다. ex) service firewalld stop 

 

docker --tlsverify --tlscacert=/root/ca.pem --tlscert=/root/client-cert.pem --tlskey=/root/client-key.pem -H=100.100.100.3:2376 version

클라이언트 테스트 서버에서 위의 명령어를 입력하면 TLS 적용된 도커 서버(ip: 100.100.100.3)에서 위와 같이 응답을 해주게 됩니다. 예시로 도커 서버의 버전정보를 확인하였으며 도커 서버의 20.10.2 버전인걸 확인해 볼 수 있습니다. 

 

클라이언트 테스트 서버에서도 인증서는 절대경로로 입력이 가능하며 기본값 경로는 도커 서버인증서와 동일하게 ~/.docker 디렉토리 입니다. 해당 디렉토리가 없을 경우 만들면 됩니다. 

 

마지막으로 하나 더 테스트 해보도록 하겠습니다. 

curl 명령어를 사용하여 도커 서버에 연결하면 클리이언트 인증서가 없을 경우 확인이 불가능 합니다. 

클라이언트 인증서를 사용할 경우 정상적으로 도커 서버에서 현재 소유한 이미지 확인 가능합니다.

 

여기까지 Docker SSL / TLS 적용 및 테스트 였습니다. 

주의사항으로 클라이언트 인증서가 있을 경우 TLS 적용된 도커 서버에 관리자와 같은 권한을 가지므로 클라이언트 인증서 관리는 주의해야 합니다. 

'서버운영 > Virtualization' 카테고리의 다른 글

Docker 설치 (CentOS)  (0) 2021.01.28
쿠버네티스(kubernetes) 설치하기 (CentOS 7)  (2) 2019.08.08
VMware ESXi 설치 및 활용  (0) 2019.05.06
OpenStack 설치  (0) 2019.02.24
docker 사용법2 및 활용  (0) 2019.02.17
Comments