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