애플리케이션 부하 분산기의 승인 정책 설정

이 페이지에서는 애플리케이션 부하 분산기의 승인 정책을 설정하는 방법을 보여줍니다.

시작하기 전에

부하 분산기 설정

부하 분산기를 만들지 않았으면 다음 페이지를 참조하여 원하는 애플리케이션 부하 분산기를 설정합니다.

승인 정책 만들기

승인 정책을 만들려면 대상과 규칙을 정의하는 YAML 파일을 만든 후 gcloud network-security authz-policies 명령어를 사용하여 파일을 가져옵니다.

이 섹션에서는 부하 분산기의 전달 규칙에 연결된 여러 유형의 승인 정책을 만드는 방법을 안내합니다.

요청을 거부하는 승인 정책

이 섹션에서는 특정 요청 속성에 따라 요청을 거부하는 승인 정책의 예시를 제공합니다.

전역

전역 외부 애플리케이션 부하 분산기를 사용하는 경우 다음 단계에 따라 IP 주소 범위를 기반으로 요청을 거부하는 승인 정책을 만들고 가져옵니다.

  1. 특정 요청을 거부하는 승인 정책 YAML 파일을 만듭니다.

    다음 예시에서는 global 위치에 전달 규칙 LB_FORWARDING_RULE에 대한 authz-policy-deny.yaml 파일을 만듭니다. 이 정책은 10.0.0.0/24 범위의 IP 주소가 있는 클라이언트가 /api/payments URL 경로에 액세스하는 것을 거부합니다.

    cat >authz-policy-deny.yaml <<EOF
    name: my-authz-policy-deny
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
    - from:
        sources:
        - ipBlocks:
          - prefix: "10.0.0.0"
            length: "24"
    - to:
        operations:
        - paths:
          - prefix: "/api/payments"
    action: DENY
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 전역 외부 애플리케이션 부하 분산기의 경우 스키마를 EXTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  2. 승인 정책을 만들고 YAML 파일을 가져옵니다.

    다음 명령어 예시는 이전에 만든 정책 파일을 가져와 승인 정책을 만듭니다.

    gcloud network-security authz-policies import my-authz-policy-deny \
        --source=authz-policy-deny.yaml \
        --location=global
    

리전 간

교차 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 다음 단계에 따라 클라이언트 인증서 주 구성원을 기반으로 요청을 거부하는 승인 정책을 만들고 가져옵니다.

  1. 특정 요청을 거부하는 승인 정책 YAML 파일을 만듭니다.

    다음 예시에서는 global 위치에 전달 규칙 LB_FORWARDING_RULE에 대한 authz-policy-deny.yaml 파일을 만듭니다. 이 정책은 클라이언트 인증서 DNS 이름 SAN에 www.example.com이 있는 클라이언트의 /api/payments URL 경로에 대한 액세스를 거부합니다.

    cat >authz-policy-deny.yaml <<EOF
    name: my-authz-policy-deny
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
    - from:
        sources:
        - principals:
          - principalSelector: CLIENT_CERT_DNS_NAME_SAN
            principal:
              exact: "www.example.com"
      to:
        operations:
        - paths:
          - prefix: "/api/payments"
    action: DENY
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 교차 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  2. 승인 정책을 만들고 YAML 파일을 가져옵니다.

    다음 명령어 예시는 이전에 만든 정책 파일을 가져와 승인 정책을 만듭니다.

    gcloud network-security authz-policies import my-authz-policy-deny \
        --source=authz-policy-deny.yaml \
        --location=global
    

리전

