Vista geral das condições do IAM

Esta página descreve a funcionalidade de condições da gestão de identidade e de acesso (IAM). Pode usar as condições da IAM para definir e aplicar o controlo de acesso condicional baseado em atributos para Google Cloud recursos.

Condições e tipos de políticas

Pode usar condições nos seguintes locais:

  • Permitir associações de funções de políticas, incluindo associações de funções geridas por autorizações do Gestor de acesso privilegiado
  • Regras da política de recusa
  • Associações de políticas para políticas de limite de acesso principal

As secções seguintes descrevem como pode usar condições em cada um destes locais para aplicar o controlo de acesso baseado em atributos.

Condições nas políticas de permissão

Pode usar condições em políticas de permissão para optar por conceder acesso a diretores apenas se forem cumpridas as condições especificadas. Por exemplo, pode conceder acesso temporário aos utilizadores para que possam resolver um problema de produção ou conceder acesso apenas aos funcionários que fazem pedidos a partir da sua rede empresarial.

As condições são especificadas nas associações de funções da política de autorização de um recurso. Se uma associação de funções tiver uma condição, os principais na função só recebem a função se a expressão de condição for avaliada como true.

Para adicionar uma condição a uma associação de funções, defina o campo condition:

"bindings": [   {     "role": "ROLE",     "members": [       "MEMBER_1",       "MEMBER_2"     ],     "condition": {       "title": "TITLE",       "description": "DESCRIPTION",       "expression": "EXPRESSION"     }   } ]
Se estiver a usar autorizações do Privileged Access Manager, também pode adicionar condições às funções nessa autorização. Quando um utilizador pede com êxito uma concessão para essa autorização, é-lhe concedida a função com a condição especificada.

Para saber mais acerca dos campos numa condição, consulte a estrutura da condição nesta página.

Apenas alguns tipos de recursos aceitam condições em associações de funções. No entanto, pode conceder acesso condicional a outros tipos de recursos concedendo funções ao nível da organização ou do projeto.

Como prática recomendada, não adicione mais de 100 associações de funções condicionais a uma única política de autorização. Se usar um número maior de associações de funções condicionais, pode exceder o limite de tamanho geral das políticas de autorização.

Para saber como adicionar, modificar e remover associações de funções condicionais, consulte o artigo Gerir associações de funções condicionais.

Condições nas políticas de recusa

Pode usar condições em políticas de recusa para aplicar uma regra de recusa apenas se uma determinada condição for cumprida. Por exemplo, pode recusar uma autorização apenas se o recurso ao qual o principal está a tentar aceder estiver etiquetado como parte do ambiente prod.

As condições são especificadas nas regras de recusa nas políticas de recusa de um recurso. Se a condição for avaliada como true ou não puder ser avaliada, a regra de recusa aplica-se e os principais não podem usar as autorizações especificadas. Se a condição for avaliada como false, a regra de negação não se aplica e os principais podem usar as autorizações especificadas, se as tiverem.

As condições nas políticas de negação têm a mesma estrutura que as condições nas políticas de permissão. No entanto, apenas reconhecem funções de etiquetas de recursos.

Para adicionar uma condição a uma regra de recusa, defina o campo denialCondition:

"rules": [   {     "denyRule": {       "deniedPrincipals": [         "PRINCIPAL_1",         "PRINCIPAL_2"       ],       "exceptionPrincipals": [         "EXCEPTION_PRINCIPAL_1",         "EXCEPTION_PRINCIPAL_2"       ],       "deniedPermissions": [         "DENIED_PERMISSION_1",         "DENIED_PERMISSION_2"       ],       "denialCondition": {         "title": "TITLE",         "description": "DESCRIPTION",         "expression": "EXPRESSION"       }     }   } ]

Para saber mais acerca dos campos numa condição, consulte a estrutura da condição nesta página.

Para saber como criar e gerir políticas de negação, consulte o artigo Negue o acesso.

