Restrinja ações em recursos do GKE através de políticas da organização personalizadas


Esta página mostra como restringir operações específicas em recursos do Google Kubernetes Engine (GKE) na sua organização através de restrições personalizadas no Google Cloud serviço de políticas da organização. Pode usar restrições para ajudar a sua organização a cumprir os requisitos de conformidade, segurança e políticas, garantindo que os recursos do cluster cumprem requisitos específicos. Nesta página, vai saber como criar restrições personalizadas e aplicá-las aos recursos do cluster.

Esta página destina-se a especialistas em segurança que garantem que a respetiva organização cumpre os requisitos de conformidade, segurança e políticas, limitando ou exigindo configurações específicas nos recursos do cluster. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE. Google Cloud

Antes de ler esta página, certifique-se de que conhece as políticas da Organization Policy.

Acerca das políticas e restrições da organização

A Google Cloud política da organização dá-lhe um controlo centralizado e programático sobre os recursos da sua organização. Enquanto administrador de políticas da organização, pode definir uma política da organização, que é um conjunto de restrições denominadas restrições que se aplicam a Google Cloud recursos e descendentes desses recursos na Google Cloud hierarquia de recursos. Pode aplicar políticas de organização ao nível da organização, da pasta ou do projeto.

A política da organização fornece restrições predefinidas para vários serviços Google Cloud . No entanto, se quiser um controlo mais detalhado e personalizável sobre os campos específicos que estão restritos nas políticas da sua organização, também pode criar restrições personalizadas e usar essas restrições personalizadas numa política da organização personalizada.

Recursos suportados no GKE

Para o GKE, pode criar restrições personalizadas para os métodos CREATE ou UPDATE em qualquer campo no recurso Cluster ou NodePool da API Google Kubernetes Engine v1, exceto para campos só de saída e os seguintes campos:

  • projects.locations.clusters.masterAuth.clientKey
  • projects.locations.clusters.masterAuth.password

Herança de políticas

Por predefinição, as políticas são herdadas pelos descendentes dos recursos nos quais aplica a política. Por exemplo, se aplicar uma política a uma pasta, esta é aplicada a todos os projetos na pasta.Google Cloud Para saber mais acerca deste comportamento e como o alterar, consulte as regras de avaliação da hierarquia.

Preços

As políticas e as restrições organizacionais são oferecidas sem custo financeiro.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.

Crie uma restrição personalizada

Para criar uma nova restrição personalizada, define a restrição num ficheiro YAML e aplica a restrição personalizada na sua organização através da CLI Google Cloud.

  1. Crie um ficheiro YAML para a restrição personalizada:

    name: organizations/ORGANIZATION_ID/customConstraints/custom.CONSTRAINT_NAME
    resourceTypes:
    - container.googleapis.com/RESOURCE_NAME
    methodTypes:
    - METHOD1
    - METHOD2
    condition: "resource.OBJECT_NAME.FIELD_NAME == VALUE"
    actionType: ACTION
    displayName: DISPLAY_NAME
    description: DESCRIPTION
    

    Substitua o seguinte:

    • ORGANIZATION_ID: o ID da sua organização, como 123456789.
    • CONSTRAINT_NAME: o nome que quer para a nova restrição personalizada. Uma restrição personalizada tem de começar por custom. e só pode incluir letras maiúsculas, letras minúsculas ou números. Por exemplo, custom.enableGkeAutopilot. O comprimento máximo deste campo é de 70 carateres, sem contar com o prefixo, por exemplo, organizations/123456789/customConstraints/custom..
    • RESOURCE_NAME: o nome (não o URI) do recurso REST da API GKE que contém o objeto e o campo que quer restringir. Por exemplo, Cluster ou NodePool.
    • METHOD1,METHOD2,...: uma lista de métodos RESTful para os quais aplicar a restrição. Pode ser CREATE ou CREATE e UPDATE.
    • condition: a condição para validar o pedido em relação a, escrita no Idioma de expressão comum (IEC). Este campo tem um comprimento máximo de 1000 carateres. A expressão tem de conter os seguintes campos e suporta operadores lógicos, como && e ||:

      • OBJECT_NAME: o nome do objeto da API GKE que quer restringir, no formato pascalCase. Por exemplo, privateClusterConfig.
      • FIELD_NAME: o nome do campo da API GKE que quer restringir, no formato pascalCase. Por exemplo, enablePrivateNodes.
      • VALUE: o valor do campo. Para campos booleanos, use true ou false. Para campos de string, use "STRING".
    • ACTION: a ação a tomar se a condição condition for cumprida. Pode ser ALLOW ou DENY.

    • DISPLAY_NAME: um nome simples para a restrição. Este campo tem um comprimento máximo de 200 carateres.

    • DESCRIPTION: uma descrição acessível da restrição a apresentar como uma mensagem de erro quando a política é violada. Este campo tem um comprimento máximo de 2000 carateres.

  2. Aplique a restrição personalizada:

    gcloud org-policies set-custom-constraint PATH_TO_FILE
    

    Substitua PATH_TO_FILE pelo caminho do ficheiro da sua definição de restrição personalizada.

  3. Verifique se a restrição personalizada existe:

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    O resultado é semelhante ao seguinte:

    CONSTRAINT                     LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.enableGkeAutopilot      -              SET               COCsm5QGENiXi2E=
    ...
    

