Docker

8.Docker 도커 데몬 인증 키 적용

BE전문가 프로젝트 2024. 7. 18. 18:04

도커를 사용할 때 도커엔진에 보안에 대한 장치가 하나도 되어 있지 않다. 따라서 IP주소와 포트번호만 알게 된다면 다른 사용자가 도커를 제어할 수 있게 되는데 이는 치명적인 보안 오류이다. 

 

따라서 우리는 도커데몬에 openssl을 이용하여 인증키를 생성하고 도커데몬에 적용시킬 필요가 있다. 

도커데몬에 TLS 보안을 적용하고 인증된 사용자가 아니라면 도커에 접근할 수 없도록 서버 측클라이언트 측에 인증키를 적용시키겠다.

 

인증키 생성은  TLS, SSL 프로토콜을 이용할 수 있는 오픈소스 라이브러리 openssl을 통해 할 것이며

https://gruuuuu.github.io/security/what-is-x509/

에서 인증과정에 대한 자세한 설명을 볼 수 있다.

1. 서버 인증 키 생성

1) 디렉터리 생성

mkdir keys
cd keys

여러가지 인증 키를 생성하기 위한 디렉터리를 만든다.

2) private key(개인 키) 생성

openssl genrsa -aes256 -out ca-key.pem 4096
  • genrsa : rsa 암호화 알고리즘을 이용하여 private key 생성
  • -aes256 : aes256 암호화 알고리즘을 사용하여 비밀번호 생성
  • -out ca-key.pem : 인증 키 파일 이름
  • 4096 : 4096비트의 인증 키

3) public key(공개 키) 생성

openssel req -new -x509 -days 10000 -key ca-key.pem -sha256 -out ca.pem
  • req: 공개키 생성을 위한 명령어
  • -new -x509 : pki의 표준
  • -days : 키 만료일
  • -key ca-key.pem : private key 선언
  • -sha256 -out ca.pem : sha256 암호화 알고리즘을 이용한 ca.pem 공개 키 생성

4) 서버 측 private key 생성

openssl genrsa -out server-key.pem 4096
  • genrsa : rsa 암호화 알고리즘을 이용하여 private key 생성
  • -out ca-key.pem : 인증 키 파일 이름
  • 4096 : 4096비트의 인증 키

5) 서버 측 public key 생성

openssl req -subj "/CN=${도메인 or 도커 호스트의 IP}" -sha256 -new -key server-key.pem -out server.csr
  • -subj : 도메인 이름 및 호스트 IP 지정
  • -sha256 -new -key server-key.pem : server-key.pem(개인기)를 sha256 암호화 알고리즘 형식으로 접근하도록 설정

6) extfile 생성

echo subjectAltName = IP:${도메인 or 도커 호스트의 IP},IP:127.0.0.1 > extfile.cnf

인증서를 생성하거나 서명할 때 사용되는 확장 필드들을 지정하는 파일인 exfile.cnf를 생성한다.

접속에 사용될 IP주소를 exfile.cnf로 저장하는 것이다.

7)  서버 측 인증서 파일 생성

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

 

 

2. 클라이언트 인증 키 생성

1) 클라이언트 측 private key 생성

openssl genrsa -out key.pem 4096
  • genrsa : rsa 암호화 알고리즘을 이용하여 private key 생성
  • -out ca-key.pem : 인증 키 파일 이름
  • 4096 : 4096비트의 인증 키

2) 클라이언트 측 public key 생성

openssl req -subj "/CN=client" -new -key key.pem -out client.csr
  • -subj : 도메인 이름 및 호스트 IP 지정

3) extfile.cnf에 extendedKeyUsage항목 추가

echo extendedKeyUsage = clientAuth > extfile.cnf

X.509 디지털 인증서의 확장 필드로 클라이언트 인증 용도로 사용될 수 있음을 명시해준다.

 

4) 클라이언트 측 인증서 생성

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

 

3. 쓰기 권한 삭제

chmod -v 0400 ca-key.pem key.pem server-key.pem ca.pem server-cert.pem cert.pem

지금까지 생성한 키들의 쓰기 권한을 삭제한다.

cp {ca,server-cert,server-key,cert,key}.pem ~/.docker

 

4. TLS 보안 적용

sudo dockerd --tlsverify \
--tlscacert=/root/.docker/ca.pem \
--tlscert=/root/.docker/server-cert.pem \
--tlskey=/root/.docker/server-key.pem \
-H=0.0.0.0:2376 \
-H= unix:///var/run/docker.sock