Condições nas associações de políticas de limites de acesso principais

Pode usar condições em associações de políticas para políticas de limites de acesso principais para refinar o conjunto principal ao qual a política de limites de acesso principal se aplica. Por exemplo, pode aplicar apenas uma política a contas de serviço ou isentar [email protected] de uma política.

As condições são especificadas em cada associação de políticas. Se uma associação de políticas tiver uma condição, a política na associação de políticas só é aplicada se a condição for avaliada como true.

Para adicionar uma condição a uma associação de políticas, defina o campo condition na associação de políticas:

{   "displayName": "DISPLAY_NAME",   "target": {     "principalSet": "PRINCIPAL_SET"   },   "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",   "policy": "PAB_POLICY",   "condition": {     "title": "TITLE",     "description": "DESCRIPTION",     "expression": "EXPRESSION"   } }

Para saber mais acerca dos campos numa condição, consulte a estrutura da condição nesta página.

Para saber como criar associações de políticas para políticas de limite de acesso principal, consulte o artigo Aplique uma política de limite de acesso principal a um conjunto de principais.

Estrutura da condição

O objeto condition tem a seguinte estrutura:

"condition": {     "title": ...,     "description": ...,     "expression": ... }

O title da condição é obrigatório, mas o description é opcional. O título e a descrição são campos puramente informativos para ajudar a identificar e descrever a condição.

O campo expression é obrigatório. Define uma expressão lógica baseada em atributos usando um subconjunto do Idioma de expressão comum (IEC). A expressão de condição pode conter várias declarações. Cada declaração avalia um atributo. As declarações são combinadas através de operadores lógicos, de acordo com a especificação da linguagem CEL.

IEC para condições

O Idioma de expressão comum, ou IEC, é o idioma de expressão usado para especificar uma expressão nas condições do IAM. É adaptada para expressar expressões lógicas baseadas em atributos. Para mais informações, consulte a especificação CEL e a respetiva definição de linguagem.

Nas condições do IAM, é usado um subconjunto do CEL para tomar decisões de autorização booleanas com base nos dados de atributos. Em geral, uma expressão de condição consiste numa ou mais declarações unidas por operadores lógicos (&&, || ou !).

Cada declaração expressa uma regra de controlo baseada em atributos e, em última análise, determina se a associação de funções, a regra de negação ou a associação de políticas se aplica.

As condições nas condições do IAM usam as seguintes funcionalidades do CEL:

  • Variáveis: as condições usam variáveis para expressar um determinado atributo, como request.time (do tipo Data/hora) ou resource.name (do tipo String). Estas variáveis são preenchidas com valores baseados no contexto no momento da execução.
  • Operadores: todos os tipos de dados, como Data/hora ou String, suportam um conjunto de operadores que podem ser usados para criar uma expressão lógica. Normalmente, os operadores são usados para comparar o valor contido numa variável com um valor literal, como resource.service == 'compute.googleapis.com'. Neste exemplo, se o valor de entrada de resource.service for compute.googleapis.com, a expressão é avaliada como true.
  • Funções: uma função é um operador composto para tipos de dados que suportam operações mais complexas. Nas expressões de condições, existem funções predefinidas que podem ser usadas com um determinado tipo de dados. Por exemplo, a função request.path.startsWith('/finance') usa uma função de correspondência de prefixo de string e é avaliada como true se o valor de request.path contiver um prefixo correspondente, como /finance.
  • Operadores lógicos: as condições suportam três operadores lógicos que podem ser usados para criar expressões lógicas complexas a partir de declarações de expressões básicas: &&, || e !. Estes operadores lógicos permitem usar várias variáveis de entrada numa expressão de condição. Por exemplo: request.time.getFullYear() < 2020 && resource.service == 'compute.googleapis.com' junta duas declarações básicas e exige que ambas as declarações sejam cumpridas para produzir um true resultado da avaliação geral.

