Como criar e gerenciar restrições personalizadas

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

A política da organização do Google Cloud oferece controle centralizado e programático sobre os recursos da sua organização. Como administrador da política da organização, você pode definir uma política da organização, que é um conjunto de restrições chamadas restrições que se aplicam aos recursos do Google Cloud e aos descendentes desses recursos na hierarquia de recursos do Google Cloud. É possível aplicar políticas da organização no 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 do Google Cloud. No entanto, se quiser mais controle das políticas da organização, crie restrições personalizadas e use-as nas políticas da organização.

Nesta página, descrevemos como visualizar, criar e gerenciar as restrições da política da organização personalizada. Os administradores criam restrições personalizadas para oferecer um controle mais granular e personalizável sobre os campos específicos restritos pelas políticas da sua organização.

Antes de começar

Para mais informações sobre o que são as políticas e restrições da organização e como elas funcionam, consulte a Introdução ao serviço de políticas da organização.

Funções exigidas

Para receber as permissões necessárias para gerenciar as políticas da organização, peça ao administrador para conceder a você o papel de IAM de administrador da política da organização (roles/orgpolicy.policyAdmin) na organização. Para mais informações sobre como conceder papéis, consulte Gerenciar o acesso.

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

Permissões necessárias

  • 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 papéis personalizados ou outros papéis predefinidos.

Restrições personalizadas

Uma restrição personalizada é criada em um arquivo YAML que especifica os recursos, métodos, condições e ações que estão sujeitos à restrição. Elas são específicas do serviço em que você está aplicando a política da organização. As condições da restrição personalizada são definidas com o Common Expression Language (CEL).

Crie um arquivo YAML para a restrição personalizada:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resource_types: RESOURCE_NAME
method_types:
- METHOD1
- METHOD2
condition: CONDITION
action_type: ACTION
display_name: DISPLAY_NAME
description: DESCRIPTION

Substitua:

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

  • CONSTRAINT_NAME: o nome da sua nova restrição personalizada. Por exemplo, custom.disableGkeAutoUpgrade.

  • RESOURCE_NAME: o nome totalmente qualificado do recurso REST do Google Cloud que contém o objeto e o campo que você quer restringir. Por exemplo, container.googleapis.com/NodePool.

  • METHOD1,METHOD2: uma lista de métodos RESTful para aplicar a restrição. Pode ser CREATE, UPDATE ou ambos. Nem todos os serviços do Google Cloud oferecem suporte aos dois métodos. Para ver os métodos compatíveis com cada serviço, encontre o serviço em Serviços compatíveis.

  • CONDITION: uma condição de CEL que se refere a um recurso de serviço compatível, por exemplo, resource.management.autoUpgrade == false. Para saber mais sobre o uso de CEL, consulte Linguagem de expressão comum.

  • 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.

  • DESCRIPTION: uma descrição legível da restrição a ser exibida como uma mensagem de erro quando a política for violada.

Para mais informações sobre os recursos de serviço que você pode usar nas restrições personalizadas, consulte Serviços compatíveis com restrição personalizada.

Common Expression Language

O serviço de políticas da organização usa a Common Expression Language (CEL) para avaliar as condições das restrições personalizadas. A CEL é uma linguagem completa de código aberto que não é de análise e que implementa semânticas comuns para a avaliação de expressões.

Cada serviço com suporte a restrições personalizadas disponibiliza um conjunto específico de recursos e os campos desses recursos. Os campos disponíveis são altamente tipados e podem ser referenciados diretamente por restrições personalizadas.

Você pode criar condições de CEL que se referem a campos de recursos de serviço com base no tipo do campo. O serviço de políticas da organização é compatível com um subconjunto de tipos de dados, expressões e macros de CEL. As seções abaixo listam os tipos de dados disponíveis e as expressões e macros comuns que funcionam com eles.

Para detalhes sobre quais expressões e macros estão disponíveis para cada serviço, consulte Serviços compatíveis com restrição personalizada.

O exemplo JSON a seguir mostra cada um dos possíveis tipos de campo que você pode referenciar usando restrições personalizadas:

{
  integerValue: 1
  stringValue: "A text string"
  booleanValue: true
  nestedValue: {
    nestedStringValue: "Another text string"
  }
  listValue: [foo, bar]
  mapValue["costCenter"] == "123"
}