리전 외부 애플리케이션 부하 분산기 또는 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 다음 단계에 따라 클라이언트 인증서 주 구성원을 기반으로 요청을 거부하는 승인 정책을 만들고 가져옵니다.

  1. 특정 요청을 거부하는 승인 정책 YAML 파일을 만듭니다.

    다음 예시는Google Cloud 리전에 전달 규칙 LB_FORWARDING_RULEauthz-policy-deny.yaml 파일을 만듭니다. 이 정책은 클라이언트 인증서 DNS 이름 SAN에 www.example.com이 있는 클라이언트의 /api/payments URL 경로에 대한 액세스를 거부합니다.

    cat >authz-policy-deny.yaml <<EOF
    name: my-authz-policy-deny
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    httpRules:
    - from:
        sources:
        - principals:
          - principalSelector: CLIENT_CERT_DNS_NAME_SAN
            principal:
              exact: "www.example.com"
      to:
        operations:
        - paths:
          - prefix: "/api/payments"
    action: DENY
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 리전 외부 애플리케이션 부하 분산기의 경우 스키마를 EXTERNAL_MANAGED로 설정합니다. 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LOCATION: Google Cloud 리전입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  2. 승인 정책을 만들고 YAML 파일을 가져옵니다.

    다음 명령어 예시는 이전에 만든 정책 파일을 가져와 LOCATION 리전에 승인 정책을 만듭니다.

    gcloud beta network-security authz-policies import my-authz-policy-deny \
        --source=authz-policy-deny.yaml \
        --location=LOCATION
    

요청을 허용하는 승인 정책

이 섹션에서는 특정 IP 주소 범위에서 시작된 요청을 허용하는 승인 정책 예시를 제공합니다.

전역 및 교차 리전

전역 외부 애플리케이션 부하 분산기나 교차 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 다음 단계를 수행하여 승인 정책을 만들고 가져옵니다.

  1. 특정 요청을 허용하는 승인 정책 YAML 파일을 만듭니다.

    다음 예시에서는 global 위치에 전달 규칙 LB_FORWARDING_RULE에 대한 authz-policy-allow.yaml 파일을 만듭니다. 이 정책은 10.0.0.0/24 범위의 IP 주소가 있는 클라이언트가 /api/payments URL 경로에 액세스하도록 허용합니다.

    cat >authz-policy-allow.yaml <<EOF
    name: my-authz-policy-allow
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
    - from:
        sources:
        - ipBlocks:
          - prefix: "10.0.0.0"
            length: "24"
      to:
        operations:
        - paths:
          - exact: "/api/payments"
    action: ALLOW
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 전역 외부 애플리케이션 부하 분산기의 경우 스키마를 EXTERNAL_MANAGED로 설정합니다. 교차 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  2. 승인 정책을 만들고 YAML 파일을 가져옵니다.

    다음 명령어 예시는 이전에 만든 정책 파일을 가져와 승인 정책을 만듭니다.

    gcloud network-security authz-policies import my-authz-policy-allow \
        --source=authz-policy-allow.yaml \
        --location=global
    

리전

리전 외부 애플리케이션 부하 분산기나 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 다음 단계를 수행하여 승인 정책을 만들고 가져옵니다.

  1. 특정 요청을 허용하는 승인 정책 YAML 파일을 만듭니다.

    다음 예시에서는 특정 Google Cloud 리전에서 전달 규칙 LB_FORWARDING_RULEauthz-policy-allow.yaml 파일을 만듭니다. 이 정책은 10.0.0.0/24 범위의 IP 주소가 있는 클라이언트가 /api/payments URL 경로에 액세스하도록 허용합니다.

    cat >authz-policy-allow.yaml <<EOF
    name: my-authz-policy-allow
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    httpRules:
    - from:
        sources:
        - ipBlocks:
          - prefix: "10.0.0.0"
            length: "24"
      to:
        operations:
        - paths:
          - exact: "/api/payments"
    action: ALLOW
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 리전 외부 애플리케이션 부하 분산기를 사용하는 경우 스키마를 EXTERNAL_MANAGED로 설정합니다. 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LOCATION: Google Cloud 리전입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  2. 승인 정책을 만들고 YAML 파일을 가져옵니다.

    다음 명령어 예시는 이전에 만든 정책 파일을 가져와 LOCATION 리전에 승인 정책을 만듭니다.

    gcloud beta network-security authz-policies import my-authz-policy-allow \
        --source=authz-policy-allow.yaml \
        --location=LOCATION
    

서비스 계정 또는 태그 기반의 승인 정책

