25๋ ๋ AWS EKS Hands-on Study ์คํฐ๋ ์ ๋ฆฌ ๋ด์ฉ์ ๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค x.509 ์ธ์ฆ์ ์ค์ต
docker exec -it myk8s-control-plane ls -l /etc/kubernetes/pki
total 56
-rw-r--r-- 1 root root 1123 Mar 15 17:33 apiserver-etcd-client.crt
-rw------- 1 root root 1679 Mar 15 17:33 apiserver-etcd-client.key
-rw-r--r-- 1 root root 1176 Mar 15 17:33 apiserver-kubelet-client.crt
-rw------- 1 root root 1679 Mar 15 17:33 apiserver-kubelet-client.key
-rw-r--r-- 1 root root 1326 Mar 15 17:33 apiserver.crt
-rw------- 1 root root 1675 Mar 15 17:33 apiserver.key
-rw-r--r-- 1 root root 1107 Mar 15 17:33 ca.crt
-rw------- 1 root root 1679 Mar 15 17:33 ca.key
drwxr-xr-x 2 root root 162 Mar 15 17:33 etcd
-rw-r--r-- 1 root root 1123 Mar 15 17:33 front-proxy-ca.crt
-rw------- 1 root root 1675 Mar 15 17:33 front-proxy-ca.key
-rw-r--r-- 1 root root 1119 Mar 15 17:33 front-proxy-client.crt
-rw------- 1 root root 1675 Mar 15 17:33 front-proxy-client.key
-rw------- 1 root root 1675 Mar 15 17:33 sa.key
-rw------- 1 root root 451 Mar 15 17:33 sa.pub
CA ์ธ์ฆ์ ๋ด์ฉ ํ์ธ
docker exec -it myk8s-control-plane openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 5754887193385032258 (0x4fdd77696428da42)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = kubernetes
Validity
Not Before: Mar 15 17:28:12 2025 GMT
Not After : Mar 13 17:33:12 2035 GMT
Subject: CN = kubernetes
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
X.509 v3๋ ํ์ฅ ํ๋๋ฅผ ์ถ๊ฐํ ์ ์์ด CA ์ธ์ฆ์๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, CA์์ ๋ฐ๊ธํ๋ ๊ฐ ์ธ์ฆ์๋ ๊ณ ์ ํ ์๋ฆฌ์ผ ๋๋ฒ๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
์ด ์ธ์ฆ์๋ SHA-256 + RSA๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช ๋์์์ผ๋ฉฐ, ์๊ธฐ ์์ ์ ๋ฐ๊ธ์(Issuer)๋ก ์ค์ (CN = kubernetes)ํ๋ Self-Signed ์ธ์ฆ์์์ ํ์ธํ ์ ์๋ค.
์ด ์ธ์ฆ์๋ 2025๋ 3์ 15์ผ๋ถํฐ 2035๋ 3์ 13์ผ๊น์ง ์ ํจํ๋ฉฐ, CA ์ธ์ฆ์๋ ์ฅ๊ธฐ๊ฐ ์ ํจํ๋๋ก ์ค์ ๋์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ ธ๋ ์ธ์ฆ์๋ ๋ ์งง์ ์ ํจ ๊ธฐ๊ฐ์ ๊ฐ์ง๋ค.
์ธ์ฆ์์ ๋์(Subject)์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์ค์ ๋๊ณ ์ด ์ธ์ฆ์๊ฐ ํด๋ฌ์คํฐ ์ธ์ฆ์ ์ํด ์ฌ์ฉ๋๋ค.
RSA 2048-bit ๊ณต๊ฐ ํค๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ขฐํ ์ ์๋ ์ธ์ฆ์๋ฅผ ํ์ธํ ์ ์๋๋ก ํ๋ค.
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment, Certificate Sign
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Subject Key Identifier:
5B:71:6E:8E:5E:0B:63:0D:42:F8:A1:37:B8:2B:A1:54:60:74:60:8A
X509v3 Subject Alternative Name:
DNS:kubernetes
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
xx:yy:zz..~~
ํ์ฅ ํ๋๋ฅผ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
์ธ์ฆ์๋ critical๋ก ์ ์ธ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- Digital Signature: ๋์งํธ ์๋ช ์์ฑ ๊ฐ๋ฅ
- Key Encipherment: ํค ์ํธํ ๊ฐ๋ฅ
- Certificate Sign: ์ด ์ธ์ฆ์๋ ๋ค๋ฅธ ์ธ์ฆ์๋ฅผ ์๋ช ํ ์ ์๋ CA ์ญํ
์ฟ ๋ฒ๋คํฐ์ค์์ ํด๋ฌ์คํฐ์ ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ์ด CA๋ฅผ ์ ๋ขฐํ๋๋ก ์ค์ ๋๊ณ , ์ธ์ฆ์์ ๊ณ ์ ํ ํด์๊ฐ์ ํตํด ๋ค๋ฅธ ์ธ์ฆ์๋ค์ด ์ด ๊ฐ์ ์ฌ์ฉํ์ฌ ์ ๋ขฐํ CA์ธ์ง ํ์ธํ ์ ์๋ค.
ํด๋ฌ์คํฐ ๋ด๋ถ์์ API ์๋ฒ๋ฅผ ํธ์ถํ ๋, "kubernetes"๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์ด ์ธ์ฆ์๋ฅผ ๊ฒ์ฆํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ด CA๋ฅผ ๊ฒ์ฆํ ๋ ๋ฐ๊ธ์์ ๊ณต๊ฐ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช
์ ํ์ธํ์ฌ ์ธ์ฆ์ ์ํํ๋ค.
CSR ๋ด์ฉ ํ์ธ
kubectl get certificatesigningrequests
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-txkc6 11m kubernetes.io/kube-apiserver-client-kubelet system:node:myk8s-control-plane <none> Approved,Issued
kubectl describe certificatesigningrequests
Name: csr-txkc6
Labels: <none>
Annotations: <none>
CreationTimestamp: Sun, 16 Mar 2025 02:33:26 +0900
Requesting User: system:node:myk8s-control-plane
Signer: kubernetes.io/kube-apiserver-client-kubelet
Status: Approved,Issued
Subject:
Common Name: system:node:myk8s-control-plane
Serial Number:
Organization: system:nodes
Events: <none>
myk8s-control-plane ๋ ธ๋๊ฐ Kubelet ์ธ์ฆ์๋ฅผ ์์ฒญํ๊ณ ๊ด๋ฆฌ์๊ฐ ์ด๋ฅผ ์น์ธํ์ฌ ๋ฐ๊ธ๋ ์ํ์ด๋ค.
์ด csr์ ์ข ๋ ์์ธํ ์ดํด๋ณด๋ฉด, "myk8s-control-plane" ๋ ธ๋์ Kubelet ์ธ์ฆ์๋ฅผ ์ํ ๊ฒ์ด๋ฉฐ ๋ ธ๋๊ฐ ํด๋ฌ์คํฐ์ ์ฐธ์ฌํ๊ธฐ ์ํด Kube API Server์ ์ธ์ฆ์ ์ํํ๋ ค๋ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์๋ค.
kubernetes.io/kube-apiserver-client-kubelet์ API ์๋ฒ๊ฐ Kubelet์ ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ฅผ ์น์ธํ๋ ๊ธฐ๋ณธ Signer์ด๋ค.
Kube API Server๊ฐ ์ด csr์ ์น์ธํ๋ฉด, Kubelet์ด API Server์ ์์ ํ๊ฒ ํต์ ํ ์ ์๋๋ก ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ๋๋ค.
์ด ์ธ์ฆ์๋ฅผ ํตํด kubelet์ด api ์๋ฒ์ ์ ์์ ์ผ๋ก ํต์ ์ ์งํํ ์ ์๋ค.
kubeconifg ์ธ์ฆ์
echo "LS0tLS1CR..." | base64 -d > myuser.key
cat myuser.key
์ด ํค๋ client-certificate-data์ ๋์ํ๋ ๊ฐ์ธ ํค๋ก, kubernetes-admin ์ฌ์ฉ์๊ฐ API ์๋ฒ์ ์ธ์ฆํ ๋ ์ฌ์ฉํ๋ค.
openssl x509 -in myuser.crt -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1412884469959843802 (0x139b92f08c9f5fda)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN=kubernetes
Validity
Not Before: Mar 15 17:28:12 2025 GMT
Not After : Mar 15 17:33:12 2026 GMT
Subject: O=kubeadm:cluster-admins, CN=kubernetes-admin
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Client Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Authority Key Identifier:
keyid:5B:71:6E:8E:5E:0B:63:0D:42:F8:A1:37:B8:2B:A1:54:60:74:60:8A
Signature Algorithm: sha256WithRSAEncryption
client-certificate-data ๊ฐ์ ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ก, ํน์ ์ฌ์ฉ์๊ฐ Kubernetes API ์๋ฒ์ ์ธ์ฆํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- name: kind-myk8s
user:
client-certificate-data: LS~
client-key-data: LS~
ํ๋ธ์ปจํผ๊ทธ๋ฅผ ๋ณด๋ฉด client-certificate-data์ client-key-data๊ฐ ์๋๋ฐ,
client-certificate-data ๋ ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ก, ํน์ ์ฌ์ฉ์๊ฐ Kubernetes API ์๋ฒ์ ์ธ์ฆํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ
client-key-data ๋ ํด๋ผ์ด์ธํธ ๊ฐ์ธ ํค(Private Key)๋ก client-certificate-data์ ๋์ํ๋ ๊ฐ์ธ ํค์ด๋ค.
cat $HOME/.kube/config
certificate-authority-data: LS
์ด ์ธ์ฆ์๋ Kubernetes ํด๋ฌ์คํฐ์์ API ์๋ฒ๊ฐ ์ ๋ขฐํ๋ Root CA ์ธ์ฆ์๋ก ์ฌ์ฉ๋๋ค.
kubernetes-admin ์ฌ์ฉ์๋ client-certificate-data์ client-key-data๋ฅผ ์ด์ฉํ์ฌ API ์๋ฒ์ TLS ์ธ์ฆ์ ์ํํ๊ณ ,
certificate-authority-data๋ฅผ ํตํด API ์๋ฒ๋ฅผ ์ ๋ขฐํ ์ ์๊ฒ ๋๋ค.
CSR์ ํ์ฉํ ์ ๊ท ์ฌ์ฉ์ ์ธ์ฆ
openssl genrsa -out $USER.key 2048
openssl req -new -key $USER.key -out $USER.csr -subj "/O=kubeadm:cluster-admins/CN=$USER-cert"
Kubernetes API ์๋ฒ์ ์ ์ถํ ์ธ์ฆ์ ์๋ช ์์ฒญ(CSR) ์์ฑํ๋ค.
cat $USER.csr | base64 | tr -d '\n'
๋ก ๋์ค๋ ๊ฐ ๋ณต์ฌ!
kubectl apply -f - <<EOF
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: $USER-csr
spec:
signerName: kubernetes.io/kube-apiserver-client
groups:
- system:masters
- system:authenticated
request: LS...
usages:
- digital signature
- key encipherment
- client auth
EOF
Kubernetes์ CSR์ ์ ์ถํ์ฌ ์ธ์ฆ์๋ฅผ ์์ฒญํ๋ค
k get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-txkc6 52m kubernetes.io/kube-apiserver-client-kubelet system:node:myk8s-control-plane <none> Approved,Issued
nana-csr 4s kubernetes.io/kube-apiserver-client kubernetes-admin <none> Pending
kubectl certificate approve nana-csr
certificatesigningrequest.certificates.k8s.io/nana-csr approved
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-txkc6 56m kubernetes.io/kube-apiserver-client-kubelet system:node:myk8s-control-plane <none> Approved,Issued
nana-csr 4m30s kubernetes.io/kube-apiserver-client kubernetes-admin <none> Approved,Issue
๊ด๋ฆฌ์๊ฐ CSR์ ์น์ธํ์ฌ ์ธ์ฆ์ ๋ฐ๊ธ์ ์์ฒญํ๋ค.
kubectl get csr nana-csr -o jsonpath='{.status.certificate}' | base64 -d > nana.crt
kubectl get csr nana-csr -o jsonpath='{.status.certificate}' | base64 -d > nana.crt
openssl x509 -in nana.crt -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
...
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN=kubernetes
Validity
Not Before: Mar 15 18:24:42 2025 GMT
Not After : Mar 15 18:24:42 2026 GMT
Subject: O=kubeadm:cluster-admins, CN=nana-cert
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Client Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Authority Key Identifier:
keyid:...
cat ~/.kube/config
...
- name: nana
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- --region
- ap-northeast-2
- eks
- get-token
- --cluster-name
- myeks
- --output
- json
command: aws
env: null
interactiveMode: IfAvailable
provideClusterInfo: false
- name: nana-user
user:
client-certificate: /root/nana.crt
client-key: /root/nana.key
kubectl config set-credentials nana-user --client-certificate=nana.crt --client-key=nana.key
kubectl config set-context kind-nana --cluster=kind-myk8s --user=nana-user
cat ~/.kube/config
kubectl config use-context kind-
kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kind-nana kind-myk8s nana-user
k get node
NAME STATUS ROLES AGE VERSION
myk8s-control-plane Ready control-plane 63m v1.32.2
์ด์ ์๋ก์ด ์ฌ์ฉ์๋ฅผ ํด๋ฌ์คํฐ์ ๋ฑ๋กํ๊ณ ํด๋น ์ฌ์ฉ์๊ฐ Kubernetes API ์๋ฒ์ ์ ๊ทผํ ์ ์๋๋ก ์ค์ ํ ํ,
์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง ํ์ธํ ์ ์๋ค.
'Infra > AWS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AEWS] #6์ฃผ์ฐจ EKS ์ธ์ฆ/์ธ๊ฐ (3) (1) | 2025.03.16 |
---|---|
[AEWS] #6์ฃผ์ฐจ ์๋น์ค ์ด์นด์ดํธ, role ๊ถํ ํ์ธ ์ค์ต (2) (0) | 2025.03.16 |
AWS MFA ์ญ์ ํ์ ๋ ์กฐ์น ๋ฐ PC๋ก ์ธ์ฆ ๋ณ๊ฒฝ (0) | 2025.03.10 |
[AEWS] #5์ฃผ์ฐจ Karpenter ์ค์ต (3) (0) | 2025.03.08 |
[AEWS] #5์ฃผ์ฐจ KEDA, CAS ์ค์ต (2) (0) | 2025.03.07 |