Gerenciar recursos do Cloud Storage usando restrições personalizadas

A política da organização fornece restrições predefinidas para o Cloud Storage. 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 restrições personalizadas e use-as em uma política da organização.

Nesta página, descrevemos como definir restrições personalizadas para aplicar políticas a recursos do Cloud Storage.

Para testar uma nova restrição antes de ser aplicada no seu ambiente de produção, use o Simulador de políticas.

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 em uma organização, o Google Cloud aplicará a política em todos os projetos dessa organização. Para saber mais sobre esse comportamento e como alterá-lo, consulte Regras de avaliação de hierarquia.

Preços

O Serviço de políticas da organização, incluindo restrições predefinidas e personalizadas, é oferecido sem custos financeiros.

Limitações

  • As restrições personalizadas para recursos do Cloud Storage só podem ser configuradas usando o console do Google Cloud ou a CLI do Google Cloud.

  • As restrições personalizadas só podem ser aplicadas nos métodos CREATE ou UPDATE dos recursos do Cloud Storage.

  • As restrições personalizadas recém-aplicadas não se aplicam automaticamente aos recursos atuais. Os recursos atuais precisam ser atualizados para que a restrição seja aplicada.

    Para encontrar recursos que precisarão ser atualizados, aplique uma política da organização de simulação.

  • As restrições personalizadas não podem ser usadas para restringir ACLs ou políticas do IAM em objetos ou buckets.

Recursos compatíveis com o Cloud Storage

Para o Cloud Storage, é possível definir restrições personalizadas no seguinte recurso:

  • Buckets: storage.googleapis.com/Bucket

Funções exigidas

Para informações sobre os papéis necessários para gerenciar políticas da organização com restrições personalizadas, consulte Papéis obrigatórios.

Além de gerenciar as políticas da organização, teste as restrições personalizadas criadas por você. Para testar restrições personalizadas, é recomendável usar o papel predefinido ou personalizado menos permissivo que contenha as permissões necessárias para testar a restrição específica. Consulte os papéis e permissões do Cloud Storage para saber quais são as permissões necessárias.

Configurar uma restrição personalizada

Console

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

    Acessar as políticas da organização

  2. Selecione o Seletor de projetos na parte superior da página.

  3. No Seletor de projetos, selecione o recurso em que você quer definir a política da organização.

  4. Clique em Restrição personalizada.

  5. No campo Nome de exibição, insira um nome legível para a restrição. Esse campo tem um comprimento máximo de 200 caracteres. Não use PII ou dados confidenciais em nomes de restrições, porque eles podem ser expostos em mensagens de erro.

  6. Na caixa ID da restrição, insira o nome que você quer para a 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.enforceBucketVersioning. O tamanho máximo desse campo é de 70 caracteres, sem contar o prefixo (por exemplo, organizations/123456789/customConstraints/custom.).

  7. No campo Descrição, insira uma descrição legível a ser exibida como uma mensagem de erro quando a política for violada. Esse campo tem um comprimento máximo de 2000 caracteres.

  8. No campo Tipo de recurso, selecione o nome do recurso REST do Google Cloud que contém o objeto e o campo que você quer restringir. Por exemplo, storage.googleapis.com/Bucket.

  9. Em Método de aplicação, selecione se a restrição será aplicada no método REST CREATE ou UPDATE.

  10. Para definir uma condição, clique em Editar condição.

    1. No painel Adicionar condição, crie uma condição de CEL que se refira a um recurso de serviço compatível, por exemplo, resource.versioning.enabled == true. Esse campo tem um comprimento máximo de 1000 caracteres.

    2. Clique em Salvar.

  11. Em Ação, selecione se você quer permitir ou negar o método avaliado quando a condição é atendida.

  12. Clique em Criar restrição.

Quando você insere um valor em cada campo, a configuração YAML equivalente para essa restrição personalizada é exibida à direita.

