Use políticas da organização personalizadas para políticas de permissão

Esta página mostra como usar restrições personalizadas do serviço de políticas da organização para restringir operações específicas nos seguintes Google Cloud recursos:

  • iam.googleapis.com/AllowPolicy

Para saber mais sobre a política de organização, consulte o artigo Políticas de organização personalizadas.

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

O Google Cloud serviço de políticas 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 aGoogle 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 oferece restrições geridas incorporadas para vários Google Cloud serviços. 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.

Herança de políticas

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

Vantagens

Pode usar políticas de organização personalizadas que referenciam atributos de IAM para controlar a forma como as políticas de autorização podem ser modificadas. Especificamente, pode controlar o seguinte:

  • Quem pode receber funções
  • Quem pode ter as respetivas funções revogadas
  • Que funções podem ser concedidas
  • Que funções podem ser revogadas

Por exemplo, pode impedir que as funções que contêm a palavra admin sejam concedidas a principais cujos endereços de email terminam em @gmail.com.

Limitações

  • As políticas de organização personalizadas no modo de testeque fazem referência a atributos do IAM têm algumas limitações. Em concreto, os registos de auditoria das violações que envolvem o método setIamPolicy podem não ter os seguintes campos:

    • resourceName
    • serviceName
    • methodName
  • Os registos de auditoria não são gerados para todas as violações de políticas da organização personalizadas relacionadas com a IAM. Ou seja, se uma política de organização personalizada fizer com que uma operação setIamPolicy no recurso da organização falhe, oGoogle Cloud não gera um registo de auditoria para esse evento.

  • As políticas de organização personalizadas que fazem referência a atributos do IAM não afetam o seguinte:

  • Os utilizadores podem receber convites para se tornarem proprietários, mesmo que tenha uma política organizacional personalizada que impeça a concessão da função de proprietário (roles/owner). No entanto, embora a política organizacional personalizada não impeça o envio de um convite, impede que os utilizadores convidados recebam a função de proprietário. Se os utilizadores convidados tentarem aceitar o convite, vão encontrar um erro e não lhes vai ser concedida a função de proprietário.

  • Algumas ações no Google Cloud, como a criação de recursos ou a ativação de APIs, envolvem a concessão automática de uma função a um agente de serviço ou a uma conta de serviço predefinida. Se uma ação envolver a concessão automática de uma função e uma política da organização impedir a concessão dessa função, toda a operação pode falhar.

    Se tiver este problema, pode usar etiquetas para desativar temporariamente a restrição que impede a concessão de funções. Em seguida, realize a ação. Após a conclusão da ação, reative a restrição.

Antes de começar

  • Se quiser testar políticas de organização personalizadas que referenciem recursos do IAM, crie um novo projeto. Testar estas políticas da organização num projeto existente pode interromper os fluxos de trabalho de segurança.

    1. In the Google Cloud console, go to the project selector page.

      Go to project selector

    2. Select or create a Google Cloud project.

Funções necessárias

Para receber as autorizações de que precisa para gerir políticas de organização, peça ao seu administrador que lhe conceda as seguintes funções do IAM:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Estas funções predefinidas contêm as autorizações necessárias para gerir as políticas da organização. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

São necessárias as seguintes autorizações para gerir políticas da organização:

  • orgpolicy.* na organização
  • Teste as políticas de organização descritas nesta página: resourcemanager.projects.setIamPolicy no projeto

Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.

Crie uma restrição personalizada

Uma restrição personalizada é definida num ficheiro YAML pelos recursos, métodos, condições e ações suportados pelo serviço no qual está a aplicar a política da organização. As condições para as restrições personalizadas são definidas através do Idioma de expressão comum (IEC). Para mais informações sobre como criar condições em restrições personalizadas através da CEL, consulte a secção CEL do artigo Criar e gerir restrições personalizadas.

Para criar uma restrição personalizada, crie um ficheiro YAML com o seguinte formato:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- RESOURCE_NAME
methodTypes:
- CREATE
- UPDATE
condition: "CONDITION"
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.denyProjectIAMAdmin. O comprimento máximo deste campo é de 70 carateres.

  • RESOURCE_NAME: o nome totalmente qualificado do recurso que contém o objeto e o campo que quer restringir.Google Cloud Por exemplo, iam.googleapis.com/AllowPolicy.

  • CONDITION: uma condição CEL escrita em função de uma representação de um recurso de serviço suportado. Este campo tem um comprimento máximo de 1000 carateres. Consulte o artigo Recursos suportados para mais informações sobre os recursos disponíveis para escrever condições. Por exemplo, resource.bindings.exists(binding, RoleNameMatches(binding.role, ['roles/resourcemanager.projectIamAdmin'])).

  • ACTION: a ação a tomar se a condição condition for cumprida. Os valores possíveis são ALLOW e 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.

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