다양한 Google Cloud 리소스에 연결된 서비스 계정 또는 보안 태그 기반의 승인 정책을 적용할 수 있습니다.

이 예에서는 다음 작업을 완료했다고 가정합니다.

서비스 계정

  1. 특정 요청을 거부하는 승인 정책 YAML 파일을 만듭니다.

    다음 예시에서는 리전 내부 애플리케이션 부하 분산기의 전달 규칙 LB_FORWARDING_RULE에 대해 authz-policy-deny.yaml 파일을 만듭니다. 이 정책은 /api/payments 경로에 도달하기 위해 서비스 계정으로 my-sa-123@PROJECT_ID.iam.gserviceaccount.com를 사용하는 Compute Engine VM과 같은 Google Cloud 리소스의 요청을 거부하도록 구성되어 있습니다.

    cat >authz-policy-deny.yaml <<EOF
    name: my-authz-policy-deny
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    httpRules:
    - from:
        sources:
        - resources:
           - iamServiceAccount:
               exact: "my-sa-123@PROJECT_ID.iam.gserviceaccount.com"
      to:
        operations:
        - paths:
          - prefix: "/api/payments"
    action: DENY
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LOCATION: Google Cloud 리전입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  2. 승인 정책을 만들고 YAML 파일을 가져옵니다.

    다음 명령어 예시는 이전에 만든 정책 파일을 가져와 지정된 Google Cloud 리전에 승인 정책을 만듭니다.

    gcloud beta network-security authz-policies import my-authz-policy-deny \
        --source=authz-policy-deny.yaml \
        --location=LOCATION
    

    LOCATION을 현재 Google Cloud 리전으로 바꿉니다.

태그

  1. 특정 요청을 허용하는 승인 정책 YAML 파일을 만듭니다.

    다음 예시에서는 리전 내부 애플리케이션 부하 분산기의 전달 규칙 LB_FORWARDING_RULE에 대해 authz-policy-allow.yaml 파일을 만듭니다. 이 정책은 보안 태그 값 TAG_VALUE_PERMANENT_ID이 있는 Compute Engine VM과 같은 Google Cloud 리소스에서 시작되는 요청만 /api/payments URL 경로에 액세스하도록 허용합니다.

    cat >authz-policy-allow.yaml <<EOF
    name: my-authz-policy-allow
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    httpRules:
    - from:
      sources:
        resources:
        - tagValueIdSet:
          - ids: "TAG_VALUE_PERMANENT_ID"
      to:
        operations:
        - paths:
          - exact: "/api/payments"
    action: ALLOW
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LOCATION: Google Cloud 리전입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
    • TAG_VALUE_PERMANENT_ID: 태그 값의 영구 ID입니다.
  2. 승인 정책을 만들고 YAML 파일을 가져옵니다.

    다음 명령어 예시는 이전에 만든 정책 파일을 가져와 지정된Google Cloud 리전에 승인 정책을 만듭니다.

    gcloud beta network-security authz-policies import my-authz-policy-allow \
        --source=authz-policy-allow.yaml \
        --location=LOCATION
    

    다음을 바꿉니다.

    • LOCATION: Google Cloud 리전입니다.

승인 결정을 위임하는 승인 정책

이 섹션의 예에서는 Service Extensions를 통해 승인 결정을 다음 서비스에 위임하는 승인 정책을 만듭니다.

사용자 관리 서비스에 승인 결정 위임

승인 확장 프로그램인 Service Extensions를 통해 승인 결정을 사용자 관리 서비스에 위임하도록 승인 정책을 구성할 수 있습니다.

  • 전역 및 교차 리전 부하 분산기의 경우 승인 확장 프로그램은 사용자 관리 Google Cloud 백엔드 서비스에서 실행할 수 있습니다.

  • 리전 부하 분산기의 경우 승인 확장 프로그램은 사용자 관리 Google Cloud 백엔드 서비스와 FQDN 기반 서비스 모두에서 실행할 수 있습니다.

