Secret
์ํธ, ํ ํฐ ๊ฐ์ ์๋์ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋๋ฐ ์ฐ๋ ์ค๋ธ์ ํธ. Secret์ ์ ์ฅ๋ ๊ฐ์ Pod์ด ์ฌ์ฉํ๋ค.
ConfigMap๊ณผ ์ ์ฌํ์ง๋ง, ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ธฐ ์ํ ํน๋ณํ ์ค๋ธ์ ํธ์ด๋ค.
๋จ, ์ฃผ์ํ ๊ฒ์ โSecret ์ค๋ธ์ ํธ๊ฐ ์๋ฒฝํ ๋ฐ์ดํฐ ์ํธํ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ์๋๋คโ๋ผ๋ ์ ์ด๋ค. ์์ธํ ๋ด์ฉ์ ์๋ ๋ด์ฉ ์ฐธ์กฐ.
Secret ์์ฑ
yaml ํ์ผ๋ก ์์ฑ
ConfigMap๊ณผ ๋ฌ๋ฆฌ data
ํญ๋ชฉ์ ๊ฐ์ด base64 ํ์์ผ๋ก ์ธ์ฝ๋ฉ ๋์ด ์์ด์ผ ํ๋ค. base64 ์ธ์ฝ๋ฉ์ ์๋์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
# encoding
$ echo "root" | base64
cm9vdAo=
# decoding
$ echo "cm9vdAo=" | base64 -d
root
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque # ์์์ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ
data:
username: cm9vdAo= # (base64) root
password: cGFzc3dvcmQxMjMK # (base64) password123
type: Opaque
๋ก ์ค์ ๋์ด ์๋๋ฐ, Secret ์ค๋ธ์ ํธ์ ๋ํดํธ ํ์
์ด๋ค. ์ง์ ์ ์ํด์ ์ฐ๋ Secret์ Opaque(๋ถ๋ถ๋ช
ํ) ํ์
์ผ๋ก ๋ถ๋ฅํ๋ค.
kubectl๋ก ์์ฑ
$ kubectl create secret generic [secret-name] \
--from-literal=username=root \
--from-literal=password=password123
kubectl
๋ก ์์ฑํ๋ฉด, ํ๋ฌธ๊ฐ์ ๋ฃ์ด๋ ์์์ base64๋ก ์ธ์ฝ๋ฉ ํด์ค๋ค. Secret ์ค๋ธ์ ํธ๋ kubectl๋ก ์์ฑํ๋๊ฒ ๋ ํธํ ์ง๋!
Pod์ Secret ์ฌ์ฉ
ํ๊ฒฝ ๋ณ์๋ก ๋ฐ๊ธฐ
...
spec:
containers:
- name: ...
image: ...
envFrom:
- secretRef:
name: my-secret
๋ณผ๋ฅจ ๋ง์ดํธ๋ฅผ ํตํด ๋ฐ๊ธฐ
ConfigMap์ ๋ฐฉ์๊ณผ ๊ฑฐ์ ๋น์ทํ๋ฏ๋ก ํจ-์ค!
Secret์ ์ทจ์ฝ์
Secret์ ConfigMap ๋์ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ base64 ์ธ์ฝ๋ฉํด์ ๋ณด๊ดํ๋ค๋ ๊ฒ ๋ง๊ณ ๋ ์๋ฌด๋ฐ ์ฐจ์ด๊ฐ ์๋ค. ์ค์ ๋ก ๋ง์๋ง ๋จน์ผ๋ฉด ์๋์ ํ๋ฌธ๊ฐ์ ์ ์ ์๋ค.
$ k get secrets db-secret -o json
{
"apiVersion": "v1",
"data": {
"DB_Host": "c3FsMDE=",
"DB_Password": "cGFzc3dvcmQxMjM=",
"DB_User": "cm9vdA=="
},
"kind": "Secret",
"metadata": {
...
},
"type": "Opaque"
}
$ echo "c3FsMDE=" | base64 -d
root
k get secrets -o json
์ผ๋ก ํ์ธํ base64 ๊ฐ์ ๋ค์ ๋์ฝ๋ฉ ํ๊ธฐ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
ConfigMap ์ค๋ธ์ ํธ์ Secret ์ค๋ธ์ ํธ๋ etcd์ ์ ์ฅ๋๋ค. ํ์์ api-server๋ฅผ ํตํด etcd์ ์ ์ํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ผ๋ก key-value ๊ฐ์ ์ฝ์ด์ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ Secret์ etcd์ ์ํธํ ๋์ง ์์ ์ํ๋ก ์ ์ฅ๋๋ค. ์ฆ, ๋๊ตฐ๊ฐ etcd์ ์ ๊ทผํ๋ ๊ถํ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, Secret์ ํ๋ฌธ๊ฐ์ ์ ์ ์๋ค.
์ด๋ฌ๋ ์ ๋ฌ๋ Secret ์ค๋ธ์ ํธ๋ ๊ฐ์ ์ํธํ ํ๋๋ฐ๋ ์กฐ๊ธ ๋ถ์กฑํ ๋ ์์ด๋ค. ๊ทธ๋์ โ์ ์ฅ๋ ๋ฐ์ดํฐ ์ํธํ(Encryption at Rest)โ ๊ธฐ๋ฅ์ ํ์ฑํ ํด์, Secret์ ์ทจ์ฝ์ ์ ๋ณด์ํด์ผ ํ๋ค.
์ ์ฅ๋ ๋ฐ์ดํฐ ์ํธํ(Encryption at Rest)
etcd์ ์ ์ฅ๋, โat restโ ์ํ์ Secret ๋ฐ์ดํฐ๋ฅผ ์ํธํ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. Udemy ๊ฐ์ข์์๋ etcdctl
์ ํตํด etcd ํด๋ฌ์คํฐ์ ์ ์ํด์ ์ค์ ํ๋ฌธ๊ฐ์ ํ์ธํ๋ ๊ฒ๋ ๋ณด์ฌ์คฌ์ง๋ง, ์ฌ๊ธฐ์๋ ํจ-์ค ํ๊ฒ ๋ค!
์๋ฆฌ๋ ๊ฐ๋จํ๋ค. ConfigMap/Secret ์ค๋ธ์ ํธ์ ๊ฐ์ etcd์ ์ ์ฅํ ๋ ์ํธํํด์ ์ ์ฅํ ๊ฒ์ด๋ค. ๋จ, api-server๋ Encryption Provider๋ฅผ ํตํด ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ ํ ์ ์๋ค.
Encryption Configuration ์์ฑ
etcd ์ํธํ ๋ฐฉ์์ ์ ์ํ์.
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
- configmaps
providers:
- identity: {}
- aescbc: # ์ํธํ ์๊ณ ๋ฆฌ์ฆ
keys:
- name: key1
secret: cGFzc293cmQxMjMK # (base64) password123
api-server์ Encryption Provider ์ค์
api-server์ .yaml
ํ์ผ์ ์ด์ด์ Encryption Provider๋ฅผ ์ค์ ํด์ค๋ค.
...
spec:
containers:
- command:
- kube-apiserver
...
- --encryption-provider-config=/etc/kubernetes/enc/enc.yaml
...
volumeMounts:
- name: enc
mountPath: /etc/kubernetes/enc
readonly: true
...
volumes:
- name: enc
hostPath:
path: /etc/kubernetes/enc
type: DirectoryOrCreate
kube-apiserver
์ปค๋งจ๋์ ์ธ์๋ก --encryption-provider-config
๋ ๋๊ฒจ์ค์ผ ํ๊ณ , ๋ณผ๋ฅจ๊ณผ ๋ณผ๋ฅจ ๋ง์ดํธ๋ก ์ค์ ํด์ค์ผ ํ๋ค.
api-server์ .yaml
ํ์ผ ์์ ํด์ฃผ๋ฉด, api-server์ Static Pod์ด ์ฌ์์ฑ๋์ด ์ ์ฉ๋๋ค.
Encryption ์ฒดํฌ
์ ๋์๊ฒ ์ง!
๋จ, ๊ธฐ์กด์ ์ด๋ฏธ ์๋ ConfigMap/Secret์ด ์ํธํ๋๋ ๊ฒ์ ์๋๋ค. api-server ์ฌ์์ฑ ํ์ ๋ง๋ค์ด์ง ConfigMap/Secret๋ง ์ํธํ ๋์ด etcd์ ์ ์ฅ๋๋ ๊ฒ!