Para mais informações sobre as variáveis, os operadores e as funções suportados, consulte a referência de atributos.

Atributos de condição

Os atributos de condição baseiam-se no recurso pedido, por exemplo, o respetivo tipo ou nome, ou em detalhes sobre o pedido, por exemplo, a respetiva data/hora ou endereço IP de destino.

Os atributos de condição que pode usar numa expressão de condição dependem do tipo de política para o qual está a escrever condições. Para ver uma lista completa dos atributos de condição e mais informações acerca dos atributos suportados para cada tipo de política, consulte a referência de atributos.

As secções seguintes mostram exemplos de alguns dos atributos que pode usar em condições.

Atributos do recurso

Pode usar atributos de recursos para escrever condições que avaliam o recurso no pedido de acesso. Os atributos que pode avaliar incluem o seguinte:

  • O tipo de recurso
  • O nome do recurso
  • O serviço Google Cloud que está a ser usado
  • As etiquetas anexadas ao recurso

Pode usar qualquer um destes atributos em associações de funções de políticas de permissão. Além disso, pode usar o atributo de etiquetas de recursos nas regras de recusa da política de recusa.

Para ver uma lista completa dos atributos de recursos, consulte a referência de atributos de recursos.

Para saber como usar atributos de recursos para configurar o acesso baseado em recursos, consulte o artigo Configurar o acesso baseado em recursos.

Exemplos de expressões

Numa associação de funções, a seguinte expressão de condição permite o acesso a instâncias de VMs do Compute Engine, mas não a outro tipo de recurso:

resource.type == 'compute.googleapis.com/Instance' 

Numa associação de funções, a seguinte expressão de condição permite o acesso a recursos do Cloud Storage, mas não a recursos de outros serviços:

resource.service == 'storage.googleapis.com' 

Numa associação de funções, a seguinte expressão de condição permite o acesso apenas a objetos do Cloud Storage num contentor específico:

resource.type == 'storage.googleapis.com/Object' && resource.name.startsWith('projects/_/buckets/exampleco-site-assets/') 

Numa regra de recusa, a seguinte expressão de condição recusa o acesso a Google Cloud recursos que têm a etiqueta env: prod:

resource.matchTag('123456789012/env', 'prod') 

Atributos principais

Os atributos principais permitem-lhe escrever condições com base no principal que emitiu o pedido. Os atributos que pode avaliar incluem o seguinte:

  • O tipo de principal no pedido
  • A identidade do principal no pedido

Pode usar estes atributos em associações de políticas para políticas de limite de acesso principal.

Para ver detalhes, consulte a referência do atributo de condições.

Exemplos de expressões

Numa associação de políticas de limite de acesso principal, a seguinte expressão de condição garante que a política na associação só é aplicada a contas de serviço:

principal.type == 'iam.googleapis.com/ServiceAccount' 

Numa associação de políticas de limites de acesso principais, a seguinte expressão de condição garante que a política na associação não é aplicada a [email protected]:

principal.subject != '[email protected]' 

Atributos de pedido

Pode usar atributos de pedidos para escrever condições que avaliam detalhes sobre o pedido, como os seguintes:

  • O nível de acesso
  • A data e a hora
  • O endereço IP e a porta de destino (para o túnel TCP do IAP)
  • O anfitrião ou o caminho do URL esperado (para IAP)

Pode usar estes atributos em associações de funções de políticas de permissão.

Exemplo de expressão de nível de acesso (apenas para IAP)

No exemplo seguinte, a sua organização define um nível de acesso, CorpNet, que limita o acesso ao intervalo de endereços IP onde o tráfego entra e sai de uma rede empresarial. Em seguida, adicione a seguinte expressão de condição a uma associação de funções para permitir o acesso apenas se o pedido cumprir o nível de acesso CorpNet:

'accessPolicies/199923665455/accessLevels/CorpNet' in request.auth.access_levels 

