Section 7-1. TLS in Kubernetes
udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의 및 쿠버네티스 인 액션 (마르코 룩샤)를 참고하여 정리한 글입니다.
Section07. Security
TLS란?
- TLS는 전송 계층 보안으로 TCP/IP를 사용할 때 적용되며 전송계층 보안인 만큼 종단간(End to End)의 보안 통신을 지원한다.
- TLS는 대칭키 암호화 방식과 비대칭키 암호화 방식을 혼용해서 사용한다.
- 대칭키 암호화 : 암호화를 하는 키와 복호화를 하는 키가 동일한 방식이다. 이 때 암호화 복호화에 사용되는 동일한 키를 대칭키라고 한다.
- 비대칭키 암호화 : 하나의 키를 갖는 대칭키 암호화 방식과 달리, 비대칭키 암호화 방식 은 한 쌍의 키를 갖는데 두개의 키에서 하나는 Public Key, 하나는 Private Key라고 한다. 이 한 쌍의 키를 통해 암호화와 복호화가 진행된다,
- TLS는 처음에 대칭키를 서로 공유하는 통신을 RSA 비대칭키 방식을 이용하고 실제 통신을 할 때는 대칭키 방식으로 데이터를 주고 받는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
=========================================================== ##### 비대칭키 암호화 ##### A ----- A의 공개키 ----> B A <---- A의 공개키로 암호화하여 대칭키 전송 ---- B A는 받은 암호화 메시지를 A의 비밀키로 복호화하여 대칭키를 알아냄 =========================================================== ##### 대칭키 암호화 ##### A ----- 대칭키로 암호화한 데이터 전송 ----> B B는 받은 암호화 메시지를 대칭키로 복호화 ===========================================================
- 이 때 서버와 클라이언트 간 통신을 할 때 인증서를 통해 서버가 신뢰할 수 있는 서버라는 것을 확인하는 작업이 필요하다.
- CA : 인증서를 발급해 주는 기관으로 자체적으로 공개키와 비밀키를 가지고 있다.
- 사이트 정보와 공개키를 CA에 제출하여 (= CSR, certificate signing request) 검증 받은 후 CA의 비밀키로 암호화된 인증서를 발급받을 수 있다 (= sign certificate).
- CA : 인증서를 발급해 주는 기관으로 자체적으로 공개키와 비밀키를 가지고 있다.
- 일반적으로 인증서(= Certificate)는 뒤에 crt 또는 pem 확장자가 붙어 있으며 비밀키 (= Private Key, 개인키)는 key가 확장자로 붙거나 파일명에 key가 들어간다.
TLS in Kubernetes
- 쿠버네티스 클러스터는 마스터노드와 워커노드로 이루어져있고 각 노드들 사이의 모든 통신은 보안이 적용되어있어야한다.
- kube-api server는 클러스터를 관리하고 클라이언트와 모든 통신을 보호하기 위해 인증서와 비밀키가 필요하다.
- 이 때 admin, scheduler, kube-controller-manager, kube-proxy, kube-api server의 client가 된다. 즉 각 인증서와 개인키가 필요하다.
- ETCD server는 클러스터에 관한 모든 정보를 저장하므로 인증서와 비밀키가 필요하다.
- 이 때 kube-api server는 etcd server의 client가 된다. 즉 이를 위해 인증서와 개인키가 필요하다.
- kubelet server는 kube-api server가 워커 노드와 상호 작용하게 하므로 인증서와 비밀키가 필요하다.
- 이 때 kube-api server는 Kubelet의 client가 된다. 즉 이를 위해 각 인증서와 개인키가 필요하다.
모든 인증서에 서명하기 위해서는 CA(Certificate Authority) 가 필요하다.
TLS in Kubernetes - Certificate Creation
- 인증서를 생성하는데는 다양한 툴이 있지만 OpenSSL을 이용하여 인증서를 생성해보자
CA
- 비밀키 (private key) 생성하기
1 2
$ openssl genrsa -out ca.key 2048 ca.key
- 인증서 서명 요청하기 (CSR)
1 2
$ openssl req -new -key ca.key -subj "/CN=KUBERNETES-CA" -out ca.csr ca.csr
- 서명된 인증서 생성
1 2
$ openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt ca.crt
CA는 이제 비밀키와 인증서를 갖고 있다.
생성한 CA 키 페어를 통해 다른 인증서에 서명할 수 있다.
Client Certificate 생성하기 (Client : Admin User)
- 비밀키 생성하기
1 2
$ openssl genrsa -out admin.key 2048 admin.key
- 인증서 서명 요청하기 (CSR)
1 2
$ openssl req -new -key admin.key -subj "/CN=kube-admin" -out admin.csr admin.csr
- 서명된 인증서 생성
1 2
$ openssl x509 -req -in admin.csr -CA ca.crt -CAkey ca.key -out admin.crt admin.crt
- 관리자를 위한 인증서의 경우 그룹 세부 정보 추가하기 (system:masters라는 관리 권한 그룹 명시)
1
$ openssl req -new -key admin.key -subj "/CN=kube-admin/O=system:masters" -out admin.csr
View Certificate Details
- 인증서를 확인하기 위해서는 클러스터가 어떻게 설정되었는지가 중요하다.
- 수동으로 클러스터를 구성한 경우
- kubeadm같은 자동 프로비저닝 툴에 의해 자동으로 클러스터 생성 및 구성한 경우
kubeadm에 의해 생성된 클러스터
- kube-apiserver 정의 파일에서 확인할 수 있다.
1
cat /etc/kubernetes/manifests/kube-apiserver.yaml
--tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- SSL X509 명령을 통해 해당 인증서를 디코딩하고 세부사항을 볼 수 있다.
1
$ openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
This post is licensed under CC BY 4.0 by the author.