KCSA — 쿠버네티스 보안 어소시에이트 · 진짜 클러스터에서 훔쳐 보기 · 실습
공격자의 눈으로 클러스터를 연다
이 실습은 진짜 클러스터에서 돕니다
KCSA 는 위협 모델과 공격 표면입니다. 그것을 배우려면 실제로 훔쳐 봐야
합니다 — 저장소에서 평문을 꺼내고, 권한이 없는데도 시크릿을 읽어 내고,
감사 로그에 그 흔적이 남는 것을 봅니다.
가짜 클러스터에는 저장소도 apiserver 인증 체인도 감사 로그도 없어서, 이
전부가 글로만 남아 있었습니다. base64 는 암호화가 아니다 를 말로 듣는
것과 저장소에서 평문을 꺼내 보는 것은 다릅니다.
CKS 와 겹치지 않게 합니다. CKS 는 막는 실습이고, 여기 KCSA 는 **왜
막아야 하는지**를 공격으로 보여 줍니다.
처음 뜨는 데 2분쯤 걸립니다.
단계
1. 시크릿을 만들고 저장소에서 평문으로 꺼내 /root/kcsa/plaintext.txt 에 담으세요.
2. 저장 데이터 암호화를 켜고, 평문이 사라지는 것을 /root/kcsa/encrypt.txt 에 담으세요.
3. 옛 시크릿은 다시 써야 암호화되는 것을 /root/kcsa/rewrite.txt 에 담으세요.
4. 시크릿 권한이 없는 SA 가 파드로 시크릿을 훔치는 것을 /root/kcsa/escalate.txt 에 담으세요.
5. 익명·기본 SA 로 apiserver 를 두드려 인증 경계를 /root/kcsa/anon.txt 에 담으세요.
6. 감사 정책을 켜고 위 공격이 로그에 남는 것을 /root/kcsa/audit.txt 에 담으세요.
7. 지금까지를 4C 와 STRIDE 로 정리해 /root/kcsa/model.txt 에 담으세요.
8. /root/kcsa/report.md 에 plaintext_found=yes, encrypted=yes, audit_lines= 세 줄과 설명을 쓰세요.
참고
- 저장소는
/var/lib/rancher/k3s/server/db/state.db입니다.sqlite3로 직접 엽니다. - 값은 base64 가 아니라 raw 로 들어갑니다.
hex(value)로 꺼내 평문을 찾으세요. - apiserver 를 다시 띄우면
kubectl get --raw=/readyz가ok가 될 때까지 기다리세요. - 흔한 오해: 암호화를 켜면 옛 시크릿도 암호화된다는 것. 다시 써야 바뀝니다.
- 흔한 오해:
can-i get secrets가 no 면 안전하다는 것. 파드를 만들 수 있으면 마운트로 읽어 냅니다.
단계 8개
- base64 는 암호화가 아니다
- 저장 데이터 암호화를 켠다
- 옛 시크릿은 다시 써야 바뀐다
- 권한이 없어도 파드면 읽는다
- 인증 경계를 두드린다
- 남기지 않으면 없었던 일이 된다
- 4C 와 STRIDE 로 정리한다
- 무엇을 배웠나