Aplique a restrição personalizada

Para aplicar a nova restrição personalizada, crie uma política da organização que faça referência à restrição e, em seguida, aplique a política da organização.

  1. Crie um ficheiro YAML para a política da organização:

    name: RESOURCE_HIERARCHY/policies/POLICY_NAME
    spec:
      rules:
      - enforce: true
    

    Substitua o seguinte:

    • RESOURCE_HIERARCHY: a localização da nova política, que afeta o âmbito da aplicação. Use a Google Cloud hierarquia de recursos como guia. Por exemplo, se quiser aplicar a política num projeto específico, use projects/PROJECT_ID. Para aplicar a política numa organização específica, use organizations/ORGANIZATION_ID.
    • POLICY_NAME: o nome da nova política.
  2. Aplique a política:

    gcloud org-policies set-policy PATH_TO_POLICY
    

    Substitua PATH_TO_POLICY pelo caminho para o ficheiro de definição da política.

  3. Verifique se a política existe:

    gcloud org-policies list \
        --RESOURCE_FLAG=RESOURCE_ID
    

    Substitua o seguinte:

    • RESOURCE_FLAG: o Google Cloud recurso onde aplicou a política. Por exemplo, project ou folder.
    • RESOURCE_ID: o ID do recurso onde aplicou a política. Por exemplo, o ID da pasta Google Cloud .

    Para ver uma lista de argumentos, consulte o artigo gcloud org-policies list.

    O resultado é semelhante ao seguinte:

    CONSTRAINT                                    LIST_POLICY    BOOLEAN_POLICY    ETAG
    iam.disableWorkloadIdentityClusterCreation    -              SET               CO3UkJAGEOj1qsQB
    custom.enableGkeAutopilot                     -              SET               COCsm5QGENiXi2E=
    custom.enableBinAuth                          -              SET               CJfKiZUGEJju7LUD
    

Exemplo: crie uma restrição personalizada e aplique uma política

O exemplo seguinte cria uma restrição e uma política personalizadas que exigem que todos os novos clusters num projeto específico sejam clusters do Autopilot.

Antes de começar, deve saber o seguinte:

  • O ID da sua organização
  • Um ID do projeto

Crie a restrição

  1. Guarde o seguinte ficheiro como constraint-enable-autopilot.yaml:

    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableGkeAutopilot
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "resource.autopilot.enabled == false"
    actionType: DENY
    displayName: Enable GKE Autopilot
    description: All new clusters must be Autopilot clusters.
    

    Isto define uma restrição em que, para cada novo cluster, se o modo de cluster não for o Autopilot, a operação é recusada.

  2. Aplique a restrição:

    gcloud org-policies set-custom-constraint ~/constraint-enable-autopilot.yaml
    
  3. Verifique se a restrição existe:

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

    O resultado é semelhante ao seguinte:

    CUSTOM_CONSTRAINT                       ACTION_TYPE  METHOD_TYPES   RESOURCE_TYPES                     DISPLAY_NAME
    custom.enableGkeAutopilot               DENY         CREATE         container.googleapis.com/Cluster   Enable GKE Autopilot
    ...
    