Para cada expressão de CEL, a restrição personalizada é aplicada quando a condição é avaliada como true. É possível combinar expressões com e (&&) e ou (||) para criar uma consulta complexa.

Inteiro

Campos de número inteiro, como integerValue no exemplo acima, permitem que os operadores de comparação sejam usados em condições. Exemplo:

resource.integerValue == 1
resource.integerValue > 5
resource.integerValue < 10

String

Os campos de string, como stringValue no exemplo acima, podem ser avaliados usando um literal de string, uma expressão regular ou uma expressão CEL. Exemplo:

resource.stringValue == "abc"
// stringValue is exactly "abc".

resource.stringValue.matches("dev$")
// stringValue matches a regular expression, which specifies the string ends
// with the word "dev".

resource.stringValue.startsWith("startValue")
// stringValue starts with "startValue".

resource.stringValue.endsWith("endValue")
// stringValue ends with "endValue".

resource.stringValue.contains("fooBar")
// stringValue contains "fooBar".

Campos aninhados, como nestedStringValue no exemplo acima, precisam ser referenciados com o caminho completo. Exemplo:

resource.nestedValue.nestedStringValue == "foo"
// nestedValue contains the object nestedStringValue, which has a value of "foo".

Lista

Os campos de lista, como listValue no exemplo acima, podem ser avaliados pelo tamanho e o conteúdo da lista, e se um elemento específico existe em qualquer lugar da lista.

Exemplo:

resource.listValue.size() >= 1 && resource.listValue[0] == "bar"
// listValue has size greater than or equal to one, and the first element is "bar".

resource.listValue.exists(value, value == "foo")
// listValue has at least one element that is exactly "foo".

resource.listValue.all(value, value.contains("foo"))
// listValue is a list of values that are all exactly "foo".

Mapa

Os campos de mapa, como mapValue no exemplo acima, são pares de chave-valor que podem ser avaliados com base na existência e no valor de elementos específicos.

Exemplo:

has(resource.mapValue.foo) && resource.mapValue.foo == "bar"
// mapValue contains the key "foo", and that key has the value "bar".

Solução de erros de CEL

Uma condição criada com expressões inválidas ou incompatibilidades de tipos retorna um erro quando você tenta configurar a restrição personalizada. Por exemplo, considerando a seguinte restrição personalizada inválida, que compara uma string com um número inteiro:

name: organizations/1234567890123/customConstraints/custom.badConfig
resource_types: dataproc.googleapis.com/Cluster
method_types:
- CREATE
- UPDATE
condition: resource.config.masterConfig.numInstances == "mismatch"
action_type: ALLOW
display_name: Number of instances is a string
description: Demonstrate that type mismatches will cause an error.

Um erro será gerado se você tentar configurar essa restrição:

ERROR: (gcloud.org-policies.set-custom-constraint) INVALID_ARGUMENT: Custom constraint condition [resource.config.masterConfig.numInstances == "mismatch"] is invalid. Error: ERROR: <input>:1:15: found no matching overload for '_==_' applied to '(int, string)' (candidates: (%A0, %A0))
 | resource.config.masterConfig.numInstances == "mismatch"
 | ..........................................^.

O serviço de políticas da organização compila e valida as condições que você cria, retornando um erro se a condição não estiver sintática correta. No entanto, há algumas condições que são compiladas, mas resultam em um erro quando o Google Cloud tenta aplicar as restrições. Por exemplo, se você configurar uma restrição com uma condição que tente acessar um índice de lista ou chave de mapa que não existe, a restrição falhará e retornará um erro no momento da aplicação, e bloqueará qualquer tentativa de criar o recurso.

Ao criar condições que dependam de elementos de lista ou mapa, recomendamos iniciar a condição com uma verificação que garanta que ela seja válida em todos os casos. Por exemplo, marque list.size() antes de referenciar um elemento específico da lista ou use has() antes de referenciar um elemento do mapa.

Restrição de exemplo

É possível definir restrições personalizadas semelhantes às predefinidas pelo Google. Uma restrição personalizada típica será semelhante a esta:

name: organizations/1234567890123/customConstraints/custom.disableGkeAutoUpgrade
resource_types: container.googleapis.com/NodePool
method_types:
- CREATE
- UPDATE
condition: resource.management.autoUpgrade == false
action_type: ALLOW
display_name: Disable GKE auto upgrade
description: Only allow GKE NodePool resource to be created or updated if
AutoUpgrade is not enabled where this custom constraint is enforced.