Configure uma restrição personalizada

Depois de criar o ficheiro YAML para uma nova restrição personalizada, tem de o configurar para o disponibilizar para as políticas da organização na sua 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 seu ficheiro de restrições personalizado. Por exemplo, /home/user/customconstraint.yaml. Após a conclusão, as restrições personalizadas ficam disponíveis como políticas da organização na sua lista de Google Cloud políticas da organização. 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 sua organização. Para mais informações, consulte o artigo Ver políticas da organização.

Aplique uma política da organização personalizada

Pode aplicar uma restrição criando uma política da organização que a referencie e, em seguida, aplicando essa política da organização a um Google Cloud recurso.

Consola

  1. Na Google Cloud consola, aceda à página Políticas da organização.

    Aceda às políticas da organização

  2. No seletor de projetos, selecione o projeto para o qual quer definir a política de organização.
  3. Na lista da página Políticas da organização, selecione a restrição para ver a página Detalhes da política dessa restrição.
  4. Para configurar a política da organização para este recurso, clique em Gerir política.
  5. Na página Editar política, selecione Substituir política do elemento principal.
  6. Clique em Adicionar regra.
  7. Na secção Aplicação, selecione se a aplicação desta política organizacional está ativada ou desativada.
  8. Opcional: para tornar a política de organização condicional a uma etiqueta, clique em Adicionar condição. Tenha em atenção que, se adicionar uma regra condicional a uma política da organização, tem de adicionar, pelo menos, uma regra incondicional. Caso contrário, não é possível guardar a política. Para mais informações, consulte o artigo Definir uma política de organização com etiquetas.
  9. Clique em Testar alterações para simular o efeito da política da organização. A simulação de políticas não está disponível para restrições geridas antigas. Para mais informações, consulte o artigo Teste as alterações da política da organização com o simulador de políticas.
  10. Para concluir e aplicar a política da organização, clique em Definir política. A política demora até 15 minutos a entrar em vigor.

gcloud

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

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

Substitua o seguinte:

  • PROJECT_ID: o projeto no qual quer aplicar a restrição.
  • CONSTRAINT_NAME: o nome que definiu para a restrição personalizada. Por exemplo, custom.denyProjectIAMAdmin.

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 ficheiro YAML da política da organização. A política demora até 15 minutos a entrar em vigor.

Teste a política da organização personalizada

Opcionalmente, pode testar a política da organização definindo a política e, em seguida, tentando realizar uma ação que a política deve impedir.

Crie a restrição

  1. Guarde o seguinte ficheiro como constraint-deny-project-iam-admin.

    name: organizations/ORG_ID/customConstraints/custom.denyProjectIAMAdmin
    resourceTypes: iam.googleapis.com/AllowPolicy
    methodTypes:
      - CREATE
      - UPDATE
    condition:
      "resource.bindings.exists(
        binding,
        RoleNameMatches(binding.role, ['roles/resourcemanager.projectIamAdmin']) &&
        binding.members.exists(member,
          MemberSubjectMatches(member, ['user:EMAIL_ADDRESS'])
        )
      )"
    actionType: DENY
    displayName: Do not allow EMAIL_ADDRESS to be granted the Project IAM Admin role.
    

    Substitua os seguintes valores:

    • ORG_ID: o ID numérico da sua organizaçãoGoogle Cloud .
    • MEMBER_EMAIL_ADDRESS: o endereço de email do principal que quer usar para testar a restrição personalizada. Enquanto a restrição estiver ativa, não é possível conceder a esta entidade o papel de administrador do IAM do projeto (roles/resourcemanager.projectIamAdmin) no projeto para o qual aplica a restrição.
  2. Aplique a restrição:

    gcloud org-policies set-custom-constraint ~/constraint-deny-project-iam-admin.yaml
    
  3. Verifique se a restrição existe:

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