Crie a política

  1. Guarde o seguinte ficheiro como policy-enable-autopilot.yaml:

    name: projects/PROJECT_ID/policies/custom.enableGkeAutopilot
    spec:
      rules:
      - enforce: true
    

    Substitua PROJECT_ID pelo ID do seu projeto.

  2. Aplique a política:

    gcloud org-policies set-policy ~/policy-enable-autopilot.yaml
    
  3. Verifique se a política existe:

    gcloud org-policies list --project=PROJECT_ID
    

    O resultado é semelhante ao seguinte:

    CONSTRAINT                  LIST_POLICY    BOOLEAN_POLICY    ETAG
    custom.enableGkeAutopilot   -              SET               COCsm5QGENiXi2E=
    

Depois de aplicar a política, aguarde cerca de dois minutos para que Google Cloud comece a aplicar a política.

Teste a política

Tente criar um cluster padrão do GKE no projeto:

gcloud container clusters create org-policy-test \
    --project=PROJECT_ID \
    --location=CONTROL_PLANE_LOCATION \
    --num-nodes=1

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto do projeto da política.
  • CONTROL_PLANE_LOCATION: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais.

O resultado é o seguinte:

Operation denied by custom org policies: ["customConstraints/custom.enableGkeAutopilot": "All new clusters must be Autopilot clusters."]

Explore exemplos de restrições personalizadas para exemplos de utilização comuns

Os exemplos seguintes fornecem a sintaxe de algumas restrições personalizadas que pode considerar úteis, como a aplicação da Workload Identity Federation para o GKE em novos clusters. Para usar estes exemplos, modifique-os conforme necessário para se adequarem ao seu exemplo de utilização específico. Em seguida, aplique-as à sua organização seguindo as instruções nesta página.

Descrição Sintaxe de restrição
Permitir a criação de clusters apenas quando a autorização binária está ativada
    name: organizations/ORGANIZATION_ID/customConstraints/custom.gkeBinaryAuthorization
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "resource.binaryAuthorization.enabled == true || resource.binaryAuthorization.evaluationMode=='PROJECT_SINGLETON_POLICY_ENFORCE'"
    action: ALLOW
    displayName: Enable GKE Binary Authorization
    description: All new clusters must enable Binary Authorization.
Não desative a atualização automática de nós para novos conjuntos de nós
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableAutoUpgrade
    resourceTypes:
    - container.googleapis.com/NodePool
    methodTypes:
    - CREATE
    condition: "resource.management.autoUpgrade == true"
    actionType: ALLOW
    displayName: Enable node auto-upgrade
    description: All node pools must have node auto-upgrade enabled.
Ative a federação de identidades de cargas de trabalho para o GKE para novos clusters
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableWorkloadIdentity
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - CREATE
    condition: "has(resource.workloadIdentityConfig.workloadPool) || resource.workloadIdentityConfig.workloadPool.size() > 0"
    actionType: ALLOW
    displayName: Enable Workload Identity on new clusters
    description: All new clusters must use Workload Identity.
Não desative o Cloud Logging em clusters existentes
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableLogging
    resourceTypes:
    - container.googleapis.com/Cluster
    methodTypes:
    - UPDATE
    condition: "resource.loggingService == 'none'"
    actionType: DENY
    displayName: Do not disable Cloud Logging
    description: You cannot disable Cloud Logging on existing GKE cluster.
Permitir apenas a criação ou a atualização do conjunto de nós padrão quando os pontos finais de metadados antigos estão desativados
    name: organizations/ORGANIZATION_ID/customConstraints/custom.nodeConfigMetadata
    resourceTypes:
    - container.googleapis.com/NodePool
    methodTypes:
    - CREATE
    - UPDATE
    condition: "'disable-legacy-endpoints' in resource.config.metadata && resource.config.metadata['disable-legacy-endpoints'] == 'true'"
    actionType: ALLOW
    displayName: Disable legacy metadata endpoints
    description: You can only create or update node pools if you disable legacy
    metadata endpoints.

Este exemplo de restrição mostra como definir uma restrição personalizada num valor de mapa. O campo condition usa o operador de índice na chave do mapa disable-legacy-endpoints. Se usar a sintaxe de seleção de campos normal, como nos exemplos anteriores, é apresentado um erro INVALID_CUSTOM_CONSTRAINT_CONDITION.

O que se segue?