API 서버의 이그레스 트래픽 제한

컨트롤 플레인 가상 머신 (VM) 인스턴스의 외부 IP 주소를 사용 중지하여 Google Kubernetes Engine(GKE) 컨트롤 플레인의 보안을 개선할 수 있습니다. 이 문서에서는 보안 엔지니어가 Kubernetes API 서버의 이그레스 트래픽을 제어하는 방법과 허용 웹훅의 잠재적 중단을 방지하는 방법을 보여줍니다.

다음 사항을 이미 잘 알고 있어야 합니다.

제한 수준

클러스터를 만들거나 업데이트할 때 다음 제한 수준 중 하나를 지정할 수 있습니다.

  • 트래픽 없음 (NONE): 각 컨트롤 플레인 VM 인스턴스의 외부 IP 주소를 사용 중지하고 모든 API 서버 이그레스 트래픽을 블랙홀로 라우팅합니다. 이 제한 수준은 다음과 같은 영향을 미칩니다.
    • GKE는 클러스터 외부에서 실행되는 허용 웹훅 서버로의 API 서버에서 직접 이그레스 트래픽을 차단합니다. URL 또는 IP 주소를 사용하여 웹훅 서버에 연결하는 모든 허용 웹훅이 영향을 받습니다.
    • GKE는 인터넷 및 Google Cloud 서비스를 포함한 외부 서비스로의 API 서버 에서 직접 이그레스 트래픽을 차단합니다. GKE 인증 및 메타데이터 서버와 같은 시스템 구성요소의 트래픽은 영향을 받지 않습니다.
    • 중요한 시스템 트래픽 또는 노드의 트래픽과 같은 다른 유형의 이그레스 트래픽은 영향을 받지 않습니다.
    • GKE는 ValidatingAdmissionPolicy를 사용하여 clientConfig.url 필드를 사용하는 ValidatingWebhookConfigurations 또는 MutatingWebhookConfigurations의 생성 또는 업데이트를 거부합니다.
  • 모든 트래픽 (VIA_CONTROL_PLANE): 각 컨트롤 플레인 인스턴스의 외부 IP 주소를 유지하고 API 서버에서 이그레스 트래픽에 IP 주소를 사용하도록 허용합니다. 이 옵션은 GKE의 기본값입니다.

제한사항

제한 수준을 NONE으로 설정하여 이그레스 트래픽을 사용 중지하면 클러스터에서 비공개로 사용되는 공개 IP (PUPI) 주소를 사용할 수 없습니다.

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
  • 버전 1.35.1-gke.1396000 이상을 실행하는 GKE Autopilot 또는 표준 클러스터가 있는지 확인합니다. Autopilot 클러스터를 만들 수도 있습니다.
  • 외부 웹훅 서버가 있는 경우 서비스 참조 를 사용하여 이러한 서버에 연결하는지 확인합니다. API 서버에서 이그레스 트래픽을 사용 중지하면 URL을 사용하여 웹훅 서버에 연결하는 웹훅이 실패합니다. GKE 관리 웹훅은 영향을 받지 않습니다.

API 서버의 이그레스 트래픽 맞춤설정

클러스터를 만들거나 업데이트할 때 API 서버의 이그레스 트래픽에 대한 제한 수준을 맞춤설정할 수 있습니다. 기존 클러스터를 업데이트하려면 --control-plane-egress 플래그를 사용하세요.

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --control-plane-egress=CONTROL_PLANE_EGRESS_MODE

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름입니다.
  • CONTROL_PLANE_LOCATION: 클러스터 컨트롤 플레인의 리전 또는 영역입니다(예: us-central1 또는 us-central1-a).
  • CONTROL_PLANE_EGRESS_MODE: API 서버의 이그레스 트래픽에 대한 제한 수준입니다. 다음 중 한 가지 값을 사용합니다.
    • NONE: 컨트롤 플레인 VM 인스턴스의 외부 IP 주소를 사용 중지하고 API 서버의 중요하지 않은 모든 이그레스 트래픽을 차단합니다. GKE는 clientConfig.url 필드를 사용하는 새 웹훅 구성의 생성을 방지합니다.
    • VIA_CONTROL_PLANE: 컨트롤 플레인 VM 인스턴스의 외부 IP 주소를 유지하고 API 서버의 이그레스 트래픽을 허용합니다. 기본값입니다.

