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
ouUPDATE
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
No console do Google Cloud, acesse a página Políticas da organização.
Selecione o Seletor de projetos na parte superior da página.
No Seletor de projetos, selecione o recurso em que você quer definir a política da organização.
Clique em
Restrição personalizada.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.
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.
).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.
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
.Em Método de aplicação, selecione se a restrição será aplicada no método REST
CREATE
ouUPDATE
.Para definir uma condição, clique em
Editar condição.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.Clique em Salvar.
Em Ação, selecione se você quer permitir ou negar o método avaliado quando a condição é atendida.
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, como123456789
.CONSTRAINT_NAME
: o nome da sua nova restrição personalizada. Uma restrição personalizada precisa começar comcustom.
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 serCREATE
ouCREATE
eUPDATE
.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 ocondition
for atendido. Pode serALLOW
ouDENY
.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_PATHSubstitua
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_IDSubstitua
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:
- No console do Google Cloud, acesse a página Políticas da organização.
- Selecione o seletor de projetos na parte superior da página.
- No seletor de projetos, selecione o projeto em que você quer definir a política da organização.
- 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.
- Para personalizar a política da organização nesse recurso, clique em Gerenciar política.
- Na página Editar política, selecione Substituir a política do editor principal.
- Clique em Adicionar uma regra.
- Em Aplicação, selecione se a aplicação dessa política da organização precisa ser ativada ou desativada.
- 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.
- 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.
- 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
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.
Defina a restrição personalizada.
gcloud org-policies set-custom-constraint enforceCMEK.yaml
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.
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 |
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.dataLocations 1 |
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.storageClass 1 |
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 |
location 1 |
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 |
storageClass 1 |
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.