Crie a política

  1. Guarde o seguinte ficheiro como policy-deny-project-iam-admin.yaml:

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

    Substitua PROJECT_ID pelo ID do seu projeto.

  2. Aplique a política:

    gcloud org-policies set-policy ~/policy-deny-project-iam-admin.yaml
    
  3. Verifique se a política existe:

    gcloud org-policies list --project=PROJECT_ID
    

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

Experimente conceder a função de administrador de IAM do projeto (roles/resourcemanager.projectIamAdmin) ao principal cujo endereço de email incluiu na restrição personalizada. Antes de executar o comando, substitua os seguintes valores:

  • PROJECT_ID: o ID do projeto onde aplicou a restrição Google Cloud
  • EMAIL_ADDRESS: o endereço de email do principal que especificou quando criou a restrição da política da organização.
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL_ADDRESS --role=roles/resourcemanager.projectIamAdmin

O resultado é o seguinte:

Operation denied by custom org policies: ["customConstraints/custom.denyProjectIAMAdmin": "EMAIL_ADDRESS can't be granted the Project IAM Admin role."]

Exemplos de políticas da organização personalizadas para exemplos de utilização comuns

A tabela seguinte apresenta a sintaxe de algumas restrições personalizadas para exemplos de utilização comuns.

Os exemplos seguintes usam as macros de IEC all e exists. Para mais informações sobre estas macros, consulte Macros para avaliar listas.

Descrição Sintaxe de restrição
Bloquear a capacidade de conceder uma função específica.
name: organizations/ORG_ID/customConstraints/custom.denyRole
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
"resource.bindings.exists(
    binding,
    RoleNameMatches(binding.role, ['ROLE'])
  )"
actionType: DENY
displayName: Do not allow the ROLE role to be granted
Permitir apenas a concessão de funções específicas.
name: organizations/ORG_ID/customConstraints/custom.specificRolesOnly
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    RoleNameMatches(binding.role, ['ROLE_1', 'ROLE_2'])
  )"
actionType: ALLOW
displayName: Only allow the ROLE_1 role and ROLE_2 role to be granted
Impedir a concessão de funções que comecem por roles/storage..
name: organizations/ORG_ID/customConstraints/custom.dontgrantStorageRoles
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    RoleNameStartsWith(binding.role, ['roles/storage.'])
  )"
actionType: DENY
displayName: Prevent roles that start with "roles/storage." from being granted
Impedir a revogação de funções com admin no nome.
name: organizations/ORG_ID/customConstraints/custom.dontRevokeAdminRoles
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - REMOVE_GRANT
condition:
  "resource.bindings.exists(
    binding,
    RoleNameContains(binding.role, ['admin'])
  )"
actionType: DENY
displayName: Prevent roles with "admin" in their names from being revoked
Permitir que apenas determinados responsáveis recebam funções.
name: organizations/ORG_ID/customConstraints/custom.allowSpecificPrincipals
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    binding.members.all(member,
      MemberSubjectMatches(member, ['user:USER','serviceAccount:SERVICE_ACCOUNT'])
    )
  )"
actionType: ALLOW
displayName: Only allow roles to be granted to USER and SERVICE_ACCOUNT
Impedir que funções sejam revogadas de determinados responsáveis.
name: organizations/ORG_ID/customConstraints/custom.denyRemovalOfSpecificPrincipals
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - REMOVE_GRANT
condition:
  "resource.bindings.exists(
    binding,
    binding.members.exists(member,
      MemberSubjectMatches(member, ['user:USER_1','user:USER_2'])
    )
  )"
actionType: DENY
displayName: Do not allow roles to be revoked from USER_1 or USER_2
Impedir que os responsáveis com endereços de email que terminam em @gmail.com recebam funções.
name: organizations/ORG_ID/customConstraints/custom.dontGrantToGmail
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    binding.members.exists(member,
      MemberSubjectEndsWith(member, ['@gmail.com'])
    )
  )"
actionType: DENY
displayName: Do not allow members whose email addresses end with "@gmail.com" to be granted roles
Permitir que apenas funções específicas sejam concedidas e apenas a responsáveis específicos.
name: organizations/ORG_ID/customConstraints/custom.allowSpecificRolesAndPrincipals
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    RoleNameMatches(binding.role, ['ROLE_1', 'ROLE_2'])  &&
    binding.members.all(member,
      MemberSubjectMatches(member, ['serviceAccount:SERVICE_ACCOUNT', 'group:GROUP'])
    )
  )"
