이번 포스팅에서는 Kubernetes 보안의 중요성을 강조하기 위해, 쿠버네티스를 해킹하여 secret 리소스에 저장된 비밀번호를 찾는 여러 가지 방법을 알아봅니다. 특히, etcd와 Pod를 해킹하는 실습으로 쿠버네티스 보안의 중요성을 알아보겠습니다.
Secret은 어디에 저장되나요?
먼저 사용자가 kubectl
명령을 통해 리소스를 선언하면, 쿠버네티스는 이 리소스를 정의한 메니페스트 파일을 만들어 etcd에 저장합니다. secret 또한 마찬가지로 사용자가 secret 리소스를 선언하면 etcd에 저장됩니다. 그리고 사용자가 secret을 볼륨 혹은 환경 변수로 읽는 pod을 만들게 되면, secret은 해당 pod에 저장되게 됩니다.
따라서 우리는 secret이 저장되는 etcd
와 secret이 사용되는 pod
을 해킹하면 secret에 저장된 비밀번호를 알아낼 수 있습니다.
사전 준비하기
EKS, AKS 등 관리형 쿠버네티스는 기본적인 보안이 매우 잘 되어있기 때문에 실습이 불가합니다. 따라서 이번 실습에서는 가장 기초적인 방법인 kubeadm을 통해 클러스터를 생성합니다.
또한 실습을 위해 세 가지 리소스를 미리 만듭니다.
Password: 1234
값을 가지는 secretcredit-card
- secret credit-card를 환경 변수로 받는 pod
app1
- secret credit-card를 volume(/var/lib/secret)으로 받는 pod
app2
apiVersion: v1
kind: Secret
metadata:
name: credit-card
type: Opaque
data:
password: MTIzNA== # "1234"의 base64 인코딩 값
---
apiVersion: v1
kind: Pod
metadata:
name: app1
spec:
containers:
- name: app1-container
image: app1-image
env:
- name: CREDIT_CARD_PASSWORD
valueFrom:
secretKeyRef:
name: credit-card
key: password
---
apiVersion: v1
kind: Pod
metadata:
name: app2
spec:
containers:
- name: app2-container
image: app2-image
volumeMounts:
- name: secret-volume
mountPath: /var/lib/secret
volumes:
- name: secret-volume
secret:
secretName: credit-card
1. etcd 해킹하기
etcd는 쿠버네티스의 클러스터 상태를 저장하는 키-값 데이터 저장소입니다. 쿠버네티스에 선언된 모든 정보가 여기에 저장되기 때문에 secret도 etcd를 조회해보면 알 수 있습니다. 이번 실습 환경에서는 etcd가 암호화되어 있지 않다는 것을 가정하고 진행합니다.
1.1. etcdctl로 비밀번호 찾기
이 방법은 만약 컨트롤 플레인의 정보가 노출되었고, etcd가 암호화되어 있지 않으며, etcd가 있는 서버에 접근할 수 있다는 많은 전제를 바탕으로 합니다.

/etc/kubernetes/manifests
디렉터리에는 쿠버네티스의 동작에 필수적인 정적 pod 메니페스트가 정의되어 있습니다. 그중 kube-apiserver의 메니페스트를 조회해 etcd 서버의 certificate authority(ca), 공개 키(cert)와 개인 키(key)를 가져옵니다.- etcd를 편하게 조작할 수 있는 etcdctl 명령을 통해 비밀번호를 찾습니다. 인증 정보가 손안에 있기 때문에 손쉽게 etcd 내부를 탐색할 수 있습니다.
1.2. etcd DB에 직접 접근해서 가져오기
etcd의 인증 정보는 모르지만, etcd가 존재하는 서버에 칩입했다고 가정해봅시다. etcd가 동작하는 프로세스를 찾고, 해당 프로세스의 데이터를 모두 탐색하면 원하는 비밀번호를 찾을 수 있습니다.

ps aux | grep etcd
- etcd의 PID를 가져옵니다.ll /proc/<pid>/fd
를 보면 db라고 적힌 link 파일이 보입니다.cat /proc/<pid>/fd/<db> | grep -A10 -B10 credit-card
명령을 통해 사전에 만들었던 비밀번호를 찾습니다. 넉넉하게 앞뒤로 10줄씩 추가로 출력합니 다.- (옵션) Binary file matches 오류가 뜨면 중간에
strings
를 넣어줍니다.
2. Pod 해킹하기
kubeconfig에 적절한 권한이 있거나, node에 직접 접근할 수 있다고 가정합니다.
2.1. kubectl exec을 통해서 가져오기
쿠버네티스를 조회하는 적절한 권한이 있다면, kubectl
명령을 통해 비밀번호를 가져올 수 있습니다. 가장 쉬운 방법입니다.
kubectl exec app1 -- env
kubectl exec app2 -- cat /var/lib/secret/Password