Search

[CKA] 41. Generate Certificates

Date
2025/01/13
Category
Devops
Tag
Kubernetes
CKA
Security
๋ชฉ์ฐจ

ย Generate Certificates

์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ์ธ์ฆ์„œ๋“ค์„ ๊ฐ€์ง„๋‹ค๊ณ  ํ•  ๋•Œ, ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” Easy-RSA, OpenSSL, CFSSL ๋“ฑ์ด ์žˆ๋‹ค. OpenSSL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

ย CA Certificates Generation

์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์šฐ์„  ๊ฐœ์ธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด CSR์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

1) Private Key ์ƒ์„ฑ

openssl genrsa -out ca.key 2048
Bash
๋ณต์‚ฌ

2) CSR ์ƒ์„ฑ

์ƒ์„ฑ๋œ ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„œ ์„œ๋ช… ์š”์ฒญ์„ ์ƒ์„ฑํ•œ๋‹ค. CSR์€ ๋ชจ๋“  ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์ธ์ฆ์„œ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์„œ๋ช…์ด ์—†๋Š” ํŒŒ์ผ์ด๋‹ค. CSR์—์„œ๋Š” ์ธ์ฆ์„œ์˜ ์šฉ๋„๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด Common Name (CN) ํ•„๋“œ์— ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.
openssl req -new -key ca.key -subj "/CN=KUBERNETES-CA" -out ca.csr
Bash
๋ณต์‚ฌ

3) Sign Certificates

OpenSSL X509 ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด CSR์„ ์ง€์ •ํ•˜์—ฌ ์ธ์ฆ์„œ๋ฅผ ์„œ๋ช…ํ•œ๋‹ค. CA ์ž์ฒด์˜ ์ธ์ฆ์„œ์ด๋ฏ€๋กœ, 1๋‹จ๊ณ„์—์„œ ์ƒ์„ฑํ•œ ๊ฐœ์ธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด CA์— ์˜ํ•ด ์ž์ฒด ์„œ๋ช…๋œ๋‹ค.
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
Bash
๋ณต์‚ฌ
๋‹ค๋ฅธ ๋ชจ๋“  ์ธ์ฆ์„œ์— ์„œ๋ช…์„ ํ•  ๋•Œ, ca ํ‚ค ํŽ˜์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ช…ํ•œ๋‹ค.

ย Client Certificates Generation

์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•˜๋‹ค.

1) Private Key ์ƒ์„ฑ

openssl genrsa -out <client>.key 2048
Bash
๋ณต์‚ฌ

2) CSR ์ƒ์„ฑ

openssl req -new -key ca.key -subj "/CN=<Common Name>" -out <client>.csr
Bash
๋ณต์‚ฌ

ย Admin User

CSR์„ ์ƒ์„ฑํ•  ๋•Œ CN์€ Admin user์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ณณ์ด๋‹ค. ์ด ์ด๋ฆ„์€ kubectl ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆํ•˜๋Š” ์ด๋ฆ„์ด๋ฏ€๋กœ, kubectl ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋กœ๊ทธ๋‚˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ ์ด๋ฆ„์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
User Account๋Š” Admin User์™€ ์ผ๋ฐ˜ User๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์ฆ์„œ์— ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๊ทธ๋ฃน ์„ธ๋ถ€์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—๋Š” ๊ด€๋ฆฌ ๊ด€ํ•œ์„ ๊ฐ€์ง„ System Masters๋ผ๋Š” ๊ทธ๋ฃน์ด ์กด์žฌํ•˜๋Š”๋ฐ, ์ด๋ฅผ CSR์„ ์ƒ์„ฑํ•  ๋•Œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฃน ์„ธ๋ถ€์ •๋ณด๋Š” OU ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋ช…์ด ์™„๋ฃŒ๋˜๋ฉด ๊ด€๋ฆฌ ๊ถŒํ•œ์„ ๊ฐ€์ง„ admin์— ๋Œ€ํ•œ ์ธ์ฆ์„œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
openssl req -new -key ca.key -subj "/CN=kube-admin/O=system:masters" -out admin.csr
Bash
๋ณต์‚ฌ

ย Scheduler, Controller-Manager