이 예시 설정에서는 authz-service이라는 사용자 관리형 Google Cloud 백엔드 서비스(콜아웃 백엔드 서비스라고도 함)를 만들었다고 가정합니다. 만드는 방법을 자세히 알아보려면 사용자 관리 호출 백엔드 서비스 구성을 참고하세요.

FQDN 기반 서비스의 경우 이 예시 설정에서는 커스텀 서비스가 자체 VPC에 배포되고, ext_authz 프로토콜을 지원하며, 정규화된 도메인 이름 mycustomauthz.internal.net으로 액세스할 수 있다고 가정합니다.

전역 및 교차 리전

전역 외부 애플리케이션 부하 분산기 또는 교차 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 다음 단계에 따라 승인 결정을 사용자 관리 서비스에 위임합니다.

  1. YAML 파일에서 승인 확장 프로그램을 정의합니다. 승인 확장 프로그램은 백엔드 서비스 (authz-service)에서 실행되며 ext_authz 프로토콜을 지원합니다.

    cat >authz-extension.yaml <<EOF
    name: my-authz-ext
    authority: ext11.com
    loadBalancingScheme: LB_SCHEME
    service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/authz-service
    forwardHeaders:
      - Authorization
    failOpen: false
    timeout: "0.1s"
    wireFormat: EXT_AUTHZ_GRPC
    EOF
    
  2. gcloud service-extensions authz-extensions import 명령어를 사용하여 승인 확장 프로그램 YAML 파일을 가져와 승인 확장 프로그램을 만듭니다.

    gcloud service-extensions authz-extensions import my-authz-ext \
        --source=authz-extension.yaml \
        --location=global
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 전역 외부 애플리케이션 부하 분산기의 경우 스키마를 EXTERNAL_MANAGED로 설정합니다. 교차 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
  3. YAML 파일에서 승인 정책을 정의합니다. 승인 정책은 customProvider 필드의 승인 확장 프로그램에 승인을 위임합니다.

    이 정책은 요청에 비어 있지 않은 Authorization 헤더가 포함된 경우 example.com/api/payments URL 경로를 향하는 모든 트래픽에 대해 my-authz-ext 승인 확장 프로그램을 호출합니다.

    cat >authz-policy-custom.yaml <<EOF
    name: my-authz-policy-custom
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
    - to:
        operations:
        - hosts:
          - exact: "example.com"
        - paths:
          - exact: "/api/payments"
      when: 'request.headers["Authorization"] != ""'
    action: CUSTOM
    customProvider:
      authzExtension:
        resources:
        - "projects/PROJECT_ID/locations/global/authzExtensions/my-authz-ext"
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 전역 외부 애플리케이션 부하 분산기의 경우 스키마를 EXTERNAL_MANAGED로 설정합니다. 교차 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  4. gcloud network-security authz-policies import 명령어를 사용하여 승인 정책 YAML 파일을 가져와 승인 정책을 만듭니다.

    gcloud network-security authz-policies import my-authz-policy-custom \
        --source=authz-policy-custom.yaml \
        --location=global
    

리전

