kubectl create secret generic my-secret -n default --from-literal=mykey=mydata
kubectl get po -n kube-system
etcd-controlplane이 있는지 확인
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
get /registry/secrets/default/my-secret
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
get /registry/secrets/default/my-secret | hexdump -C
실제로 16진수로 확인해보면 우리가 만든 secret의 데이터가 암호화되지 않은채로 ETCD에 저장되어있다.
- 이것은 큰 문제인데 왜냐면, ETCD에 접속할 수 있는 모든 사람은 데이터를 볼 수 있기 때문이다. 그래서 암호화를 하도록 하겠다.
kube-apiserver 프로세스는 --encryption-provider-config
라는 argument를 지원하고 있고,
해당 argument는 API 데이터가 etcd에 암호화가 되는 과정을 제어한다.
ps -aux | grep kube-api
ps -aux | grep kube-api | grep "encryption-provider-config"
만약 ps -aux | grep kube-api | grep "encryption-provider-config" 명령어의 결과가 반환되지 않으면, 옵션이 구성되지 않았다는 말이다.
- 즉, 아래와 같이 옵션을 구성하면 된다.
head -c 32 /dev/urandom | base64
6번 과정에서 생성한 암호화 키를 secret에 붙여넣는다.
---
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
- configmaps
- pandas.awesome.bears.example
providers:
- aescbc:
keys:
- name: key1
secret: <위에서 생성한 암호화 키 복붙>
- identity: {}
mkdir /etc/kubernetes/enc
mv enc.yaml /etc/kubernetes/enc/
vi /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
containers:
- command:
- kube-apiserver
...
- --encryption-provider-config=/etc/kubernetes/enc/enc.yaml # add this line
volumeMounts:
...
- name: enc # add this line
mountPath: /etc/kubernetes/enc # add this line
readOnly: true # add this line
...
volumes:
...
- name: enc # add this line
hostPath: # add this line
path: /etc/kubernetes/enc # add this line
type: DirectoryOrCreate # add this line
...
파일을 수정 하고 나면 apiserver가 재구동된다.
기다리면 다시 다 재가동 될 것이다.
kubectl create secret generic my-secret2 -n default --from-literal=mykey=mydata
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
get /registry/secrets/default/my-secret2 | hexdump -C
이제 암호화가 된 모습을 확인할 수 있다.
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
ETCDCTL_API=3 etcdctl \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
get /registry/secrets/default/my-secret | hexdump -C
이제 이전에 만든 secret에 대해서
etcd 데이터를 확인해보면 암호화가 되어있음을 볼 수 있다.