actionType: ALLOW
displayName: Only allow ROLE_1 and ROLE_2 to be granted to SERVICE_ACCOUNT and GROUP
Impedir que as funções do Cloud Storage sejam concedidas a allUsers e allAuthenticatedUsers.
name: organizations/ORG_ID/customConstraints/custom.denyStorageRolesForPrincipalAllUsers
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    RoleNameStartsWith(binding.role, ['roles/storage.']) &&
    binding.members.exists(member,
      MemberSubjectMatches(member, ['allUsers', 'allAuthenticatedUsers'])
    )
  )"
actionType: DENY
displayName: Do not allow storage roles to be granted to allUsers or allAuthenticatedUsers
Impedir que sejam concedidas funções a identidades fora da sua organização.
name: organizations/ORG_ID/customConstraints/custom.allowInternaldentitiesOnly
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    binding.members.all(member,
      MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/ORG_ID'])
    )
  )"
actionType: ALLOW
displayName: Only allow organization members to be granted roles
Permitir apenas que as contas de serviço recebam funções.
name: organizations/ORG_ID/customConstraints/custom.allowServiceAccountsOnly
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    binding.members.all(member,
      MemberTypeMatches(member, ['iam.googleapis.com/ServiceAccount'])
    )
  )"
actionType: ALLOW
displayName: Only allow service accounts to be granted roles
Impedir a remoção de agentes de serviço geridos pela Google de associações de funções.
name: organizations/ORG_ID/customConstraints/custom.denyRemovalOfGoogleManagedServiceAgents
resource_types: iam.googleapis.com/AllowPolicy
method_types:
  - REMOVE_GRANT
condition: |-
  resource.bindings.all(
      binding,
      binding.members.all(member,
        MemberTypeMatches(member, ['iam.googleapis.com/ServiceAgent'])
      )
    )
action_type: DENY
display_name: Deny Removal Of Google-Managed Service Agents
description: Restricts the removal of Google-managed service agents from role bindings. Please reach out to your organization admins for if you have any questions.

Políticas da organização condicionais

Pode tornar uma política de organização personalizada condicional através de etiquetas. Por exemplo, imagine que escreveu a seguinte restrição personalizada para impedir que sejam concedidas funções que comecem por roles/storage.:

name: organizations/ORG_ID/customConstraints/custom.dontgrantStorageRoles
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    RoleNameStartsWith(binding.role, ['roles/storage.'])
  )"
actionType: DENY
displayName: Prevent roles that start with "roles/storage." from being granted

Para aplicar a restrição condicionalmente, pode criar uma política de organização como a seguinte:

name: organizations/ORG_ID/policies/custom.dontgrantStorageRoles
spec:
  rules:
  - condition:
      expression: "resource.matchTag('ORG_ID/environment', 'dev')"
    enforce: true
  - enforce: false

Esta política da organização impede que sejam concedidas funções que comecem por roles/storage. a qualquer recurso que também tenha a etiqueta environment=dev.

Recursos suportados pela gestão de identidade e de acesso

O IAM suporta o recurso AllowPolicy. Este recurso tem o atributo resources.bindings, que é devolvido para todos os métodos que modificam a política de autorização de um recurso. Todos os métodos que modificam a política de permissão de um recurso terminam com setIamPolicy.

O atributo resource.bindings tem a seguinte estrutura, em que BINDINGS é uma matriz de associações de funções que foram modificadas durante uma alteração a uma política de permissão:

{
  "bindings": {
    BINDINGS
  }
}

Cada associação em resource.bindings tem a seguinte estrutura, em que ROLE é o nome da função na associação de funções e MEMBERS é uma lista de identificadores de todos os principais que foram adicionados ou removidos da associação de funções:

{
  "role": "ROLE"
  "members": {
    MEMBERS
  }
}

Para ver os formatos que os identificadores principais podem ter, consulte Identificadores principais.

Só pode avaliar o atributo resource.bindings e os respetivos campos através das funções suportadas. Outros operadores e funções, como ==, !=, in, contains, startsWith e endsWith, não são suportados.

Funções suportadas

Pode usar as seguintes funções de IEC para avaliar funções e membros individuais numa associação.

Para avaliar todas as associações na matriz bindings ou todos os membros na matriz members, use as macros all e exists. Para mais informações, consulte Macros para avaliar listas nesta página.