Configurar uma restrição personalizada

Para disponibilizar uma nova restrição personalizada para políticas da organização, configure-a usando a Google Cloud CLI. 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 do arquivo de restrição personalizado. Por exemplo, /home/user/customconstraint.yaml. Depois de concluídas, você verá suas restrições personalizadas como restrições disponíveis na sua lista de políticas da organização do Google Cloud. Para verificar se a restrição personalizada existe, 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. O resultado será assim:
CONSTRAINT: custom.disableGkeAutoUpgrade
LIST_POLICY: -
BOOLEAN_POLICY: SET
ETAG: COCsm5QGENiXi2E=
Para mais informações, consulte Como visualizar as políticas da organização.

Atualizar uma restrição personalizada

É possível atualizar uma restrição personalizada editando o arquivo YAML e usando o comando set-custom-constraint da CLI gcloud novamente. Não há controle de versões de restrições personalizadas, portanto, isso substitui a restrição personalizada existente. Se a restrição personalizada já tiver sido aplicada, a restrição personalizada atualizada vai entrar em vigor imediatamente.

Excluir uma restrição personalizada

Para excluir uma restrição personalizada, use o comando org-policies delete-custom-constraint da CLI gcloud:

gcloud org-policies delete-custom-constraint custom.CONSTRAINT_NAME \
  --organization=123456789

Substitua CONSTRAINT_NAME pelo nome da sua restrição personalizada. Por exemplo, custom.disableGkeAutoUpgrade. A saída será semelhante a esta:

Deleted custom constraint [organizations/123456789/customConstraints/custom.disableGkeAutoUpgrade]

Se você excluir uma restrição personalizada, todas as políticas criadas com essa restrição continuarão a existir, mas serão ignoradas.

Se você criar outra restrição personalizada com o mesmo nome, as restrições da política da organização ignoradas usarão a nova restrição personalizada e não serão mais ignoradas.

Aplicar uma restrição personalizada

Depois que uma restrição personalizada é configurada, ela funciona de maneira idêntica às restrições booleanas predefinidas. O Google Cloud verifica primeiro as restrições personalizadas ao avaliar se uma solicitação de usuário é permitida. Se alguma das restrições personalizadas negar a solicitação, ela será rejeitada. Em seguida, o Google Cloud verifica as restrições predefinidas aplicadas nesse recurso.

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

Console

Para aplicar uma restrição booleana, faça o seguinte:

  1. Abra a página Políticas da organização no Console do Google Cloud.

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

  2. Selecione o Seletor de projetos na parte superior da página.
  3. No Seletor de projetos, escolha aquele em que você quer definir a política da organização.
  4. Selecione a restrição na lista da página Políticas da organização. A página Detalhes da política dessa restrição será exibida.
  5. Para personalizar a política da organização para este recurso, clique em Editar.
  6. Na página Editar, selecione Personalizar.
  7. Clique em Adicionar regra.
  8. Em Aplicação, selecione se a aplicação dessa política da organização deve ser ativada ou desativada.
  9. Opcionalmente, para tornar a política da organização condicional em uma tag, clique em Adicionar condição. Ao adicionar uma regra condicional a uma política da organização, você precisa adicionar pelo menos uma regra condicional ou a política não pode ser salva. Para mais detalhes, consulte Como definir uma política da organização com tags.
  10. Para finalizar e aplicar a política da organização, clique em Salvar. A política levará até 15 minutos para entrar em vigor.

gcloud

Para criar uma política da organização que aplique uma restrição booleana, crie um arquivo JSON de 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 sua restrição.
  • CONSTRAINT_NAME: o nome que você definiu para a restrição personalizada. Por exemplo, custom.disableGkeAutoUpgrade.

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 do arquivo JSON da política da organização. A política levará até 15 minutos para entrar em vigor.

Serviços compatíveis

Cada serviço define o conjunto de campos de restrição personalizados que podem ser usados para aplicar políticas da organização nos recursos de serviço. Para ver uma lista de serviços compatíveis com restrições personalizadas, consulte Serviços compatíveis com restrições personalizadas.

Para mais informações sobre como configurar um verificador de políticas da organização, consulte Descobertas de vulnerabilidade da política da organização.

A seguir