Certificated 도전/KCSA - Kubernetes

[KCSA] Kubernetes API 서버 우회 위험 및 대응 가이드

지추월자 2025. 3. 30. 09:42
반응형

 

🔐 Kubernetes API 서버 우회 위험 및 대응 가이드

📌 왜 중요한가?

  • Kubernetes API 서버는 클러스터의 중앙 관문이야.
  • 보안 로깅, 정책 적용(admission control) 등 많은 보안 기능들이 API 서버를 통해서만 작동함.
  • 그런데, 어떤 요소들은 이 API 서버를 우회해서 동작할 수 있어! → 이게 보안 구멍

1️⃣ Static Pod 우회

문제점

  • kubelet이 직접 파일시스템 또는 URL에서 static pod manifest를 읽어 실행
  • 이 방식은 API 서버를 거치지 않음 → admission controller나 audit log가 작동 안 함
  • hostPath 같은 민감한 리소스를 마운트할 수 있음
  • namespace가 유효하지 않으면 API에 표시되지도 않음 → 탐지 어려움

대응법

  • static Pod 기능은 정말 필요할 때만 켜기
  • 해당 디렉토리/URL의 쓰기 권한을 제한할 것
  • kubelet 설정 파일에 대한 접근도 제한
  • 정기적으로 파일 접근 감시 및 중앙 로그화

2️⃣ Kubelet API 우회

문제점

  • kubelet이 노드에서 포트 10250을 통해 HTTP API 제공
  • API 서버를 거치지 않고:
    • Pod 정보 보기
    • 로그 가져오기
    • 컨테이너 안에서 명령어 실행 가능!
  • 기본 설정은 익명 접근 허용이므로 매우 위험
  • Kubernetes audit log로 기록도 안 됨

대응법

  • RBAC으로 Node 객체의 서브 리소스 접근 제한
  • kubelet 포트는 신뢰된 IP만 접근 가능하도록 네트워크 레벨에서 제한
  • kubelet 인증 설정은 반드시 webhook 또는 certificate 모드로
  • kubelet의 read-only 포트는 비활성화

3️⃣ etcd API 직접 접근

문제점

  • etcd는 Kubernetes 전체 데이터를 저장함
  • 포트 2379에서 API 제공 → API 서버 외에는 접근할 필요 없음
  • 인증만 있고, 권한(authorization) 통제는 약함
  • etcd 인증서 있으면 모든 데이터를 읽거나 조작 가능
  • audit log, admission controller 모두 우회됨

대응법

  • etcd가 신뢰하는 인증서 발급기관(CA)은 etcd 전용으로만 사용
  • etcd 서버 인증서, API 서버의 etcd 클라이언트 인증서 비공개키 철저히 보호
  • etcd 포트는 네트워크 레벨에서 접근 제한 (IP 제한)

4️⃣ 컨테이너 런타임 소켓(socket) 접근

문제점

  • kubelet이 사용하는 컨테이너 런타임 소켓은 주로 Unix socket (/run/containerd/containerd.sock 등)
  • 이 소켓에 접근하면:
    • 컨테이너 조작
    • 새 컨테이너 실행 가능
  • 공격자가 static pod처럼 악용 가능

대응법

  • 런타임 소켓 파일은 루트(root) 사용자만 접근 가능하도록 제한
  • kubelet과 다른 컴포넌트는 namespace 등으로 격리
  • hostPath로 소켓이 노출되지 않도록 방지, 부득이할 경우 읽기 전용
  • 노드에 SSH 등으로 직접 접근은 철저히 제한 (특히 root 권한)

✅ 정리: 우회 경로와 방어 전략

우회 수단 위험 방어 방법

Static Pod API 서버 우회, 감시 어려움 필요 시에만 사용, 디렉토리 접근 제어
Kubelet API Pod 로그/exec, 익명 접근 위험 인증 설정 변경, 포트 접근 제한
etcd API 전체 데이터 접근, 인증서만 있으면 조작 가능 인증서 철저히 관리, 네트워크 제한
컨테이너 런타임 소켓 컨테이너 탈출 가능성 소켓 접근 제한, hostPath 마운트 주의

🎯 클러스터 운영자가 해야 할 핵심 체크리스트

  • kubelet static pod 기능 꺼져 있거나, 접근 제한 OK
  • kubelet 포트 10250은 인증 설정되어 있고, 외부 접근 제한됨
  • etcd 포트는 오직 API 서버만 접근 가능
  • etcd 인증서/키는 안전하게 저장됨
  • 컨테이너 런타임 소켓은 root만 접근 가능
  • hostPath 마운트는 제한되었고, 필요한 경우 readOnly로 설정됨

 

반응형