kubectl create secret generic my-secret --from-literal=key1=supersecret
kubectl get secret
kubectl describe secret my-secret
kubectl get secret my-secret -o yaml
echo "key" | base64 --decode
이번 강의에서는 encoding 을 중요하게 다루지는 않는다.
etcd에 데이터가 어떻게 저장되는지에 초점을 맞추어 학습해보자!
이를 확인하기 전에 etcd 명령을 사용할 수 있어야 한다.
etcdctl
설치apt-get install etcd-client
etcd는 pod 형태로 실행되고 있다.
kubectl get pods -n kube-system
앞에서 생성한 secret my-secret
이 etcd에 어떻게 저장되어 있는지 확인하려고 한다.
이 명령을 실행하기 위해서는 인증키가 필요하다.
ca.crt
, server.crt
, server.key
가 해당 경로에 있는지 확인해야 한다. (kubernetes 클러스터 생성 시 키가 함께 생성된다.)
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
확인해보면 데이터는 암호화되지 않은 평문 그대로 저장되는 것을 알 수 있다.
즉, etcd에 접근하는 사용자는 누구든지 모든 secret을 볼 수 있기 때문에 보안 측면의 문제가 발생할 수 있다.
따라서 이 문제를 해결해야 한다!!!
먼저 암호화 주소가 이미 활성화 되어 있는지 여부를 확인해야 한다.
이것은 kube-apiserver의 옵션인 --encryption-provider-config
를 통해 수행된다.
실행되고 있는 프로세스에서 kube-apiserver에 대한 내용을 확인해보자.
ps -aux | grep kube-api
이제 옵션들 중 --encryption-provider-config
옵션이 활성화 되어 있는지 확인해보자.
--encryption-provider-config
옵션 확인하기ps -aux | grep kube-api | grep "--encryption-provider-config"
커맨드 결과를 반환하지 않는다는 것은 옵션이 활성화되지 않았다는 의미이다.
kube-apiserver의 정의 파일 내용으로 활성화된 옵션을 확인할 수 있다.
ls /etc/kubernetes/manifests/
vi /etc/kubernetes/manifests/kube-apiserver.yaml
...
...
--encryption-provider-config
옵션이 존재하지 않는 것을 확인할 수 있다.
EncryptionConfiguration
생성