이번 포스팅에서는 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