gcloud

Para criar uma restrição personalizada usando a Google Cloud CLI, crie um arquivo YAML para essa restrição:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- RESOURCE_NAME
methodTypes:
- METHOD1
- METHOD2
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.enforceBucketVersioning. O tamanho máximo desse campo é de 70 caracteres, sem contar o prefixo (por exemplo, organizations/123456789/customConstraints/custom.).

  • 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, storage.googleapis.com/Bucket.

  • METHOD1,METHOD2: uma lista de métodos "RESTful" para aplicar a restrição. Pode ser CREATE ou CREATE e UPDATE.

  • CONDITION: uma condição CEL que se refere a um recurso de serviço compatível, por exemplo, "resource.versioning.enabled == true". Esse campo tem um comprimento máximo de 1.000 caracteres. Para detalhes sobre o uso da CEL, consulte Common Expression Language.

  • 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. Esse campo tem um comprimento máximo de 2000 caracteres.

Depois de criar uma nova restrição personalizada usando a Google Cloud CLI, configure-a 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 sua restrição personalizada. Por exemplo, /home/user/customconstraint.yaml. Após a conclusão, as restrições personalizadas vão estar 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. Para mais informações, consulte Como visualizar as políticas da organização.

Se a solicitação for bem-sucedida, a saída será semelhante a esta:

CUSTOM_CONSTRAINT             ACTION_TYPE  METHOD_TYPES   RESOURCE_TYPES                     DISPLAY_NAME
custom.uniformBucketLevelAccess  DENY         CREATE,UPDATE  storage.googleapis.com/Bucket  Enable object versioning

Para mais informações sobre como configurar e gerenciar restrições personalizadas, consulte Criar e gerenciar restrições personalizadas.

Aplicar uma restrição

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

Console

Para aplicar uma restrição booleana:

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

    Acessar as políticas da organização

  2. Selecione o seletor de projetos na parte superior da página.
  3. No seletor de projetos, selecione o projeto 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 nesse recurso, clique em Gerenciar política.
  6. Na página Editar política, selecione Substituir a política do editor principal.
  7. Clique em Adicionar uma regra.
  8. Em Aplicação, selecione se a aplicação dessa política da organização precisa ser ativada ou desativada.
  9. 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. Caso contrário, não será possível salvar a política. Para mais detalhes, consulte Como definir uma política da organização com tags.
  10. Se essa for uma restrição personalizada, clique em Testar alterações para simular o efeito da política da organização. Para mais informações, consulte Testar alterações na política da organização com o Simulador de política.
  11. 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 que aplica uma restrição booleana, crie um arquivo YAML da política com 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.uniformBucketLevelAccess.

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

As solicitações negadas por violar uma restrição personalizada falham com um erro 412: CUSTOM_ORGPOLICY_CONSTRAINT_FAILED.

Exemplo: crie uma restrição que aplique chaves de criptografia gerenciadas pelo cliente em buckets

gcloud

  1. Crie um arquivo de restrição enforceCMEK.yaml com as seguintes informações:

    name: organizations/ORGANIZATION_ID/customConstraints/custom.customerManagedEncryptionKeys
    resource_types: storage.googleapis.com/Bucket
    method_types:
    – CREATE
    – UPDATE
    condition: "has(resource.encryption.defaultKmsKeyName)"
    action_type: ALLOW
    display_name: Enforce Cloud KMS key
    description: When this constraint is enforced, newly created buckets and newly updated buckets must be encrypted with a
    Cloud KMS key. The Cloud KMS key on existing buckets can be updated but not deleted.
  2. Defina a restrição personalizada.

    gcloud org-policies set-custom-constraint enforceCMEK.yaml
    
  3. Crie um arquivo de política enforceCMEK-policy.yaml com a seguinte informação.

    name: projects/PROJECT_ID/policies/custom.customerManagedEncryptionKeys
    spec:
      rules:
      – enforce: true
    

    Substitua PROJECT_ID pela ID do seu projeto.

    Neste exemplo, aplicamos essa restrição a envolvidos no projeto, mas também é possível defini-la no nível da organização ou da pasta.

  4. Aplique a política.

    gcloud org-policies set-policy enforceCMEK-policy.yaml
    