Também pode usar os operadores lógicos && (and) e || (or) para escrever condições multipartes.

Função Descrição
RoleNameMatches(
  role,
  roleNames: list
)
  bool

Devolve true se a função role corresponder totalmente a, pelo menos, uma das funções indicadas em roleNames.

Parâmetros
role: a função a avaliar.
roleNames: uma lista de nomes de funções para comparar.
Exemplo

Devolve true se o role no binding especificado for roles/storage.admin ou roles/compute.admin:

RoleNameMatches(binding.role, ['roles/storage.admin', 'roles/compute.admin'])
RoleNameStartsWith(
  role,
  rolePrefixes: list
)
  bool

Devolve true se a função role começar com, pelo menos, uma das strings indicadas em rolePrefixes.

Parâmetros
role: a função a avaliar.
rolePrefixes: uma lista de strings para comparar com o início da função.
Exemplo

Devolve true se o role no binding especificado começar com roles/storage:

RoleNameStartsWith(binding.role, ['roles/storage'])
RoleNameEndsWith(
  role,
  roleSuffixes: list
)
  bool

Devolve true se a função role terminar com, pelo menos, uma das strings indicadas em roleSuffixes.

Parâmetros
role: a função a avaliar.
roleSuffixes: uma lista de strings para comparar com o final da função.
Exemplo

Devolve true se o role no binding especificado terminar com .admin:

RoleNameEndsWith(binding.role, ['.admin'])
RoleNameContains(
  role,
  roleSubstrings: list
)
  bool

Devolve true se a função role contiver, pelo menos, uma das strings indicadas em roleSubstrings.

Parâmetros
role: a função a avaliar.
roleSubstrings: uma lista de strings para corresponder a qualquer parte da função.
Exemplo

Devolve true se o role no binding especificado contiver a string admin:

RoleNameContains(binding.role, ['admin'])
MemberSubjectMatches(
  member,
  memberNames: list
)
  bool

Devolve true se o membro member corresponder totalmente a, pelo menos, um dos membros indicados em memberNames.

Se o identificador de member for um endereço de email, esta função avalia o endereço de email, bem como quaisquer alias desse endereço de email.

Parâmetros
member: o membro a avaliar.
memberNames: uma lista de nomes de membros para comparar.
Exemplo

Devolve true se o membro member for rosario@example.com:

MemberSubjectMatches(member, ['user:rosario@example.com'])
MemberSubjectStartsWith(
  member,
  memberPrefixes: list
)
  bool

Devolve true se o membro member começar com, pelo menos, uma das strings indicadas em memberPrefixes.

Se o identificador de member for um endereço de email, esta função avalia o endereço de email, bem como quaisquer alias desse endereço de email.

Parâmetros
member: o membro a avaliar.
memberPrefixes: uma lista de strings para comparar com o início do nome do membro.
Exemplo

Devolve true se o membro member começar com user:prod-:

MemberSubjectStartsWith(member, ['user:prod-'])
MemberSubjectEndsWith(
  member,
  memberSuffixes: list
)
  bool

Devolve true se o membro member terminar com, pelo menos, uma das strings indicadas em memberSuffixes.

Se o identificador de member for um endereço de email, esta função avalia o endereço de email, bem como quaisquer alias desse endereço de email.

Parâmetros
member: o membro a avaliar.
memberSuffixes: uma lista de strings para fazer corresponder ao final do nome do membro.
Exemplo

Devolve true se o membro member terminar com @example.com:

MemberSubjectEndsWith(member, ['@example.com'])
MemberInPrincipalSet(
  member,
  principalSets: list
)
  bool

Devolve true se o membro pertencer a, pelo menos, um dos conjuntos principais indicados.

Parâmetros
member: o membro a avaliar.

principalSets: uma lista de conjuntos de principais. Para que a função seja avaliada como true, o membro tem de estar em, pelo menos, um destes conjuntos de principais.

O único conjunto de principais suportado é o conjunto de principais da organização, que tem o formato //cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID. Quando usado na função MemberInPrincipalSet, este conjunto de principais inclui os seguintes principais:

  • Todas as identidades em todos os domínios associados ao seu ID de cliente do Google Workspace
  • Todos os Workload Identity Pools na sua organização
  • Todas as contas de serviço e Workload Identity Pools em qualquer projeto na organização
  • Todos os agentes de serviços associados a recursos na sua organização.