리전 외부 애플리케이션 부하 분산기 또는 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 다음 단계에 따라 승인 결정을 사용자 관리 서비스에 위임합니다.

  1. YAML 파일에서 승인 확장 프로그램을 정의합니다. 승인 확장 프로그램은 백엔드 서비스 또는 FQDN 기반 서비스에서 실행할 수 있습니다.

    cat >authz-extension.yaml <<EOF
    name: my-authz-ext
    authority: ext11.com
    loadBalancingScheme: LB_SCHEME
    service: BACKEND_SERVICE_URI_OR_FQDN
    forwardHeaders:
      - Authorization
    failOpen: false
    timeout: "0.1s"
    wireFormat: EXT_AUTHZ_GRPC
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 리전 외부 애플리케이션 부하 분산기의 경우 스키마를 EXTERNAL_MANAGED로 설정합니다. 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • BACKEND_SERVICE_URI_OR_FQDN: 서비스는 다음 중 하나일 수 있습니다.
      • https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/backendServices/authz-service 형식의 리전 백엔드 서비스 리소스 URI
      • Cloud DNS로 확인할 수 있는 정규화된 도메인 이름(예: mycustomauthz.extension.net)
  2. gcloud service-extensions authz-extensions import 명령어를 사용하여 승인 확장 프로그램 YAML 파일을 가져와 승인 확장 프로그램을 만듭니다.

    gcloud service-extensions authz-extensions import my-authz-ext \
        --source=authz-extension.yaml \
        --location=LOCATION
    

    LOCATION을 Google Cloud콜아웃 백엔드 서비스가 구성된 리전으로 바꿉니다.

  3. YAML 파일에서 승인 정책을 정의합니다. 승인 정책은 customProvider 필드의 승인 확장 프로그램에 승인을 위임합니다.

    이 정책은 요청에 비어 있지 않은 Authorization 헤더가 포함된 경우 example.com/api/payments URL 경로를 향하는 모든 트래픽에 대해 my-authz-ext 승인 확장 프로그램을 호출합니다.

    cat >authz-policy-custom.yaml <<EOF
    name: my-authz-policy-custom
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    httpRules:
    - to:
        operations:
        - paths:
          - exact: "/api/payments"
      when: 'request.headers["Authorization"] != ""'
    action: CUSTOM
    customProvider:
      authzExtension:
        resources:
        - "projects/PROJECT_ID/locations/LOCATION/authzExtensions/my-authz-ext"
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 리전 외부 애플리케이션 부하 분산기의 경우 스키마를 EXTERNAL_MANAGED로 설정합니다. 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LOCATION: Google Cloud 리전입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  4. gcloud network-security authz-policies import 명령어를 사용하여 승인 정책 YAML 파일을 가져와 승인 정책을 만듭니다.

    gcloud beta network-security authz-policies import my-authz-policy-custom \
        --source=authz-policy-custom.yaml \
        --location=LOCATION
    

    LOCATION을 부하 분산기가 구성된 Google Cloud리전으로 바꿉니다.

승인 확장 프로그램에 대한 자세한 내용은 승인 확장 프로그램 구성을 참고하세요.

승인 결정을 Model Armor에 위임

승인 결정을 Model Armor에 위임하도록 승인 정책을 구성할 수 있습니다.

시작하기 전에 Model Armor 템플릿을 만드세요. 이 예시 설정에서 승인 정책은 승인 확장 프로그램을 가리키고, 승인 확장 프로그램은 Model Armor를 가리킵니다.

리전 외부 애플리케이션 부하 분산기 또는 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 다음 단계에 따라 승인 결정을 Model Armor에 위임합니다.

리전

  1. YAML 파일에서 승인 확장 프로그램을 정의합니다. 승인 확장 프로그램은 Model Armor 요청 및 응답 템플릿을 가리킵니다.

    cat >authz-extension.yaml <<EOF
    name: my-authz-extension
    loadBalancingScheme: INTERNAL_MANAGED
    service: modelarmor.LOCATION.rep.googleapis.com
    metadata:
      model_armor_settings: '[
        {
        "response_template_id": "projects/PROJECT_ID/locations/LOCATION/templates/RESPONSE_TEMPLATE_ID",
        "request_template_id": "projects/PROJECT_ID/locations/LOCATION/templates/REQUEST_TEMPLATE_ID"
        }
      ]'
    failOpen: true
    EOF
    

    다음을 바꿉니다.

    • LOCATION: 템플릿의 위치
    • PROJECT_ID: 템플릿이 속한 프로젝트의 ID
    • RESPONSE_TEMPLATE_ID: 응답 템플릿의 ID
    • REQUEST_TEMPLATE_ID: 요청 템플릿의 ID
  2. gcloud beta service-extensions authz-extensions import 명령어를 사용하여 승인 확장 프로그램 YAML 파일을 가져와 승인 확장 프로그램을 만듭니다.

    gcloud beta service-extensions authz-extensions import my-authz-ext \
      --source=authz-extension.yaml \
      --location=LOCATION
    

    LOCATION을 부하 분산기가 있는 Google Cloud리전으로 바꿉니다.

  3. YAML 파일에서 승인 정책을 정의합니다. 승인 정책은 customProvider 필드의 승인 확장 프로그램에 승인을 위임합니다.

    policyProfile의 값은 CONTENT_AUTHZ입니다.

    cat >authz-policy-custom.yaml <<EOF
    name: my-authz-policy-custom
    target:
      loadBalancingScheme: INTERNAL_MANAGED
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: CONTENT_AUTHZ
    action: CUSTOM
    customProvider:
      authzExtension:
        resources:
        - "projects/PROJECT_ID/locations/LOCATION/authzExtensions/my-authz-ext"
    EOF
    

    다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LOCATION: Google Cloud 리전입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  4. gcloud beta network-security authz-policies import 명령어를 사용하여 승인 정책 YAML 파일을 가져와 승인 정책을 만듭니다.

    gcloud beta network-security authz-policies import my-authz-policy-custom \
      --source=authz-policy-custom.yaml \
      --location=LOCATION
    

    LOCATION을 부하 분산기가 구성된 Google Cloud리전으로 바꿉니다.

