Gerenciar restrições personalizadas para projetos

Esta página detalha como criar restrições personalizadas para serviços e jobs do Cloud Run e aplicá-las no nível do projeto. Para informações sobre políticas personalizadas da organização, consulte Como criar e gerenciar políticas personalizadas da organização.

Se você criou ou implantou funções do Cloud Run usando comandos gcloud functions ou as APIs do Cloud Functions v2, consulte Gerenciar recursos de função usando restrições personalizadas.

As políticas da organização doGoogle Cloud oferecem controle centralizado e programático sobre os recursos da sua organização. Como administrador de políticas da organização, é possível definir uma política da organização, que é um conjunto de restrições chamado restrições que se aplicam aos recursos doGoogle Cloud e aos descendentes desses recursos na hierarquia de recursos doGoogle Cloud . É possível aplicar políticas da organização no nível da organização, de pastas ou de projetos.

A política da organização oferece restrições predefinidas para vários serviços doGoogle Cloud . No entanto, se você quiser um controle mais granular e personalizável sobre os campos específicos restritos nas suas políticas da organização, crie também políticas da organização personalizadas.

Vantagens

  • Gerenciamento de custos: use políticas da organização para restringir a instância de VM e os tamanhos e tipos de disco que podem ser usados na sua organização Também é possível restringir a família de máquinas usada para a instância de VM.
  • Segurança, conformidade e governança:
    • Para aplicar requisitos de segurança, é possível exigir regras de porta de firewall específicas nas VMs.
    • Para oferecer suporte ao isolamento de hardware ou à conformidade com o licenciamento, é possível exigir que todas as VMs em um projeto ou pasta específico sejam executadas em nós de locatário individual.
    • Para controlar os scripts de automação, use políticas personalizadas da organização para verificar se os rótulos correspondem às expressões necessárias.

O Cloud Run permite gravar qualquer número de restrições personalizadas usando a maioria dos campos configurados pelo usuário na API Cloud Run Admin. Por exemplo, é possível criar uma restrição personalizada que especifique que um serviço seja definido como interno ou que impeça estágios de lançamento que não sejam de lançamento geral.

Depois de aplicadas, as solicitações que violam uma política que impõe uma restrição personalizada mostram uma mensagem de erro na CLI gcloud e nos registros do Cloud Run. A mensagem de erro contém o ID da restrição e a descrição da restrição personalizada violada.

Herança de políticas

Por padrão, as políticas da organização são herdadas pelos descendentes dos recursos em que a política é aplicada. Por exemplo, se você aplicar uma política a uma pasta, o Google Cloud vai aplicá-la a todos os projetos dessa pasta. Para saber mais sobre esse comportamento e como alterá-lo, consulte Regras de avaliação de hierarquia.

Preços

O Organization Policy Service, incluindo políticas predefinidas e personalizadas, é oferecido sem custos financeiros.

Limitações

Antes de começar

Funções exigidas

Para receber as permissões necessárias a fim de gerenciar as políticas da organização, peça ao administrador para conceder a você o papel do IAM de Administrador de políticas da organização (roles/orgpolicy.policyAdmin) no recurso da organização. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esse papel predefinido contém as permissões necessárias para gerenciar as políticas da organização. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As permissões a seguir são necessárias para gerenciar as políticas da organização:

  • orgpolicy.constraints.list
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.

Criar uma restrição personalizada

Uma restrição personalizada é definida em um arquivo YAML pelos recursos, métodos, condições e ações compatíveis com o serviço em que você está aplicando a política da organização. As condições das restrições personalizadas são definidas usando a Common Expression Language (CEL). Para mais informações sobre como criar condições em restrições personalizadas usando a CEL, consulte a seção CEL de Como criar e gerenciar restrições personalizadas.

Para criar um arquivo YAML para uma restrição personalizada do Cloud Run, consulte o exemplo a seguir:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- run.googleapis.com/Service
methodTypes: 
- CREATE
- UPDATE
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