Exemplos de restrições personalizadas para casos de uso comuns

As seções a seguir fornecem a sintaxe de algumas restrições personalizadas que podem ser úteis para você:

Caso de uso Sintaxe
As políticas de retenção de buckets precisam ter um período que esteja dentro do durações especificadas
      name: organizations/ORGANIZATION_ID/customConstraints/custom.retentionPolicy
      method_types:
      – CREATE
      – UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.retentionPolicy.retentionPeriod not in [3600, 2678400]"
      action_type: DENY
      display_name: Bucket retention policy is either 3,600 seconds or 2,678,400 seconds
      description: Newly created buckets and newly updated buckets must have a
      retention policy that's either 3,600 seconds or 2,678,400 seconds.
Os buckets precisam ter o controle de versões de objetos ativado
      name: organizations/ORGANIZATION_ID/customConstraints/custom.enforceBucketVersioning
      method_types:
      – CREATE
      – UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.versioning.enabled == true"
      action_type: ALLOW
      display_name: Buckets must have Object Versioning enabled
      description: Newly created buckets and newly updated buckets must have Object Versioning enabled.
Os buckets precisam ser nomeados usando uma expressão regular específica
      name: organizations/ORGANIZATION_ID/customConstraints/custom.bucketName
      method_types:
      – CREATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.name.matches('^[a-zA-Z]+$')"
      action_type: ALLOW
      display_name: Bucket names must match the specified regular expression
      description: Newly created buckets must have a name that matches the
      specified regular expression. Only letters are allowed in the bucket name.
Buckets não podem estar com o bloqueio de bucket ativado
      name: organizations/ORGANIZATION_ID/customConstraints/custom.prohibitBucketLock
      method_types:
      – CREATE
      – UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.retentionPolicy.isLocked == true"
      action_type: DENY
      display_name: Prohibit the use of Bucket Lock
      description: Newly created buckets and newly updated buckets cannot have
      Bucket Lock enabled.
Buckets não podem ter o bloqueio de retenção de objetos ativado
      name: organizations/ORGANIZATION_ID/customConstraints/custom.prohibitObjectRetentionLock
      method_types:
      – CREATE
      – UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.objectRetention.mode == 'Enabled'"
      action_type: DENY
      display_name: Objects cannot have retention configurations
      description: Newly created buckets and newly updated buckets cannot have
      Object Retention Lock enabled.
Buckets localizados nas multirregiões US ou EU precisa ter um período de armazenamento de 86.400 segundos
      name: organizations/ORGANIZATION_ID/customConstraints/custom.locationRetentionPolicy
      method_types:
      – CREATE
      – UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "(resource.location.startsWith('US') || resource.location.startsWith('EU')) && resource.retentionPolicy.retentionPeriod != 86400"
      action_type: DENY
      display_name: All buckets in US and EU must have a retention policy of 86,400 seconds
      description: Newly created buckets and newly updated buckets located in
      US and EU regions must have a retention policy of 86,400 seconds.
Buckets precisam ter rótulos1
      name: organizations/ORGANIZATION_ID/customConstraints/custom.labels
      method_types:
      – CREATE
      – UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "'my_annotations.data.source' in resource.labels && resource.labels['my_annotations.data.source'] in ['SOURCE_IMAGES','SOURCE_TEXT','SOURCE_VIDEOS']"
      action_type: ALLOW
      display_name: Buckets must have a label classifying the contents of the bucket
      description: Newly created buckets and newly updated buckets must have the
      label my_annotations.data.source with the SOURCE_IMAGES, SOURCE_TEXT, or
      SOURCE_VIDEOS key.