승인 결정을 IAP(Identity-Aware Proxy)에 위임

전역 외부 애플리케이션 부하 분산기 및 리전 간 내부 애플리케이션 부하 분산기의 경우 승인 확장 프로그램을 통해 승인 결정을 IAP에 위임할 수 없습니다. 이러한 부하 분산기의 경우 승인 정책 리소스의 customProvider 필드를 통해 승인 결정을 IAP에 위임할 수 있습니다.

리전 외부 애플리케이션 부하 분산기 및 리전 내부 애플리케이션 부하 분산기의 경우 승인 확장 프로그램을 통해 승인 결정을 IAP에 위임하도록 승인 정책을 구성할 수 있습니다.

전역 및 교차 리전

다음 예시에서는 10.0.0.0/24 IP 주소 블록에서 시작된 모든 요청에 대해 모든 승인 결정이 IAP에 위임됩니다. 요청이 10.0.0.0/24 외부의 IP 주소에서 시작되면 이 정책과 일치하지 않으며 이 특정 규칙에 따라 IAP에서 평가되지 않습니다.

  1. YAML 파일에서 승인 정책을 정의합니다. 승인 정책은 customProvider 필드를 통해 IAP에 승인을 위임합니다.

    cat >authz-policy-iap.yaml <<EOF
    name: my-authz-policy-custom
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/LB_FORWARDING_RULE"
    httpRules:
      - from:
          sources:
          - ipBlock:
            - prefix: "10.0.0.0"
              length: 24
    action: CUSTOM
    customProvider:
      cloudIap: {}
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 전역 외부 애플리케이션 부하 분산기의 경우 스키마를 EXTERNAL_MANAGED로 설정합니다. 교차 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  2. gcloud network-security authz-policies import 명령어를 사용하여 승인 정책 YAML 파일을 가져와 승인 정책을 만듭니다.

    gcloud network-security authz-policies import my-authz-policy-custom \
        --source=authz-policy-iap.yaml \
        --location=global
    

리전

