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 또는 Standard 클러스터가 있는지 확인합니다. 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 서버가 사용할 대체 경로를 설정해야 합니다. 자세한 내용은 외부 웹훅 구성을 참고하세요.

다음 단계