Google Kubernetes Engine(GKE)은 인스턴스 메타데이터를 사용하여 노드 가상 머신(VM)을 구성하지만, 이 메타데이터 중 일부는 잠재적으로 민감한 데이터를 포함하며, 클러스터에서 실행되는 워크로드로부터 보호되어야 합니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
노드 서비스 계정 구성
각 노드의 서비스 계정 사용자 인증 정보는 워크로드에 계속 노출됩니다. 기본적으로 노드는 Compute Engine 기본 서비스 계정을 사용합니다. Compute Engine 기본 서비스 계정 대신 사용할 노드에 최소 권한이 부여된 서비스 계정을 구성해야 합니다. 그런 다음 공격자가 Compute Engine API를 사용하여 기본 VM 인스턴스에 직접 액세스해 GKE 메타데이터 보호를 우회할 수 없도록 서비스 계정을 노드에 연결합니다.
자세한 내용은 최소 권한 노드 서비스 계정 사용을 참조하세요.
최소 권한이 부여된 노드 서비스 계정을 만들려면 다음 단계를 수행합니다.
새 Identity and Access Management(IAM) 서비스 계정을 만들고 이메일 주소를 환경 변수에 저장합니다.
gcloud iam service-accounts create NODE_SA_NAME \ --display-name="DISPLAY_NAME" export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \ --filter='displayName:DISPLAY_NAME')
다음을 바꿉니다.
NODE_SA_NAME
: 새 노드 서비스 계정의 이름입니다.DISPLAY_NAME
: 새 서비스 계정의 표시 이름으로 바꿉니다.
노드 서비스 계정 이메일 주소의 형식은
NODE_SA_NAME@PROJECT_ID.iam.gserviceaccount.com
입니다.GKE 노드를 실행할 수 있는 최소 역할과 권한으로 서비스 계정을 구성합니다.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/monitoring.metricWriter gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/monitoring.viewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/logging.logWriter
PROJECT_ID
를 Google Cloud 프로젝트 ID로 바꿉니다.또한 클러스터가 Artifact Registry에서 비공개 이미지를 가져오는 경우
roles/artifactregistry.reader
역할을 추가합니다.gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/artifactregistry.reader
메타데이터 숨김
GKE 메타데이터 숨김은 사용자 포드가 kubelet 사용자 인증 정보를 포함하는 kube-env
및 VM의 인스턴스 ID 토큰에 액세스하는 것을 방지합니다.
메타데이터 숨김은 사용자 pod(HostNetwork
에서 실행되지 않는 pod)에서 클러스터 메타데이터 서버로 보내는 트래픽에 방화벽을 적용하여 안전한 쿼리만 허용합니다. 이 방화벽은 사용자 포드의 권한 에스컬레이션 공격을 위한 kubelet 사용자 인증 정보 사용 또는 인스턴스 승격 공격을 위한 VM ID 사용을 방해합니다.
GKE용 워크로드 아이덴티티 제휴는 메타데이터 숨김을 사용할 필요가 없으며 메타데이터 숨김이 제공하는 보호 기능을 확장합니다. 모든 상황에서 메타데이터 숨김 대신 GKE용 워크로드 아이덴티티 제휴를 사용해야 합니다. 자세한 내용은 GKE용 워크로드 아이덴티티 제휴 정보를 참고하세요.
메타데이터 숨김을 사용 설정하려면 gcloud beta container clusters create
명령어 또는 gcloud beta container node-pools create
명령어에서 지원 중단된 --workload-metadata=SECURE
옵션을 사용합니다.
제한사항
메타데이터 숨기기에는 다음과 같은 제한사항이 있습니다.
- 메타데이터 숨김은
kube-env
및 노드의 인스턴스 ID 토큰에 대한 액세스만 보호합니다. - 메타데이터 숨김은 노드의 서비스 계정에 대한 액세스를 제한하지 않습니다.
- 메타데이터 숨김은 다른 관련 인스턴스 메타데이터에 대한 액세스를 제한하지 않습니다.
- 메타데이터 숨김은 다른 이전 메타데이터 API에 대한 액세스를 제한하지 않습니다.
- 메타데이터 숨김은 호스트 네트워크에서 실행되는 포드의 트래픽을 제한하지 않습니다(포드 사양의
hostNetwork: true
).
기존 메타데이터 API 사용 중지 및 전환
v0.1
및 v1beta1
Compute Engine 메타데이터 서버 엔드포인트는 지원 중단되었고 2020년 9월 30일 종료되었습니다.
종료 일정은 v0.1
및 v1beta1
메타데이터 서버 엔드포인트 지원 중단을 참조하세요.