리전 외부 애플리케이션 부하 분산기나 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 다음 단계에 따라 승인 확장 프로그램을 사용하여 승인 결정을 IAP에 위임합니다.

  1. YAML 파일에서 승인 확장 프로그램을 정의합니다. 승인 확장 프로그램이 IAP를 가리킵니다.

    cat >authz-extension.yaml <<EOF
    name: my-authz-ext
    loadBalancingScheme: LB_SCHEME
    service: iap.googleapis.com
    failOpen: false
    EOF
    

    테스트 실행 모드에서 실행되도록 IAP를 구성하여 승인 정책을 적용하지 않고 실제 프로덕션 트래픽으로 승인 정책을 테스트할 수도 있습니다. 이렇게 하면 정책을 확인하고 구성 오류로 인한 트래픽 중단 위험을 최소화할 수 있습니다.

    cat >authz-extension.yaml <<EOF
    name: my-authz-ext
    loadBalancingScheme: LB_SCHEME
    service: iap.googleapis.com
    failOpen: false
    metadata:'
      iamEnforcementMode: DRY_RUN
    '
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 리전 외부 애플리케이션 부하 분산기의 경우 스키마를 EXTERNAL_MANAGED로 설정합니다. 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
  2. gcloud service-extensions authz-extensions import 명령어를 사용하여 승인 확장 프로그램 YAML 파일을 가져와 승인 확장 프로그램을 만듭니다.

    gcloud service-extensions authz-extensions import my-authz-ext \
        --source=authz-extension.yaml \
        --location=LOCATION
    

    LOCATION을 승인 확장 프로그램이 구성된 Google Cloud리전으로 바꿉니다.

  3. YAML 파일에서 승인 정책을 정의합니다. 승인 정책은 customProvider 필드의 승인 확장 프로그램에 승인을 위임합니다.

    cat >authz-policy-custom.yaml <<EOF
    name: my-authz-policy-custom
    target:
      loadBalancingScheme: LB_SCHEME
      resources:
      - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/LOCATION/forwardingRules/LB_FORWARDING_RULE"
    policyProfile: REQUEST_AUTHZ
    action: CUSTOM
    customProvider:
      authzExtension:
        resources:
        - "projects/PROJECT_ID/locations/LOCATION/authzExtensions/my-authz-ext"
    EOF
    

    다음을 바꿉니다.

    • LB_SCHEME: 부하 분산 스키마입니다. 리전 외부 애플리케이션 부하 분산기의 경우 스키마를 EXTERNAL_MANAGED로 설정합니다. 리전 내부 애플리케이션 부하 분산기의 경우 스키마를 INTERNAL_MANAGED로 설정합니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • LOCATION: Google Cloud 리전입니다.
    • LB_FORWARDING_RULE: 부하 분산기의 전달 규칙 이름입니다.
  4. gcloud network-security authz-policies import 명령어를 사용하여 승인 정책 YAML 파일을 가져와 승인 정책을 만듭니다.

    gcloud beta network-security authz-policies import my-authz-policy-custom \
        --source=authz-policy-custom.yaml \
        --location=LOCATION
    

    LOCATION을 부하 분산기가 구성된 Google Cloud리전으로 바꿉니다.

Cloud Logging의 승인 정책 로그 이해

요청이 허용되거나 거부될 때 승인 정책이 로깅되는 방식을 보려면 다음 섹션을 참조하세요.

요청이 ALLOW 또는 DENY 정책과 일치하지 않음

요청이 ALLOW 또는 DENY 정책과 일치하지 않으면 DENY 정책에 따라 요청이 허용되고 allowed_as_no_deny_policies_matched_request로 로깅됩니다. 반대로 ALLOW 정책은 이 요청을 거부하고 denied_as_no_allow_policies_matched_request로 로깅합니다. 정책 중 하나가 요청을 거부하기 때문에 요청이 거부됩니다.

  • 전역 외부 애플리케이션 부하 분산기를 사용하는 경우 statusDetails가 로그에서 denied_by_authz_policy로 설정됩니다. 아래 예시를 참조하세요.

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "allowed_as_no_deny_policies_matched_request"
                result: "ALLOWED"
              }
              1: {
                details: "denied_as_no_allow_policies_matched_request"
                result: "DENIED"
              }
            ]
            result: "DENIED"
          }
          backendTargetProjectNumber: "projects/12345567"
          remoteIp: "00.100.11.104"
          statusDetails: "denied_by_authz_policy"
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    
  • 리전 내부 애플리케이션 부하 분산기, 리전 외부 애플리케이션 부하 분산기, 교차 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 proxyStatus가 로그에서 error=\"http_request_error\"; details=\"denied_by_authz_policy\"로 설정됩니다. 아래 예시를 참조하세요.

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "allowed_as_no_deny_policies_matched_request"
                result: "ALLOWED"
              }
              1: {
                details: "denied_as_no_allow_policies_matched_request"
                result: "DENIED"
              }
            ]
            result: "DENIED"
          }
          backendTargetProjectNumber: "projects/12345567"
          remoteIp: "00.100.11.104"
          proxyStatus: "error=\"http_request_error\"; details=\"denied_by_authz_policy\""
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    