Exemplo

Devolve true se o membro member pertencer à organização @example.com, que tem o ID 123456789012:

MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/123456789012'])
MemberTypeMatches(
  member,
  principalType: list
)
  bool

Devolve true se o membro for um dos tipos principais indicados.

Parâmetros
member: o membro a avaliar.
principalType: uma lista de tipos principais. Para que a função seja avaliada como true, o membro tem de ser um dos tipos de principal indicados. Para saber que tipos de diretor estão suportados, consulte os tipos de diretor suportados para MemberTypeMatches.
Exemplo

Devolve true se o membro member tiver o tipo principal iam.googleapis.com/WorkspacePrincipal ou iam.googleapis.com/WorkspaceGroup:

MemberTypeMatches(member, ['iam.googleapis.com/WorkspacePrincipal', 'iam.googleapis.com/WorkspaceGroup'])

Macros para avaliar listas

Use as macros all e exists para avaliar uma expressão de condição para uma lista de itens.

Macro Descrição
list.all(
  item,
  conditionExpression
)
  bool

Devolve true se conditionExpression for avaliado como true para todos os item em list.

Normalmente, esta macro é usada para políticas da organização personalizadas com o parâmetro actionType ALLOW. Por exemplo, pode usar esta macro para garantir que uma ação só é permitida se todos os principais modificados cumprirem a condição.

Parâmetros
list: a lista de itens a avaliar.
item: o item de lista a avaliar. Por exemplo, se chamar este método na lista resource.bindings, use o valor binding.
conditionExpression: a expressão de condição para avaliar cada item.
Exemplo

Devolve true se todas as associações em resource.bindings tiverem funções que comecem por roles/storage.. Devolve false se alguma das associações tiver funções que não comecem por roles/storage.:

resource.bindings.all(binding, RoleNameStartsWith(binding.role, ['roles/storage.']))
list.exists(
  item,
  conditionExpression
)
  bool

Devolve true se conditionExpression for avaliado como true para qualquer item em list.

Normalmente, esta macro é usada para políticas da organização personalizadas com o elemento actionType DENY. Por exemplo, pode usar esta macro para garantir que uma ação é recusada se qualquer um dos principais modificados cumprir a condição.

Parâmetros
list: a lista de itens a avaliar.
item: o item de lista a avaliar. Por exemplo, se chamar este método na lista resource.bindings, use o valor binding.
conditionExpression: a expressão de condição para avaliar cada item.
Exemplo

Devolve true se alguma das associações em resource.bindings tiver funções que comecem por roles/storage.. Devolve false se nenhuma das associações tiver funções que comecem por roles/storage.:

resource.bindings.exists(binding, RoleNameStartsWith(binding.role, ['roles/storage.']))

Condições com listas aninhadas

Em geral, se a sua condição incluir listas aninhadas, deve usar a mesma macro para todas as listas na condição.

Considere os seguintes exemplos:

  • Se a sua política tiver o elemento actionType ALLOW, use a macro all para a lista members e a lista bindings para garantir que as modificações da política só são permitidas se todos os membros em todas as associações modificadas satisfizerem a condição.
  • Se a sua política tiver o operador actionType DENY, use a macro exists para a lista members e a lista bindings para garantir que as modificações da política não são permitidas se qualquer membro em qualquer associação modificada satisfizer a condição.

A combinação de macros numa única condição pode resultar numa condição que não se comporta como pretendido.

Por exemplo, imagine que quer impedir que sejam concedidas funções a membros fora da organização example.com. A organização example.com tem o ID 123456789012.

Para atingir este objetivo, escreve a seguinte condição:

Não recomendado: condição configurada incorretamente

"resource.bindings.all(
  binding,
  binding.members.exists(member,
    MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/123456789012'])
  )
)"

Esta condição parece impedir que sejam concedidas funções a membros fora da organização example.com. No entanto, a condição é avaliada como true se qualquer membro em cada uma das associações de funções modificadas estiver na example.comorganização. Como resultado, ainda pode conceder funções a membros fora da organização example.com se também conceder a mesma função a um membro na organização example.com.

Por exemplo, a condição é avaliada como true para o seguinte conjunto de associações, mesmo que um dos membros não esteja na organização example.com:

 "bindings": [
    {
      "members": [
        "user:raha@altostrat.com",
        "user:jie@example.com"
      ],
      "role": "roles/resourcemanager.projectCreator"
    }
  ],

