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 데이터의 암호화 설정이 필요하다.
참고 사이트
How to install Go on Ubuntu 22.04
Objective Go is one of the most famous programming languages in the world. Its wide adoption over the past years makes it an unavoidable language in the development world. To learn more about the full capabilities of the Go language refer to the official d
www.ovhcloud.com
시크릿(Secret)
시크릿은 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 포함하는 오브젝트이다. 이를 사용하지 않으면 중요한 정보가 파드 명세나 컨테이너 이미지에 포함될 수 있다. 시크릿을 사용한다
kubernetes.io
'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 |
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 데이터의 암호화 설정이 필요하다.
참고 사이트
How to install Go on Ubuntu 22.04
Objective Go is one of the most famous programming languages in the world. Its wide adoption over the past years makes it an unavoidable language in the development world. To learn more about the full capabilities of the Go language refer to the official d
www.ovhcloud.com
시크릿(Secret)
시크릿은 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 포함하는 오브젝트이다. 이를 사용하지 않으면 중요한 정보가 파드 명세나 컨테이너 이미지에 포함될 수 있다. 시크릿을 사용한다
kubernetes.io
'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 |