Configurar políticas de autorização em sidecars no GKE

Nesta página, mostramos instruções para configurar diferentes tipos de políticas de autorização em sidecars do Cloud Service Mesh no GKE.

Antes de começar

Você precisa conhecer a API Gateway e as extensões de autorização.

Antes de criar uma política de autorização, siga estas etapas:

  1. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloudagora, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho sem custos financeiros.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Network Security, Network Services APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Network Security, Network Services APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

AuthzPolicy em todo o namespace

Se você quiser negar um padrão de tráfego esperado para todo o namespace, configure uma política de autorização para negar todas as solicitações HTTP recebidas para todas as cargas de trabalho em um namespace:

cat >ns-authz-policy-deny.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
  name: ns-authz
  namespace: NAMESPACE
spec:
  targetRefs:
  - group: ""
    kind: Pod
    selector: {}
  rules:
  - to:
      operations:
      - paths:
        - type: Prefix
          value: "/bad_token"
  action: DENY
  enforcementLevel: L7
EOF
kubectl apply -f ns-authz-policy-deny.yaml

O selector: {} vazio segmenta todos os pods no namespace.

Se você quiser permitir um padrão de tráfego esperado para todo o namespace, configure uma política de autorização para permitir solicitações HTTP de entrada para todas as cargas de trabalho em um namespace:

cat >ns-authz-policy-allow.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
  name: ns-authz
  namespace: NAMESPACE
spec:
  targetRefs:
  - group: ""
    kind: Pod
    selector: {}
  rules:
  - to:
      operations:
      - paths:
        - type: Prefix
          value: "/headers"
        methods: ["GET"]
  action: ALLOW
  enforcementLevel: L7
EOF
kubectl apply -f ns-authz-policy-allow.yaml

O selector: {} vazio segmenta todos os pods no namespace.

Negar solicitações de entrada para uma carga de trabalho

Se você tiver uma carga de trabalho que deve fazer apenas chamadas de saída, como um cron job, configure uma política de autorização para negar todas as solicitações HTTP recebidas para a carga de trabalho:

cat >deny-path-authz-policy.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
  name: my-workload-authz
  namespace: NAMESPACE
spec:
  targetRefs:
  - group: ""
    kind: Pod
    selector:
      matchLabels:
        app: EXAMPLE_APP
  rules:
  - to:
      operations:
      - paths:
        - type: Prefix
          value: "/deny_path"
  action: DENY
  enforcementLevel: L7
EOF
kubectl apply -f deny-path-authz-policy.yaml

A saída é semelhante a:

gcpauthzpolicy.networking.gke.io/my-workload-authz created

Depois que essa política for aplicada, qualquer solicitação HTTP recebida para o caminho /deny_path nos pods que correspondem ao app: EXAMPLE_APP será rejeitada, e o autor da chamada receberá um código de resposta HTTP 403 Forbidden.

Permitir solicitações de entrada específicas para uma carga de trabalho

Também é possível configurar uma política de ALLOW que permita apenas solicitações que correspondam a um critério específico e rejeite as demais.

O exemplo a seguir configura uma política de autorização na implantação example-app para permitir apenas solicitações mTLS de pods com identidade spiffe://cluster.local/NAMESPACE/pod1.

cat >allow-authz-policy.yaml <<EOF
apiVersion: networking.gke.io/v1
kind: GCPAuthzPolicy
metadata:
  name: my-workload-authz
  namespace: NAMESPACE
spec:
  targetRefs:
  - group: ""
    kind: Pod
    selector:
      matchLabels:
        app: EXAMPLE_APP
  rules:
  - from:
      sources:
      - principals:
        - principal:
            type: Exact
            value: "spiffe://cluster.local/NAMESPACE/pod1"
  action: ALLOW
  enforcementLevel: L7
EOF
kubectl apply -f allow-authz-policy.yaml

A saída é semelhante a:

gcpauthzpolicy.networking.gke.io/my-workload-authz created

Somente as solicitações recebidas autenticadas usando mTLS que apresentarem a identidade SPIFFE exata spiffe://cluster.local/NAMESPACE/pod1 receberão um HTTP 200 OK. Qualquer outra solicitação será rejeitada pelo proxy com um HTTP 403 Forbidden.

Delegar para um mecanismo de autorização externo

É possível usar seu próprio mecanismo de autorização e configurar o Cloud Service Mesh para delegar todas as decisões de autorização de uma carga de trabalho ao mecanismo configurado.

  1. Instale a CRD GCPAuthzExtension se ela ainda não estiver instalada:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-gateway-api/main/config/crd/networking.gke.io_gcpauthzextensions.yaml
    
  2. Implante uma carga de trabalho de extensão de autorização baseada em chamada no Kubernetes que ofereça suporte ao protocolo gRPC ext_proc e configure um recurso de extensão de autorização:

    cat >authz-extension.yaml <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzExtension
    metadata:
      name: my-authz-ext
      namespace: NAMESPACE
    spec:
      backendRef:
        group: ""
        kind: Service
        name: authz-service
        port: PORT
      authority: "authz-service.NAMESPACE.svc.cluster.local"
      forwardHeaders:
      - Authorization
      failOpen: false
      timeout: "100ms"
      wireFormat: ExtProcGRPC
    EOF
    kubectl apply -f authz-extension.yaml
    

    Substitua:

    • NAMESPACE: o namespace do serviço authz-service e das cargas de trabalho.
    • PORT: a porta do serviço authz-service que disponibiliza a API gRPC ext_proc.

    Esse comando cria uma extensão de autorização baseada em chamada que é executada como um serviço do Kubernetes authz-service.

    A saída é semelhante a:

    gcpauthzextension.networking.gke.io/my-authz-ext created
    
  3. Configure a política de autorização para delegar decisões de autorização da carga de trabalho à extensão de autorização configurada anteriormente:

    cat >authz-policy.yaml <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzPolicy
    metadata:
      name: my-workload-authz
      namespace: NAMESPACE
    spec:
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels:
            app: EXAMPLE_APP
      rules:
      - from:
          sources:
          - principals:
            - principal:
                type: Exact
                value: "spiffe://cluster.local/NAMESPACE/pod1"
        to:
          operations:
          - paths:
            - type: Exact
              value: "/api/payments-schedule"
      action: CUSTOM
      enforcementLevel: L7
      customProviders:
        extensionRefs:
        - group: networking.gke.io
          kind: GCPAuthzExtension
          name: my-authz-ext
    EOF
    kubectl apply -f authz-policy.yaml
    

    A saída é semelhante a:

    gcpauthzpolicy.networking.gke.io/my-workload-authz created
    

    O proxy aguarda a resposta da extensão de autorização antes de encaminhar a solicitação ao aplicativo. Se a extensão rejeitar a solicitação encerrando a chamada com um erro ou se a chamada falhar ou expirar enquanto failOpen for false, o autor da chamada vai receber uma resposta HTTP 500. Se a extensão enviar uma resposta imediata, o autor da chamada vai receber o código de status dessa resposta.