클러스터 메타데이터 보호


개요

Google Kubernetes Engine(GKE)은 인스턴스 메타데이터를 사용하여 노드 가상 머신(VM)을 구성하지만, 이 메타데이터 중 일부는 잠재적으로 민감한 데이터를 포함하며, 클러스터에서 실행되는 워크로드로부터 보호되어야 합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 다음 방법 중 하나를 사용하여 프로젝트의 기본 gcloud 명령줄 도구 설정을 지정합니다.
    • 프로젝트 기본값 설정 방법을 알아보려면 gcloud init를 사용합니다.
    • 프로젝트 ID, 영역, 리전을 개별적으로 설정하려면 gcloud config를 사용합니다.

    gcloud init

    1. gcloud init를 실행하고 다음 안내를 따르세요.

      gcloud init

      원격 서버에서 SSH를 사용하는 경우 --console-only 플래그를 사용하여 다음 명령어로 브라우저를 실행하지 못하게 할 수 있습니다.

      gcloud init --console-only
    2. 안내를 따라 gcloud 도구에서 Google Cloud 계정을 사용하도록 승인합니다.
    3. 새 구성을 만들거나 기존 구성을 선택합니다.
    4. Google Cloud 프로젝트를 선택합니다.
    5. 기본 Compute Engine 영역을 선택합니다.
    6. 기본 Compute Engine 리전을 선택합니다.

    gcloud config

    1. 기본 프로젝트 ID를 설정합니다.
      gcloud config set project PROJECT_ID
    2. 기본 Compute Engine 리전(예: us-central1)을 설정합니다.
      gcloud config set compute/region COMPUTE_REGION
    3. 기본 Compute Engine 영역(예: us-central1-c)을 설정합니다.
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud를 최신 버전으로 업데이트합니다.
      gcloud components update

    기본 위치를 설정하면 gcloud 도구에서 One of [--zone, --region] must be supplied: Please specify location과 같은 오류를 방지할 수 있습니다.

노드 서비스 계정 구성

각 노드의 서비스 계정 사용자 인증 정보는 워크로드에 계속 노출됩니다. 기본적으로 노드는 Compute Engine 기본 서비스 계정을 사용합니다. Compute Engine 기본 서비스 계정 대신 사용할 최소 권한만 있는 서비스 계정을 구성해야 합니다. 그런 후 서비스 계정을 노드에 연결하여, 공격자가 Compute Engine API를 사용해서 기본 VM 인스턴스에 직접 액세스하여 GKE 메타데이터 보호를 우회할 수 없도록 해야 합니다.

자세한 내용은 최소 권한 노드 서비스 계정 사용을 참조하세요.

최소 권한의 노드 서비스 계정을 만들려면 다음 단계를 수행하세요.

  1. 새 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입니다.

  2. 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 메타데이터 숨김은 클러스터에서 실행되는 사용자 워크로드에서 잠재적으로 민감한 시스템 메타데이터를 보호합니다.

Kubernetes v1.9.3 이상에서는 메타데이터 숨김을 사용 설정하여 사용자 포드가 kubelet 사용자 인증 정보 및 VM 인스턴스 정보와 같은 클러스터 노드에 대한 특정 VM 메타데이터에 액세스하는 것을 방지할 수 있습니다. 특히 메타데이터 숨김은 Kubelet 사용자 인증 정보를 포함하는 kube-env 및 VM의 인스턴스 ID 토큰에 대한 액세스를 보호합니다.

메타데이터 숨김은 사용자 pod(HostNetwork에서 실행되지 않는 pod)에서 클러스터 메타데이터 서버로 보내는 트래픽에 방화벽을 적용하여 안전한 쿼리만 허용합니다. 이 방화벽은 사용자 포드의 권한 에스컬레이션 공격을 위한 kubelet 사용자 인증 정보 사용 또는 인스턴스 승격 공격을 위한 VM ID 사용을 방해합니다.

새 클러스터를 만들거나 기존 클러스터에 새 노드 풀을 추가할 때만 메타데이터 숨김을 사용 설정할 수 있습니다.

제한사항

  • 메타데이터 숨김은 kube-env 및 노드의 인스턴스 ID 토큰에 대한 액세스만 보호합니다.
  • 메타데이터 숨김은 노드의 서비스 계정에 대한 액세스를 제한하지 않습니다.
  • 메타데이터 숨김은 다른 관련 인스턴스 메타데이터에 대한 액세스를 제한하지 않습니다.
  • 메타데이터 숨김은 다른 이전 메타데이터 API에 대한 액세스를 제한하지 않습니다.

메타데이터 숨김으로 새 클러스터 또는 노드 풀 만들기

서비스 계정을 만든 후 gcloud 명령줄 도구를 사용하여 메타데이터 숨김이 사용 설정된 상태로 새 클러스터를 만들 수 있습니다.

메타데이터 숨김이 사용 설정된 상태로 클러스터를 만들려면 다음 명령어를 실행합니다.

gcloud beta container clusters create CLUSTER_NAME \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL

CLUSTER_NAME을 새 클러스터 이름으로 바꿉니다.

--workload-metadata-from-node 플래그는 다음 값을 사용합니다.

  • SECURE: 메타데이터 숨김을 사용 설정합니다.
  • EXPOSED 또는 UNSPECIFIED: 메타데이터 숨김을 사용 중지합니다.

클러스터 워크로드에서 숨겨진 ID 토큰 메타데이터 확인

메타데이터를 숨기면 노드의 인스턴스 ID 토큰을 통해 서명을 요청할 수 없어야 합니다. 해당 요청이 숨겨진 메타데이터를 사용자에게 명시적으로 알리는지 확인하려면 포드 내에서 curl 명령어를 실행하면 됩니다.

curl -H "Metadata-Flavor: Google" \
'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.example.com'

출력은 다음과 비슷합니다.

This metadata endpoint is concealed.

기존 메타데이터 API 사용 중지 및 전환

v0.1v1beta1 Compute Engine 메타데이터 서버 엔드포인트가 지원 중단되었으며 2020년 9월 30일에 종료되었습니다.

종료 일정은 v0.1v1beta1 메타데이터 서버 엔드포인트 지원 중단을 참조하세요.

다음 단계