요청이 DENY 정책과 일치함

요청이 DENY 정책과 일치하면 요청이 거부되고 요청을 거부한 정책이 로깅됩니다.

  • 전역 외부 애플리케이션 부하 분산기를 사용하는 경우 로그에서 statusDetailsdenied_by_authz_policy로 설정되고 요청을 거부한 정책의 이름이 policies에 로깅됩니다. 아래 예시를 참조하세요.

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "name: "projects/12345567/locations/global/authzPolicies/deny-authz-policy-test""
                result: "DENIED"
              }
            ]
            result: "DENIED"
          }
          backendTargetProjectNumber: "projects/12345567"
          cacheDecision: [2]
          remoteIp: "00.100.11.104"
          statusDetails: "denied_by_authz_policy"
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    
  • 리전 내부 애플리케이션 부하 분산기, 리전 외부 애플리케이션 부하 분산기, 교차 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 proxyStatuserror=\"http_request_error\"; details=\"denied_by_authz_policy\"로 설정되고 정책 이름이 policies에 로깅됩니다. 아래 예시를 참조하세요.

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "name: "projects/12345567/locations/$REGION/authzPolicies/deny-authz-policy-test""
                result: "DENIED"
              }
            ]
            result: "DENIED"
          }
          backendTargetProjectNumber: "projects/12345567"
          remoteIp: "00.100.11.104"
          proxyStatus: "error=\"http_request_error\"; details=\"denied_by_authz_policy\""
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    

요청이 DENY 정책과 일치하지 않지만 ALLOW 정책과 일치

요청이 DENY 정책과 일치하지 않지만 ALLOW 정책과 일치하면 요청이 허용됩니다. 로그에서 이 작업은 DENY 정책에 대해 allowed_as_no_deny_policies_matched_request로 로깅됩니다. 요청을 허용한 정책도 로깅됩니다.

  • 전역 외부 애플리케이션 부하 분산기를 사용하는 경우 로그에 statusDetails가 없습니다. 요청을 허용한 정책도 policies에 로깅됩니다. 아래 예시를 참조하세요.

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "allowed_as_no_deny_policies_matched_request"
                result: "ALLOWED"
              }
              1: {
                details: "name: "projects/12345567/locations/global/authzPolicies/allow-authz-policy-test""
                result: "ALLOWED"
              }
            ]
            result: "ALLOWED"
          }
          backendTargetProjectNumber: "projects/12345567"
          cacheDecision: [2]
          remoteIp: "00.100.11.104"
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    
  • 리전 내부 애플리케이션 부하 분산기, 리전 외부 애플리케이션 부하 분산기, 교차 리전 내부 애플리케이션 부하 분산기를 사용하는 경우 로그에 proxyStatus 필드가 없습니다. 요청을 허용한 정책도 policies에 로깅됩니다. 아래 예시를 참조하세요.

      {
        httpRequest: {8}
        insertId: "example-id"
        jsonPayload: {
          @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
          authzPolicyInfo: {
            policies: [
              0: {
                details: "allowed_as_no_deny_policies_matched_request"
                result: "ALLOWED"
              }
              1: {
                details: "name: "projects/12345567/locations/$REGION/authzPolicies/allow-authz-policy-test""
                result: "ALLOWED"
              }
            ]
            result: "ALLOWED"
          }
          backendTargetProjectNumber: "projects/12345567"
          cacheDecision: [2]
          remoteIp: "00.100.11.104"
        }
        logName: "projects/example-project/logs/requests"
        receiveTimestamp: "2024-08-28T15:33:56.046651035Z"
        resource: {2}
        severity: "WARNING"
        spanId: "3e1a09a8e5e3e14d"
        timestamp: "2024-08-28T15:33:55.355042Z"
        trace: "projects/example-project/traces/8c8b3dbf9a19c85954d0fa2d958ca509"
      }
    

다음 단계