A sua organização define níveis de acesso com base nos atributos do pedido, como o endereço IP de origem, os atributos do dispositivo, a hora do dia e muito mais. Para mais detalhes, consulte a documentação do Access Context Manager.

Exemplo de expressão de atributo da API

Numa associação de funções para uma função com a autorização iam.projects.setIamPolicy, a seguinte expressão de condição permite que um utilizador conceda e revogue apenas a função de administrador da conta de faturação (roles/billing.admin) no projeto:

api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])                  .hasOnly(['roles/billing.admin']) 

Para saber como usar atributos da API para limitar a concessão de funções, consulte o artigo Definir limites na concessão de funções.

Exemplos de expressões de data/hora

Numa associação de funções, a seguinte expressão de condição permite o acesso até à meia-noite de 1 de janeiro de 2021:

request.time < timestamp('2021-01-01T00:00:00Z') 

Numa associação de funções, a seguinte expressão de condição permite o acesso apenas durante o horário de trabalho especificado, com base no fuso horário de Berlim, Alemanha:

request.time.getHours('Europe/Berlin') >= 9 && request.time.getHours('Europe/Berlin') <= 17 && // Days of the week range from 0 to 6, where 0 == Sunday and 6 == Saturday. request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= ' 

Numa associação de funções, a seguinte expressão de condição permite o acesso apenas para junho de 2020, com base no fuso horário de Berlim, Alemanha:

request.time.getFullYear('Europe/Berlin') == 2020 request.time.getMonth('Europe/Berlin') < 6 

Para especificar uma data/hora, use o formato RFC 3339. Para especificar um fuso horário, use os identificadores na base de dados de fusos horários da IANA.

Para mais detalhes sobre expressões de data/hora, consulte a especificação CEL.

Para saber como usar expressões de data/hora para configurar o acesso temporário, consulte o artigo Configurar o acesso temporário.

Exemplos de expressões de porta e IP de destino (para tunelização TCP do IAP)

Numa associação de funções, a seguinte expressão de condição permite o acesso a um endereço IP de destino interno ou a um número de porta:

destination.ip == '14.0.0.1' destination.ip != '127.0.0.1' destination.port == 22 destination.port > 21 && destination.port <= 23 

Exemplos de expressões de regras de encaminhamento

Numa associação de funções, a seguinte expressão de condição permite o acesso a um principal se o pedido não estiver a criar uma regra de encaminhamento ou se o pedido estiver a criar uma regra de encaminhamento para um equilibrador de carga Google Cloud interno:

!compute.isForwardingRuleCreationOperation() || (   compute.isForwardingRuleCreationOperation() &&   compute.matchLoadBalancingSchemes([     'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'   ]) ) 

Para ver detalhes sobre esquemas de equilíbrio de carga, consulte o artigo Usar condições de IAM em Google Cloud equilibradores de carga.

Exemplos de expressões de anfitrião ou caminho de URL (para IAP)

Numa associação de funções, a seguinte expressão de condição permite o acesso apenas para determinados subdomínios ou caminhos de URL no pedido:

request.host == 'hr.example.com' request.host.endsWith('.example.com') request.path == '/admin/payroll.js' request.path.startsWith('/admin') 

Exemplo de expressão com diferentes tipos de atributos

Numa associação de funções, a seguinte expressão de condição permite o acesso se o pedido for feito durante um período específico, correspondendo a um prefixo do nome do recurso, com o nível de acesso escolhido e para um tipo de recurso específico:

request.time > timestamp('2018-08-03T16:00:00-07:00') && request.time < timestamp('2018-08-03T16:05:00-07:00') && ((resource.name.startsWith('projects/project-123/zones/us-east1-b/instances/dev') ||  (resource.name.startsWith('projects/project-123/zones/us-east1-b/instances/prod') &&   'accessPolicies/34569256/accessLevels/CorpNet' in request.auth.access_levels)) ||  resource.type != 'compute.googleapis.com/Instance') 

O que se segue?