반응형
쿠버네티스는 기본적으로 계정관리 기능을 제공하지 않으며, Certificate 인증을 통해 K8s Cluster REST API 통신을 합니다.
1. PKI(Public Key Infrastructure) 구조
PKI는 공개키(*.crt)와 비밀키(*.key)가 하나의 Pair로써, 데이터가 하나의 키로 암호화되면 쌍이 되는 다른 키로 복호화가 가능한 비대칭키 방식과 하나의 키로 암호화와 복호화가 모두 가능한 대칭키 방식을 모두 사용합니다.
PKI 구조에서 키교환이 이루어지는 방식은 아래 그림과 같습니다.
- 모든 Browser에는 COMODO나 Symanetc과 같은 인증된 보안업체들이 발급한 Root 인증서(CA)의 공개키를 가지고 있으며, 서비스 호스팅 등을 위한 Server는 CA로의 CSR을 통해 자신의 공개키를 암호화합니다.
- Client가 Server에 Request를 하게 되면 Server는 암호화된 인증서를 보냅니다.
- Browser는 암호화된 서버의 공개키를 내장된 Root 인증서로 복호화하고 유효성을 검사한 뒤 SSH-Key와 같은 자신의 대칭키를 Server의 공개키로 암호화하여 보냅니다.
- Server는 받은 대칭키를 통해 Client가 보내는 데이터를 복호화할 수 있게 됩니다.
이렇게하여 Server는 자신의 공개키가 Network 상에 노출되지 않은 채로 Client의 대칭키를 받아와 암호화 통신을 할 수 있게 됩니다.
이와 마찬가지로 K8s에서 각 Component는 자신들의 공개키와 비밀키를 가지며, 각 공개키들은 CA의 서명을 필요로합니다. kube-apiserver의 경우, 아래 그림처럼 다른 K8s Cluster의 CA 뿐만 아니라 ETCD의 CA에 대한 인증 절차도 필요합니다.
CA로 요청되는 CSR은 kube-controller-manager에서 관리되며, 인증받은 인증서는 Default로 1년간 유효합니다.
* kuber-controller-manager의 manifest에 '--cluster-signing-duration' flag를 변경하여 최장 10년까지 변경 가능합니다.
# cat /etc/kubernetes/manifests/kube-controller-manager.yaml
apiVersion: v1
kind: Pod
metadata:
...
name: kube-controller-manager
namespace: kube-system
spec:
containers:
- command:
- kube-controller-manager
...
- --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-duration=87600h0m0s
- --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
...
# openssl x509 -in /var/lib/kubelet/pki/kubelet-server.pem -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
...
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = Kubernetes-ca
Validity
Not Before: Aug 24 10:29:57 2022 GMT
Not After : Aug 21 10:29:57 2032 GMT
Subject: O = system:nodes, CN = system:node:worker03
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
...
# sudo kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Aug 21, 2032 09:47 UTC 9y ca no
apiserver Aug 21, 2032 09:47 UTC 9y ca no
apiserver-etcd-client Aug 21, 2032 09:47 UTC 9y etcd-ca no
apiserver-kubelet-client Aug 21, 2032 09:47 UTC 9y ca no
controller-manager.conf Aug 21, 2032 09:47 UTC 9y ca no
...
반응형
'System Engineering > Kubernetes' 카테고리의 다른 글
Kubernetes x509 SAN (Golang 1.15 or later) (0) | 2022.10.11 |
---|---|
Node Problem Detector and Draino (0) | 2022.09.27 |
Kubernetes Lease (Node Heartbeat) (0) | 2022.01.10 |
8. K8s AutoScaling (0) | 2021.04.11 |
7. K8s Resource / Scheduling (0) | 2021.04.05 |