Substitua:

  • ORGANIZATION_ID: o ID da organização, como 123456789.

  • CONSTRAINT_NAME: o nome da sua nova restrição personalizada. Uma restrição personalizada precisa começar com custom. e só pode incluir letras maiúsculas, minúsculas ou números, por exemplo, custom.ingressInternal. O tamanho máximo desse campo é de 70 caracteres, sem contar o prefixo (por exemplo, organizations/123456789/customConstraints/custom).

  • CONDITION: uma condição de CEL gravada em uma representação de um recurso de serviço compatível. Esse campo tem um comprimento máximo de 1000 caracteres. Por exemplo, condition: "'run.googleapis.com/ingress' in resource.metadata.annotations && resource.metadata.annotations['run.googleapis.com/ingress'] == 'internal'".

  • ACTION: a ação a ser realizada se o condition for atendido. Pode ser ALLOW ou DENY.

  • DISPLAY_NAME: um nome legível para a restrição. Esse campo tem um comprimento máximo de 200 caracteres.

  • DESCRIPTION: uma descrição legível da restrição a ser exibida como uma mensagem de erro quando a política for violada, por exemplo, "Requer que a entrada seja definida como interna". Esse campo tem um comprimento máximo de 2000 caracteres.

Para mais informações sobre como criar uma restrição personalizada, consulte Como definir restrições personalizadas.

Configurar uma restrição personalizada

Depois de criar o arquivo YAML para uma nova restrição personalizada, faça a configuração necessária para disponibilizá-la para as políticas da organização. Para configurar uma restrição personalizada, use o comando gcloud org-policies set-custom-constraint:
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
Substitua CONSTRAINT_PATH pelo caminho completo para o arquivo da restrição personalizada. Por exemplo, /home/user/customconstraint.yaml. Após a conclusão, as restrições personalizadas vão estar disponíveis como políticas da organização na lista de políticas da organização do Google Cloud . Para verificar a existência da restrição personalizada, use o comando gcloud org-policies list-custom-constraints:
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
Substitua ORGANIZATION_ID pelo ID do recurso da organização. Para mais informações, consulte Como visualizar as políticas da organização.

Aplicar uma restrição personalizada

Para aplicar uma restrição, crie uma política da organização que faça referência a ela e aplique essa política a um recurso do Google Cloud .

Console

  1. No console do Google Cloud , acesse a página Políticas da organização.

    Acessar a página Políticas da organização

  2. No seletor de projetos, selecione o projeto em que você quer definir a política da organização.
  3. Na lista da página Políticas da organização, selecione uma restrição para acessar a página Detalhes da política associada.
  4. Para configurar a política da organização nesse recurso, clique em Gerenciar política.
  5. Na página Editar política, selecione Substituir a política do recurso pai.
  6. Clique em Adicionar regra.
  7. Na seção Aplicação, escolha entre ativar ou desativar a aplicação dessa política da organização.
  8. Opcional: para tornar a política da organização condicional em uma tag, clique em Adicionar condição. Se você adicionar uma regra condicional a uma política da organização, inclua pelo menos uma regra não condicional para que a política seja salva. Para mais informações, consulte Como configurar uma política da organização com tags.
  9. Clique em Testar mudanças para simular o efeito da política da organização. A simulação da política não está disponível para restrições gerenciadas legadas. Para mais informações, consulte Testar mudanças na política da organização com o Simulador de política.
  10. Para concluir e aplicar a política da organização, clique em Definir política. A política levará até 15 minutos para entrar em vigor.

gcloud

Para criar uma política da organização com regras booleanas, crie um arquivo YAML para a política que faça referência à restrição:

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

Substitua:

  • PROJECT_ID: o projeto em que você quer aplicar a restrição.
  • CONSTRAINT_NAME: o nome definido para a restrição personalizada. Por exemplo, custom.ingressInternal.

Para aplicar a política da organização que contém a restrição, execute o seguinte comando:

    gcloud org-policies set-policy POLICY_PATH
    

Substitua POLICY_PATH pelo caminho completo para o arquivo YAML da política da organização. A política leva até 15 minutos para entrar em vigor.

Testar a restrição personalizada

Para testar o exemplo que restringe as configurações de entrada, tente implantar um serviço do Cloud Run no projeto com a entrada definida como all:

gcloud run deploy org-policy-test \
    --project=PROJECT_ID \
    --region=REGION_ID \
    --ingress=all

A saída é esta:

Operation denied by custom org policies: ["customConstraints/custom.ingressConstraint": "Require ingress to be set to internal."]

Exemplos de políticas personalizadas da organização para casos de uso comuns

A tabela a seguir mostra exemplos de restrições personalizadas que podem ser úteis com os serviços e jobs do Cloud Run:

Descrição Sintaxe de restrição
Exija que um serviço do Cloud Run seja definido como interno.
    name: organizations/ORGANIZATION_ID/customConstraints/custom.ingressInternal
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "'run.googleapis.com/ingress' in resource.metadata.annotations && resource.metadata.annotations['run.googleapis.com/ingress'] == 'internal'"
    actionType: ALLOW
    displayName: IngressInternal
    description: Require ingress to be set to internal.
Descrição Sintaxe de restrição
Exija um limite de memória personalizado para todos os contêineres de um serviço do Cloud Run.
    name: organizations/ORGANIZATION_ID/customConstraints/custom.memoryLimit
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "resource.spec.template.spec.containers.all(container, 'memory' in container.resources.limits && container.resources.limits['memory'] <= 'MEMORY_LIMIT')"
    actionType: ALLOW
    displayName: memoryLimitCap
    description: Require the container memory limit to be set to <= MEMORY_LIMIT.
Descrição Sintaxe de restrição
Impedem que o estágio de lançamento do Cloud Run seja alterado do padrão GA para um estágio de lançamento não-GA.
    name: organizations/ORGANIZATION_ID/customConstraints/custom.launchStage
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "!('run.googleapis.com/launch-stage' in resource.metadata.annotations) || resource.metadata.annotations['run.googleapis.com/launch-stage'] == 'GA'"
    actionType: ALLOW
    displayName: launchStage
    description: Only allow users to create and update Cloud Run services with either an unset launch stage (default is GA) or a launch stage explicitly set to GA.
Descrição Sintaxe de restrição
Exija que a autorização binária seja definida como padrão.
    name: organizations/ORGANIZATION_ID/customConstraints/custom.binaryAuthorization
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "'run.googleapis.com/binary-authorization' in resource.metadata.annotations && resource.metadata.annotations['run.googleapis.com/binary-authorization'] == 'default'"
    actionType: ALLOW
    displayName: binaryAuthorization
    description: Require binaryAuthorization to be set to default.
Descrição Sintaxe de restrição
Exija que os serviços tenham uma sondagem de atividade para cada contêiner.
    name: organizations/ORGANIZATION_ID/customConstraints/custom.livenessProbe
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "resource.spec.template.spec.containers.all(container, has(container.livenessProbe.initialDelaySeconds))"
    actionType: ALLOW
    displayName: livenessProbe
    description: Require all containers to have a liveness probe configured with initialDelaySeconds.
Descrição Sintaxe de restrição
Exija que um serviço tenha pelo menos um contêiner secundário que use uma imagem que começa com um prefixo especificado e uma porta igual a um número especificado.
    name: organizations/ORGANIZATION_ID/customConstraints/custom.requireSidecar
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "resource.spec.template.spec.containers.exists(container, container.image.startsWith('us-docker.pkg.dev/cloud-ops-agents-artifacts/cloud-run-gmp-sidecar/') && container.ports.exists(port, port.containerPort == 8081))"
    actionType: ALLOW
    displayName: requireSidecar
    description: Require at least one container with an image that starts with "us-docker.pkg.dev/cloud-ops-agents-artifacts/cloud-run-gmp-sidecar/" and uses port 8081.
Descrição Sintaxe da restrição
Permite apenas a criação e edição de funções.
    name: organizations/ORGANIZATION_ID/customConstraints/custom.allowcrf
    resource_types: run.googleapis.com/Service
    method_types:
    - CREATE
    - UPDATE
    condition: "resource.spec.template.spec.containers.exists(container, container.image.startsWith('gcr.io/cloudrun/placeholder')) || (has(resource.metadata.annotations) && 'run.googleapis.com/build-function-target' in resource.metadata.annotations)"
    action_type: ALLOW
    display_name: runFunctionsOnly
    description: Only allow the creation and editing of Cloud Run functions
Descrição Sintaxe da restrição
Exija que o URL run.app padrão seja desativado para serviços do Cloud Run.
    name: organizations/ORGANIZATION_ID/customConstraints/custom.disableRunApp
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "'run.googleapis.com/default-url-disabled' in resource.metadata.annotations && resource.metadata.annotations['run.googleapis.com/default-url-disabled'] == 'true'"
    actionType: ALLOW
    displayName: disableRunApp
    description: Require services to disable run.app URL.

A seguir