kube-scheduler, kube-controller-manager๋Š” Controlplane์˜ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋“ค์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” system์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ prefix๋กœ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค(์ด๋ฆ„ ์•ž์— ๋ถ™์–ด์•ผ ํ•œ๋‹ค).
openssl req -new -key ca.key -subj "/CN=system:kube-scheduler" -out scheduler.csr openssl req -new -key ca.key -subj "/CN=system:kube-controller-manager" -out controller-manager.csr
Bash
๋ณต์‚ฌ

3) Sign Certificates

OpenSSL X509 ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋•Œ CA ์ธ์ฆ์„œ์™€ CA ๊ฐœ์ธํ‚ค๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ƒ์„ฑํ–ˆ๋˜ CA ํ‚ค ํŽ˜์–ด๋ฅผ ์ง€์ •ํ•จ์œผ๋กœ์จ ์ธ์ฆ์„œ์— ์„œ๋ช…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
openssl x509 -req -in <client>.csr -CA ca.key -CAkey ca.key -out <client>.crt
Bash
๋ณต์‚ฌ

ย Server Certificates Generation

ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ ์ธ์ฆ์„œ๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค. ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์ธ์ฆ์„œ๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค. ์ด๋•Œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘ CA์˜ ๊ณต๊ฐœ ์ธ์ฆ์„œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ผ ๊ฒฝ์šฐ, CA ์ธ์ฆ์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์— ์ด๋ฏธ ์„ค์น˜๋˜์–ด ์žˆ์—ˆ๋‹ค.
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋„ ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์„œ๋กœ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋‘ CA์˜ ๋ฃจํŠธ ์ธ์ฆ์„œ ์‚ฌ๋ณธ์ด ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„๋‚˜ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์ฆ์„œ๋กœ ๊ตฌ์„ฑํ•  ๋•Œ, CA ๋ฃจํŠธ ์ธ์ฆ์„œ๋„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

ย ETCD Servers

์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ ˆ์ฐจ๋Š” ์œ„์˜ ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๋‹ค. ETCD ์„œ๋ฒ„๋Š” ๊ณ ๊ฐ€์šฉ์„ฑ ํ™˜๊ฒฝ์—์„œ ๋‹ค์ค‘ ์„œ๋ฒ„์— ๊ฑธ์ณ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋‹ค๋ฅธ ๋ฉค๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ๋ณด์•ˆํ•˜๋ ค๋ฉด ์ถ”๊ฐ€์ ์œผ๋กœ peer ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
์ธ์ฆ์„œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ETCD ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ง€์ •๋œ๋‹ค. etcd ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ •์˜ํŒŒ์ผ์—๋Š” etcd ์„œ๋ฒ„ ํ‚ค์™€ ์ธ์ฆ์„œ์— ๋Œ€ํ•œ ์˜ต์…˜๊ณผ peer ์ธ์ฆ์„œ๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์ด ์ œ๊ณต๋œ๋‹ค. ๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์œ ํšจํ•œ์ง€๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ CA Root Certificate๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

ย Kube-API Server

kube-apiserver๋„ ๊ธฐ์กด๊ณผ ๊ฐ™์ด ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ CSR์„ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์˜ ๊ตฌ์„ฑ์ด ๊ธฐ์กด๊ณผ ๋‹ค๋ฅด๋‹ค.
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋ชจ๋“  ์ž‘์—…์€ kube-apiserver๋ฅผ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋ฉด kube-apiserver๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ API Server๋Š” ๋งŽ์€ ์ด๋ฆ„๊ณผ ๋ณ„์นญ์„ ๊ฐ€์ง„๋‹ค. ๋ณ„์นญ ์ด์™ธ์—๋„ IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
โ€ข
kubenetes
โ€ข
kubernetes.default
โ€ข
kubernetes.default.svc
โ€ข
kubernetes.default.svc.cluster.local
์ด ๋ชจ๋“  ์ด๋ฆ„์€ kube-apiserver์— ๋Œ€ํ•œ ์ธ์ฆ์„œ์— ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. ์ธ์ฆ์„œ์— ์ด ์ด๋ฆ„๋“ค์ด ์—†์„ ์‹œ, ์ด๋Ÿฐ ์ด๋ฆ„๋“ค๋กœ kube-apiserver๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค.

CSR ์ƒ์„ฑ