Os buckets precisam estar localizados em um local birregional.
      name: organizations/ORGANIZATION_ID/customConstraints/custom.dualRegionUS
      method_types:
      – CREATE
      – UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "'US-EAST1' in resource.customPlacementConfig.dataLocations && 'US-EAST4' in resource.customPlacementConfig.dataLocations"
      action_type: ALLOW
      display_name: Buckets must be located in a dual-region
      description: Newly created buckets and newly updated buckets must be located in a dual-region
      composed of the us-east1 and us-east4 regions.
Buckets não podem usar classes de armazenamento legadas
      name: organizations/ORGANIZATION_ID/customConstraints/custom.disableLegacyStorageClass
      method_types:
      – CREATE
      – UPDATE
      resource_types: storage.googleapis.com/Bucket
      condition: "resource.storageClass in ['STANDARD', 'NEARLINE', 'COLDLINE', 'ARCHIVE']"
      action_type: ALLOW
      display_name: Buckets cannot use legacy storage classes
      description: Newly created buckets and newly updated buckets must use
      Standard storage, Nearline storage, Coldline storage, or Archive storage.

1 Especificar uma chave de rótulo do bucket que não existe retorna um erro BAD_CONDITION. Esse erro impede que os métodos CREATE e UPDATE sejam executados no bucket. Para evitar esse erro, sempre verifique se a chave do rótulo existe primeiro usando "my_annotations.data.source" in resource.labels.

Campos de expressão para condições

A tabela a seguir contém os campos de expressão que podem ser usados para criar condições. As condições são escritas no Common Expression Language (CEL). O valor desses campos de expressão diferenciam maiúsculas de minúsculas.

Para descrições dos campos de expressão a seguir e quais valores é possível especificar, consulte a representação do recurso buckets para a API JSON.

Campo de expressão Tipo de valor
billing message
billing.requesterPays bool
cors message
cors.maxAgeSeconds int
cors.method list
cors.origin list
cors.responseHeader list
customPlacementConfig message
customPlacementConfig.dataLocations1 list
defaultEventBasedHold bool
encryption message
encryption.defaultKmsKeyName string
iamConfiguration message
iamConfiguration.publicAccessPrevention string
iamConfiguration.uniformBucketLevelAccess message
iamConfiguration.uniformBucketLevelAccess.enabled bool
labels map
lifecycle message
lifecycle.rule list
lifecycle.rule.action message
lifecycle.rule.action.storageClass1 string
lifecycle.rule.action.type string
lifecycle.rule.condition message
lifecycle.rule.condition.age int
lifecycle.rule.condition.createdBefore string
lifecycle.rule.condition.customTimeBefore string
lifecycle.rule.condition.daysSinceCustomTime int
lifecycle.rule.condition.daysSinceNoncurrentTime int
lifecycle.rule.condition.isLive bool
lifecycle.rule.condition.matchesPrefix list
lifecycle.rule.condition.matchesStorageClass list
lifecycle.rule.condition.matchesSuffix list
lifecycle.rule.condition.noncurrentTimeBefore string
lifecycle.rule.condition.numNewerVersions int
location1 string
locationType string
logging message
logging.logBucket string
logging.logObjectPrefix string
objectRetention object
objectRetention.mode string
name string
projectNumber string
retentionPolicy message
retentionPolicy.isLocked bool
retentionPolicy.retentionPeriod int
rpo string
storageClass1 string
versioning message
versioning.enabled bool
website message
website.mainPageSuffix string
website.notFoundPage string

1 O valor desse campo precisa ser escrito em letras maiúsculas.

Considerações

Os rótulos de bucket não são recomendados para uso em condições de restrição personalizadas. Em vez disso, use tags, que só podem ser definidas por indivíduos com os papéis do IAM necessários e são mais rigorosamente controladas do que os rótulos.