이그레스 트래픽 제한 확인

GKE가 API 서버의 이그레스 트래픽을 차단하는지 확인하려면 다음 방법 중 하나를 사용하세요.

  • 클러스터 구성 확인:

    gcloud container clusters describe CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --format='value(controlPlaneEgress)'
    

    출력은 다음 중 하나입니다.

    • NONE: 이그레스 트래픽이 제한됩니다.
    • VIA_CONTROL_PLANE: 이그레스 트래픽이 제한되지 않습니다.
  • 새 웹훅에 대한 변경사항의 영향을 확인하려면 clientConfig.url 필드를 사용하는 웹훅 구성을 만들어 보세요.

    cat <<EOF | kubectl apply -f -
    apiVersion: admissionregistration.k8s.io/v1
    kind: MutatingWebhookConfiguration
    metadata:
      name: test-webhook-config
    webhooks:
    - name: my-webhook.example.com
      clientConfig:
        url: "https://my-webhook.example.com:9443/my-webhook-path"
    

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

    ValidatingAdmissionPolicy 'gke-restrict-webhook-url' denied request: Egress
    traffic from the API server through the control plane is disabled. As a
    result, direct API server calls to external webhook servers are blocked.
    To connect to external webhooks, update any webhook configurations that use
    clientConfig.url to use clientConfig.service instead.
    

    이 출력은 GKE ValidatingAdmissionPolicy가 clientConfig.url 필드를 사용하여 웹훅 구성을 만들거나 업데이트하지 못하도록 방지함을 나타냅니다. ValidatingAdmissionPolicy를 삭제하면 구성을 만들거나 업데이트할 수 있지만 허용 요청이 웹훅 서버에 도달하지 않습니다.

  • 클러스터의 기존 웹훅에 대한 변경사항의 영향을 확인하려면 클러스터 외부의 IP 주소로 직접 요청을 보내 보세요.

    1. 클러스터에 API_SERVER 로그 를 사용 설정합니다.
    2. gke-restrict-webhook-url ValidatingAdmissionPolicy를 삭제합니다.

      kubectl delete validatingadmissionpolicy gke-restrict-webhook-url
      

      ValidatingAdmissionPolicy를 삭제하면 clientConfig.url 필드를 사용하여 웹훅 구성을 만들거나 업데이트할 수 있습니다. 클러스터는 ValidatingAdmissionPolicy를 자동으로 다시 생성하므로 이 우회는 일시적입니다.

    3. ValidatingWebhookConfiguration 또는 MutatingWebhookConfiguration의 clientConfig.url 필드에서 요청을 보낼 IP 주소 또는 URL을 지정합니다. http://example.com 또는 203.0.113.100과 같은 예시 값을 사용할 수 있습니다.

    4. API 서버 로그에서 다음과 같은 오류 메시지를 확인합니다.

      Error from server (InternalError): error when creating "STDIN":
        Internal error occurred: failed calling webhook
        WEBHOOK_NAME": failed to call
        webhook: Post "WEBHOOK_URL":
        proxyconnect tcp: dial tcp: lookup master-internet-access-unavailable.localhost
        on 169.254.169.254:53: no such host
      

      이 출력은 ValidatingAdmissionPolicy가 삭제되더라도 허용 요청이 서버 IP 주소 또는 URL을 사용하여 웹훅 서버에 도달할 수 없음을 나타냅니다.

컨트롤 플레인 VM 인스턴스의 외부 IP 주소를 사용 중지하면 GKE는 URL을 사용하여 외부 웹훅 서버에 연결하는 웹훅으로의 트래픽을 차단합니다. 웹훅 구성에서 clientConfig.service 필드를 사용하여 API 서버에서 사용할 대체 경로를 설정해야 합니다. 자세한 내용은 외부 웹훅 구성을 참조하세요.

다음 단계