openssl req -new -key ca.key -subj "/CN=kube-apiserver" -out apiserver.csr \ -config openssl.cnf
Bash
๋ณต์‚ฌ
[req] req_extesions = v3_req distinguished_name = req_distinguished_name [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation subjectAltName = @alt_names [alt_names] DNS.1 = kubernetes DNS.2 = kubernetes.default DNS.3 = kubernetes.default.svc DNS.4 = kubernetes.default.svc.cluster.local IP.1 = 10.96.0.1 IP.2 = 172.17.0.87
YAML
๋ณต์‚ฌ

Service Configuration

kube-apiserver๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋จผ์ € ca-file์ด ์ „๋‹ฌ๋˜์–ด์•ผ ํ•œ๋‹ค. CA ์ธ์ฆ์„œ๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ•„์ˆ˜ ์š”์†Œ์ด๋‹ค. ๊ทธ ๋‹ค์Œ API Server ์ธ์ฆ์„œ๋ฅผ TLS ์ธ์ฆ ์˜ต์…˜์— ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ค.
kube-apiserver๋Š” etcd์™€ kubelet์— ๋Œ€ํ•œ ํด๋ผ์ด์–ธํŠธ์ด๋ฏ€๋กœ, etcd์™€ kubelet๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

ย Kubelet

Server CERT

kubelet ์„œ๋ฒ„๋Š” HTTPS API ์„œ๋ฒ„๋กœ ๊ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ ๋…ธ๋“œ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์žˆ๋‹ค. kubelet์— ๋Œ€ํ•œ ์ธ์ฆ์„œ, ํ‚ค ํŽ˜์–ด๋Š” ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ํ•„์š”ํ•˜๋‹ค. ์ด ์ธ์ฆ์„œ๋“ค์€ kubelet์ด๋ผ ๋ช…๋ช…ํ•˜์ง€ ์•Š๊ณ , ๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ๋”ฐ์„œ ์ด๋ฆ„ ์ง“๋Š”๋‹ค.
์ธ์ฆ์„œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ด๋ฅผ kubelet ๊ตฌ์„ฑ ํŒŒ์ผ์— ์‚ฌ์šฉํ•œ๋‹ค. CA์ธ์ฆ์„œ๋ฅผ ์ง€์ •ํ•˜๊ณ , ๊ฐ ๋…ธ๋“œ์—์„œ ๋…ธ๋“œ ์ž์‹ ์— ๋Œ€ํ•œ ์ธ์ฆ์„œ์™€ ํ‚ค๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
# kubelet-config.yaml (node01) kind: KubeletConfiguration apiVersion: kubelet.ocnfig.k8s.io/v1beta1 authntication: x509: clientCAFile: "/var/lib/kubernetes/ca.pem" authorization: mode: Webhook clusterDomain: "cluster.local" clusterDNS: - "10.32.0.10" podCIDR: "${POD_CIDR}" resolvConf: "/run/systemd/resolve/resolv.conf" runtimeRequestTimeout: "15m" tlsCertFile: "/var/lib/kubelet/kubelet-node01.crt" # node ๋งˆ๋‹ค ๋ณ€๊ฒฝ tlsPrivateKeyFile: "/var/lib/kubelet/kubelet-node01.key" # node ๋งˆ๋‹ค ๋ณ€๊ฒฝ
YAML
๋ณต์‚ฌ

Client CERT

kubelet์€ ์„œ๋ฒ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ kube-apiserver์™€ ํ†ต์‹ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ์จ๋„ ์ธ์ฆ์„œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ๋…ธ๋“œ๋Š” kube-scheduler๋‚˜ controller-manager์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ์ด๋ฏ€๋กœ, system ํ‚ค์›Œ๋“œ๋ฅผ prefix๋กœ ๊ฐ€์ง€๋ฉฐ node ํ‚ค์›Œ๋“œ๋ฅผ ํ•จ๊ป˜ ๊ฐ–๋Š”๋‹ค. system:node:<node-name>
์ถ”๊ฐ€๋กœ API Server๋กœ๋ถ€ํ„ฐ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ์–ป๊ธฐ ์œ„ํ•ด Admin User์™€ ๊ฐ™์ด ๊ทธ๋ฃน์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
openssl req -new -key ca.key \ -subj "/CN=system:node:node01/O=system:nodes" \ -out node01.csr
Bash
๋ณต์‚ฌ
์ธ์ฆ์„œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ kube-config ํŒŒ์ผ์—์„œ ์„ค์ •๋“ค์ด ์‚ฌ์šฉ๋œ๋‹ค.