1. Secret 이란?
- Secret은 암호, 토큰 또는 키와 같은 중요한 데이터를 포함하는 오브젝트이다.
- Secret은 기본적으로 ETCD에 저장되며, K8s API Server를 통해 파드 내 컨테이너로 전달된다.
- 기본적으로 API 서버의 기본 데이터 저장소인 ETCD에 암호화되지 않은 상태로 저장된다.
- 이에, API 또는 ETCD에 접근할 수 있는 모든 사용자는 시크릿을 조회하거나 수정할 수 있다.
2. Secret 생성 및 조회
2-1. Secret 생성
- 생성한 Secret 값을 확인해 보면 Secret은 base64로 인코딩만 되고 암호화되지 않는 것을 확인할 수 있다.
# Secret 생성
kubectl create secret generic secret01 --from-literal username=admin
kubectl create secret generic secret02 --from-literal password=qwer123
# 생성한 Secret 확인
k get secret
# 생성한 Secret 값 확인
demouser@master-1:~/yaml$ kubectl get secret secret02 -o jsonpath='{.data}'
{"password":"cXdlcjEyMw=="}
# Secret 디코딩
demouser@master-1:~/yaml$ echo 'cXdlcjEyMw==' | base64 --decode
qwer123d
2-2. Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: mycontainer
image: redis
# Secret을 환경변수 형태로 사용
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: secret01
key: username
optional: false
# Secret을 볼륨으로 마운트하여 사용
volumeMounts:
- name: secret02
mountPath: "/etc/secret02"
readOnly: true
volumes:
- name: secret02
secret:
secretName: secret02
2-3. API에 접근할 수 있는 사용자의 Secret 조회
- 간단한 명령어로 컨테이너에 저장되어 있는 환경변수 또는 파일 형태의 Secret 값을 확인할 수 있다.
kubectl exec -it secret-pod -- env | grep SECRET
kubectl exec -it secret-pod -- cat /etc/secret02/password
kubectl get secrets secret01 -o yaml
2-4. ETCD에 접근할 수 있는 사용자의 Secret 조회
- ETCD 서버와 상호작용하기 위한 명령줄 도구인 etcdctl을 사전에 설치한다. (※ etcdctl 설치 가이드)
- etcdctl을 사용하여 ETCD 서버에 연결한 후 ETCD에 저장된 Secret 데이터를 확인한다.
- kubespray를 사용하여 k8s를 설치한 경우 etcd는 pod 형태가 아닌 systemd로 실행되기 때문에, --cacert, --cert, --key 값은 하기 이미지와 같이 /etcd/etcd.env에서 확인할 수 있다.
- 일반적인 경우 /etc/kubernetes/manifest.etcd.yaml에서 확인 가능하다.
- 하기 명령어를 실행하면 Secret의 데이터가 확인된다.
ETCDCTL_API=3 etcdctl \
--cert /etc/ssl/etcd/ssl/admin-master-1.pem \
--key /etc/ssl/etcd/ssl/admin-master-1-key.pem \
--cacert /etc/ssl/etcd/ssl/ca.pem \
get /registry/secrets/default/secret01 | hexdump -C
3. Secret 데이터 암호화의 필요성
- 본 테스트를 통해, API에 접근할 수 있는 사용자라면 간단한 명령어로 컨테이너에 저장되어 있는 Secret 값을 확인할 수 있다는 점을 알 수 있다.
- 또한, Control Plane Node에 루트 권한을 가진 사용자라면 ETCD를 접근하여 모든 Secret 값을 확인할 수 있기 때문에 보안에 매우 취약하다.
- 이를 해결하기 위해 ETCD에 저장된 Secret 데이터의 암호화 설정이 필요하다.
참고 사이트
'Container > Kubernetes' 카테고리의 다른 글
[Kubernetes] Secret 데이터 암호화 (0) | 2024.05.13 |
---|---|
[Kubernetes] ConfigMap, Secret, Azure Keyvault (0) | 2024.05.07 |
[Kubernetes] Kubespray로 쿠버네티스 설치 (1) | 2024.05.02 |
[Kubernetes] ELK Stack 개념 (0) | 2024.04.29 |
[Kubernetes] Probe - Liveness, Readiness, Startup (0) | 2024.04.08 |