본문으로 건너뛰기
K08: Cluster to Cloud — 클러스터에서 클라우드 인프라로의 침해

K08: Cluster to Cloud — 클러스터에서 클라우드 인프라로의 침해

현대의 쿠버네티스는 클라우드(AWS, GCP, Azure 등) 위에서 돌아가는 경우가 많습니다. 가장 위험한 시나리오는 공격자가 Pod에 침투한 뒤 클라우드 인프라의 권한까지 탈취해 클라우드 계정 전체를 장악하는 것입니다. K08은 이 위험한 횡적 이동을 방어하는 방법을 다룹니다.

미션: 메타데이터 서비스(IMDS) 탈취

클라우드 인스턴스 위에서 실행되는 Pod는 기본적으로 클라우드 메타데이터 서비스(예: 169.254.169.254)에 접근할 수 있습니다. 이 서비스에는 인스턴스의 IAM 권한 정보(토큰)가 포함되어 있습니다.

1. 취약한 상태 (공격 시나리오)

# Pod 설정에 별다른 제약이 없음
# 공격자가 Pod에 침투한 뒤 다음 명령을 실행하면:
# curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>
# 🚨 위험: 클라우드 권한 토큰을 탈취하여 클라우드 인프라 제어권 확보 가능

분석: Pod가 클라우드 메타데이터 서비스 IP에 직접 접근할 수 있으면, 공격자는 이를 통해 해당 노드가 가진 클라우드 IAM 권한을 그대로 도용할 수 있습니다.

2. 해결책 코드 (fixed.yaml)

NetworkPolicy로 메타데이터 서비스로의 접근을 원천 차단합니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: block-cloud-metadata
spec:
  podSelector: {} # 모든 Pod에 적용
  egress:
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0
            except:
              - 169.254.169.254/32 # ✅ 개선: 메타데이터 서비스 IP만 접근 차단

분석: 특정 IP(메타데이터 서비스)로 향하는 모든 egress(나가는) 트래픽을 차단합니다. Pod 내부에서 공격자가 curl을 시도해도 네트워크 수준에서 거부되어 토큰을 탈취할 수 없습니다.

이 방어는 K05: Network Segmentation과 동일한 메커니즘(NetworkPolicy)을 쓰지만 목적이 다릅니다. K05가 “Pod 간” 통신을 막는다면, K08은 “Pod → 클라우드 인프라” 통신을 막습니다. 클라우드 제공사에 따라 IMDSv2 강제(AWS), Workload Identity(GCP), 또는 노드 단의 메타데이터 프록시 같은 더 근본적인 대책도 병행해야 합니다. NetworkPolicy 하나만으로는 CNI가 이를 지원하지 않으면 무력화됩니다.

실습: 공격 → 방어 검증

1) 공격 — Pod 내부에서 IAM 토큰 탈취

kubectl exec -it victim-pod -- curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>
# {"AccessKeyId": "...", "SecretAccessKey": "...", "Token": "..."} — 그대로 노출

2) 방어 — NetworkPolicy 적용 후 재확인

kubectl apply -f fixed.yaml
kubectl exec -it victim-pod -- curl -m 3 -s http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>
# curl: (28) Connection timed out after 3000 milliseconds

체크리스트

  • Pod에서 169.254.169.254(클라우드 메타데이터 IP)로의 egress가 기본적으로 차단되어 있는가
  • IMDSv2(AWS) 또는 이에 준하는 세션 기반 메타데이터 접근이 강제되어 있는가
  • Pod가 필요 이상의 노드 IAM 역할을 상속받고 있지 않은가 (Pod별 IAM — IRSA, Workload Identity 등으로 분리했는가)
  • 메타데이터 서비스에 대한 비정상적인 접근 시도가 로깅·알림되는가

“Pod가 내가 모르는 클라우드 자원에 접근하게 두지 마라"는 클라우드 네이티브 보안의 핵심 원칙을 배우는 미션입니다. 다음 미션(K09: Authentication)에서는 클러스터의 ‘출입문’ 자체, 즉 누가 API 서버에 접속할 수 있는지를 다룹니다.