Em vez disso, deve escrever uma condição como a seguinte:

Recomendado: condição configurada corretamente

"resource.bindings.all(
  binding,
  binding.members.all(member,
    MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/123456789012'])
  )
)"

A utilização da macro all para a matriz members.bindings e a matriz resource.bindings garante que a condição é avaliada como true apenas se todos os membros em todas as associações estiverem no conjunto principal example.com.

Tipos de principais suportados para MemberTypeMatches

A função MemberTypeMatches requer que especifique a que tipo de principal o membro especificado tem de corresponder.

A tabela seguinte lista os tipos principais que pode introduzir e uma descrição do que o tipo principal representa. Também indica os identificadores principais que correspondem a cada tipo de principal. Estes identificadores são os valores usados nas políticas da IAM.

Tipo de principal Descrição Identificadores principais
iam.googleapis.com/ConsumerPrincipal Uma Conta Google de consumidor. Normalmente, os endereços de email destas contas terminam em gmail.com. user:USER_EMAIL_ADDRESS
iam.googleapis.com/WorkspacePrincipal Uma Conta Google que faz parte de uma conta do Cloud ID ou do Google Workspace. Estas contas também são denominadas contas de utilizador geridas. user:USER_EMAIL_ADDRESS
iam.googleapis.com/ConsumerGroup Um grupo Google criado por uma Conta Google de consumidor. Estes grupos não são propriedade de uma conta do Cloud ID ou do Google Workspace. Normalmente, as moradas de email destes grupos terminam em googlegroups.com. group:GROUP_EMAIL_ADDRESS
iam.googleapis.com/WorkspaceGroup Um grupo Google pertencente a uma conta do Cloud ID ou Google Workspace. group:GROUP_EMAIL_ADDRESS
iam.googleapis.com/Domain Uma conta do Cloud ID ou Google Workspace. domain:DOMAIN
iam.googleapis.com/WorkforcePoolPrincipal Um único principal num Workforce Identity Pool. principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
iam.googleapis.com/WorkforcePoolPrincipalSet Um conjunto de principais que contém um conjunto de identidades num workforce identity pool. Por exemplo, um conjunto de principais que contém todos os principais num grupo de identidades da força de trabalho.
  • principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/group/GROUP_ID
  • principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
  • principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*
iam.googleapis.com/WorkloadPoolPrincipal Uma única identidade num Workload Identity Pool principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
iam.googleapis.com/WorkloadPoolPrincipalSet Um conjunto de principais que contém um conjunto de identidades num Workload Identity Pool. Por exemplo, um conjunto de entidades principais que contém todas as entidades principais num Workload Identity Pool.
  • principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP_ID
  • principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
  • principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
iam.googleapis.com/ServiceAccount

Qualquer conta de serviço. Uma conta de serviço é um tipo especial de conta que representa uma carga de trabalho em vez de um utilizador humano.

No contexto da função MemberTypeMatches, este tipo de principal não inclui agentes de serviço.

serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS
iam.googleapis.com/ServiceAgent Qualquer agente do serviço. Um agente de serviço é um tipo especial de conta de serviço que Google Cloud cria e gere. Quando são concedidas funções nos seus projetos, os agentes de serviços permitem que os Google Cloud serviços possam realizar ações em seu nome. serviceAccount:SERVICE_AGENT_EMAIL_ADDRESS
iam.googleapis.com/PublicPrincipals Os principais allUsers e allAuthenticatedUsers.
  • allUsers
  • allAuthenticatedUsers
iam.googleapis.com/ProjectRoleReference Entidades definidas com base na função que lhes é concedida. Estes diretores também são denominados valores de conveniência.
  • projectOwner:PROJECT_ID
  • projectEditor:PROJECT_ID
  • projectViewer:PROJECT_ID
iam.googleapis.com/ResourcePrincipal Um recurso com uma identidade integrada. Qualquer um dos identificadores principais indicados em Identificadores principais para recursos únicos.
iam.googleapis.com/ResourcePrincipalSet Recursos com identidades incorporadas que partilham determinadas caraterísticas, como o tipo ou o ancestral. Qualquer um dos identificadores indicados em Identificadores principais para conjuntos de recursos.

O que se segue?