O Identity and Access Management (IAM) permite fornecer acesso granular a recursos específicos do Cloud de Confiance by S3NS e, ao mesmo tempo, impedir o acesso indesejado a outros recursos. Ao aplicar o princípio de privilégio mínimo, você concede apenas as permissões necessárias para as cargas de trabalho.
O IAM controla quem (usuários) tem qual acesso (papéis) a quais recursos por meio de políticas de permissão, que vinculam papéis específicos aos usuários. Para gerenciar o acesso em toda a hierarquia de recursos, configure papéis do IAM no nível da organização e permita políticas usando a API Cloud Resource Manager. Também é possível definir políticas de negação para impedir que os principais usem permissões específicas. Para mais informações, consulte Gerenciar o acesso a projetos, pastas e organizações.
Permissões e papéis
Para controlar o acesso aos recursos,o Cloud de Confiance by S3NS exige que as contas que fazem solicitações de API tenham os papéis do IAM apropriados. Os papéis do IAM
incluem permissões que permitem aos usuários realizar ações específicas em
recursos doCloud de Confiance . Por exemplo, a permissão resourcemanager.organizations.get permite que um usuário receba detalhes sobre o recurso da organização.
Não é possível conceder permissões diretamente aos usuários. É preciso conceder papéis aos usuários que têm uma ou mais permissões integradas a eles.
É possível conceder um ou mais papéis no mesmo recurso.
Usar papéis predefinidos
A tabela a seguir lista os papéis que podem ser concedidos para acessar as propriedades de um recurso da organização, a descrição do papel e as permissões incluídas nele.
| Papel | Permissões |
|---|---|
Administrador da organização( Acesso para gerenciar as políticas do IAM e ver as políticas da organização, pastas e projetos. Recursos de nível mais baixo em que você pode conceder esse papel:
|
|
Leitor da organização( Concede acesso para visualizar uma organização. Recursos de nível mais baixo em que você pode conceder esse papel:
|
|
Administrador da política da organização( Concede acesso para definir quais restrições uma organização quer aplicar à configuração de recursos do Cloud com a definição de políticas da organização. Recursos de nível mais baixo em que você pode conceder esse papel:
|
|
Navegador( Acesso de leitura para navegar na hierarquia de um projeto, incluindo a pasta, a organização e a política de permissão. Este papel não inclui permissão para ver recursos no projeto. Recursos de nível mais baixo em que você pode conceder esse papel:
|
|
Como criar papéis personalizados
Além dos papéis predefinidos descritos neste tópico, também é possível criar papéis personalizados, que são coleções de permissões que você adapta às suas necessidades. Ao criar um papel personalizado para uso com o Resource Manager, esteja ciente dos seguintes pontos:- as permissões list e get, como
resourcemanager.projects.get/list, devem sempre ser concedidas como um par; - Quando o papel personalizado inclui as permissões
folders.listefolders.get, ele também precisa incluirprojects.listeprojects.get. - A permissão
setIamPolicypara recursos de organização, pasta e projeto permite que o usuário conceda todas as outras permissões. Por isso, ela precisa ser atribuída com cuidado.
Ver o acesso atual a um recurso da organização
Para ver quais papéis um usuário recebeu para um recurso da organização,
consiga a política de permissão desse recurso. É possível ver a política de permissão de um
recurso da organização usando o console do Cloud de Confiance , a Google Cloud CLI
ou o método
getIamPolicy().
Console
Para ver os papéis concedidos no nível do recurso da organização usando o console do Cloud de Confiance :
Acesse a página Gerenciar recursos no console do Cloud de Confiance :
No menu suspenso Organização, selecione o recurso da sua organização.
Marque a caixa de seleção do recurso da organização.
No Painel de informações, em Permissões, clique em Expandir um papel e exiba todos os membros que têm esse papel.
gcloud
Consiga a política de permissão para o recurso da organização usando o comando get-iam-policy:
gcloud organizations get-iam-policy \
ORGANIZATION_ID --format json > \
FILENAME.JSON
O comando gera a resposta ao comando de permissão, que é semelhante ao seguinte:
bindings:
- members:
- user:testuser1@gcp-test.com
role: roles/editor
- members:
- user:admin@gcp-test.com
role:roles/resourcemanager.organizationAdmin
- members:
- user:testuser2@gcp-test.com
role: roles/resourcemanager.projectCreator
etag": "BwU1aRxWk30="
API
O snippet de código a seguir retorna a política de permissão para o recurso da organização
https://cloudresourcemanager.googleapis.com/v3/organizations/12345.
Solicitação:
POST
https://cloudresourcemanager.googleapis.com/v3/organizations/12345:getIamPolicy
Resposta:
{
"bindings": [
{
"role": "roles/resourcemanager.organizationAdmin",
"members": [
"user:email1@gmail.com"
]
},
{
"role": "roles/resourcemanager.projectCreator",
"members": [
"user:email2@gmail.com",
"user:email3@gmail.com",
"serviceAccount:my-other-app@appspot.s3ns-system.iam.gserviceaccount.com"
]
}
]
"etag": "BwUjHYKHHiQ="
}
Python
O método
getIamPolicy()
permite receber uma política de permissão que foi definida anteriormente.
crm = discovery.build(
'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)
Conceder acesso a um recurso da organização
Os administradores da organização podem conceder papéis do IAM aos membros da equipe
para que eles possam acessar os recursos e as APIs de uma organização. É possível conceder
papéis a um e-mail de conta de usuário, um Grupo do Google, uma conta de serviço ou um domínio do
G Suite. É possível usar o console do Cloud de Confiance , a CLI gcloud ou o método setIamPolicy() para conceder papéis.
Console
Para definir o controle de acesso no nível do recurso da organização usando o console do Cloud de Confiance :
Acesse a página Gerenciar recursos no console do Cloud de Confiance :
No menu suspenso Organização, selecione o recurso da sua organização.
Marque a caixa de seleção do recurso da organização. Se você não tiver um recurso de pasta, o recurso de organização não ficará visível. Para continuar, veja as instruções para conceder papéis na página do IAM.
Se o Painel de informações à direita estiver oculto, clique em Mostrar painel de informações no canto superior direito.
No Painel de informações, na guia Permissões, clique em Adicionar membro.
No campo Novos membros, digite os membros da equipe que você quer adicionar. É possível especificar um e-mail de conta de usuário, um Grupo do Google, uma conta de serviço ou um domínio do G Suite.
No menu suspenso Selecionar um papel, escolha o papel que você quer conceder aos membros da equipe.
Clique em Adicionar.
gcloud
Para definir a política de permissão de um recurso da organização usando o comando gcloud:
Receba a política de permissão do recurso da organização usando o comando
get-iam-policye envie a política para um arquivo JSON:gcloud organizations get-iam-policy \ ORGANIZATION_ID \ --format json > FILENAME.JSONO conteúdo do arquivo JSON é semelhante ao seguinte:
{
"bindings": [
{
"members": [
"user:testuser1@gcp-test.com"
],
"role": "roles/editor"
},
{
"members": [
"user:admin@gcp-test.com",
],
"role": "roles/resourcemanager.organizationAdmin"
},
{
"members": [
"user:testuser2@gcp-test.com"
],
"role": "roles/resourcemanager.projectCreator"
},
],
"etag": "BwU1aRxWk30="
}
- Abra o arquivo JSON em um editor de texto. Em seguida, adicione uma nova entrada à matriz
bindingspara definir um Administrador da Organização. Por exemplo, para tornaranotheradmin@gcp-test.comum Administrador da organização, altere o exemplo anterior da seguinte maneira:
{
"bindings": [
{
"members": [
"user:testuser1@gcp-test.com"
],
"role": "roles/editor"
},
{
"members": [
"user:admin@gcp-test.com",
"user:anotheradmin@gcp-test.com"
],
"role": "roles/resourcemanager.organizationAdmin"
},
{
"members": [
"user:testuser20@gcp-test.com"
],
"role": "roles/resourcemanager.projectCreator"
},
],
"etag": "BwU1aRxWk30="
}
- Atualize a política de permissão do recurso da organização executando o seguinte comando:
gcloud organizations set-iam-policy \
ORGANIZATION_ID policy.json
API
Solicitação:
POST https://cloudresourcemanager.googleapis.com/v3/organizations/12345:setIamPolicy
{
"policy": {
"version": "0",
"bindings": [
{
"role": "roles/resourcemanager.organizationAdmin",
"members": [
"user:email1@gmail.com"
]
},
{
"role": "roles/resourcemanager.projectCreator",
"members": [
"user:email2@gmail.com",
"user:email3@gmail.com",
"serviceAccount:my-other-app@appspot.s3ns-system.iam.gserviceaccount.com"
]
}
]
"etag": "BwUjHYKHHiQ="
}
}
Resposta:
{
"bindings": [
{
"role": "roles/resourcemanager.organizationAdmin",
"members": [
"user:email1@gmail.com"
]
},
{
"role": "roles/resourcemanager.projectCreator",
"members": [
"user:email2@gmail.com",
"user:email3@gmail.com",
"serviceAccount:my-other-app@appspot.s3ns-system.iam.gserviceaccount.com"
]
}
]
"etag": "BwUjHYKJUiQ="
}
O método setIamPolicy() permite conceder papéis aos usuários anexando uma
política de permissão ao recurso da organização. A política de permissão é um conjunto
de vinculações que definem
Leitura-modificação-gravação: um padrão comum para atualizar os metadados de um recurso,
como a política de permissão, envolve ler o estado atual, atualizar os dados
localmente e enviar os dados modificados para gravação. Esse padrão pode
resultar em um conflito se dois ou mais processos independentes tentarem executar a
sequência simultaneamente. Por exemplo, se dois proprietários de projeto tentarem fazer alterações conflitantes na política de permissão simultaneamente, as alterações de um deles poderão falhar. O IAM resolve esse problema usando uma propriedade etag
nas políticas de permissão. Essa propriedade verifica se a política de permissão foi alterada desde a última solicitação. Quando você faz uma solicitação
com um valor etag, o sistema compara o valor etag na solicitação com o
valor etag atual associado à política. A política de permissão só é gravada
quando esses valores de etag são correspondentes.
Ao atualizar uma política de permissão, primeiro use getIamPolicy() para acessá-la, faça as mudanças necessárias e use setIamPolicy() para gravar a política atualizada. Ao definir a política de permissão, use o valor etag somente se a política de permissão correspondente em GetPolicyResponse
contiver um valor etag.
Python
O método
setIamPolicy()
permite anexar uma política de permissão a um recurso. O método setIamPolicy
usa um SetIamPolicyRequest, que contém uma política de permissão a ser
definida e o recurso ao qual ela está anexada. Ela retorna a política de permissão resultante. Recomendamos seguir o
padrão read-modify-write
ao atualizar uma política de permissão usando setIamPolicy().
Veja um exemplo de código para definir uma política de permissão para um recurso da organização:
crm = discovery.build(
'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
resource=flags.organizationId, body={}).execute()
admin_binding = next(
(binding
for binding in policy['bindings']
if binding['role'] == 'roles/resourcemanager.organizationAdmin'),
None)
# Add an empty Organization Administrator binding if not present.
if not admin_binding:
admin_binding = {
'role': 'roles/resourcemanager.organizationAdmin',
'members': []
}
policy['bindings'].append(admin_binding)
# Add the new Admin (if necessary).
new_admin = 'user:' + flags.adminEmail
if new_admin not in admin_binding['members']:
admin_binding['members'].append(new_admin)
policy = crm.organizations().setIamPolicy(
resource=flags.organizationId,
body={
'resource': flags.organizationId,
'policy': policy
}).execute()
print json.dumps(policy, indent=2)
Restringir a visibilidade do projeto para os usuários
Os usuários podem ver todos os projetos a que têm acesso no console do Cloud de Confiance e em consultas de pesquisa, independentemente de estarem ou não no recurso de organização selecionado pelo usuário. É possível usar o serviço de políticas da organização para restringir o conjunto de projetos retornados em consultas e no console do Cloud de Confiance . Isso permite que você restrinja os usuários para que vejam apenas os projetos no seu domínio.
A restrição da política da organização
constraints/resourcemanager.accessBoundaries é uma
restrição de lista
aplicada ao recurso da organização. A restrição aceita uma lista de IDs de recursos da organização, que definem o conjunto de recursos da organização que tornam os recursos visíveis para os usuários em uma consulta ou no console do Cloud de Confiance .
Os projetos vão aparecer em No organization se o usuário não tiver a
permissão resourcemanager.organizations.get no recurso da organização pai
do projeto. Isso pode fazer com que um projeto que não faz parte
do recurso da organização pareça não estar associado a nenhum recurso da organização.
Se você usar a restrição resourcemanager.accessBoundaries para proibir um
recurso da organização, os projetos que pertencem a esse recurso não
vão aparecer em consultas ou no console do Cloud de Confiance . Os projetos que ainda não foram migrados para um recurso de organização não ficam visíveis se você aplicar essa restrição.
Recomendamos migrar os projetos que estão em No organization para o recurso da organização antes de aplicar essa restrição. Para informações sobre como mover projetos para um recurso de organização, consulte Como mover um projeto.
Para saber como definir uma política da organização, consulte Como usar restrições.
Conceder acesso condicional
Alguns papéis do IAM, como Administrador de políticas da organização
(roles/orgpolicy.policyAdmin), só podem ser concedidos em um recurso da organização.
Devido à herança de políticas, todos os recursos na organização normalmente herdam esse papel.
Para ter mais controle sobre os recursos em que o papel é concedido, use as
Condições do IAM. O uso de tags com
condições permite conceder acesso aos recursos somente se eles tiverem a
tag especificada. Por exemplo, a política de permissão a seguir concede o papel de Administrador da Política da Organização apenas em recursos que têm a tag environment: dev e não o concede em nenhum outro recurso:
{
"bindings": [
{
"members": [
"{dynamic print variables.examples.principal_group_api}"
],
"role": "roles/orgpolicy.policyAdmin",
"condition": {
"title": "Dev_environment_only",
"description": "Only granted in the development environment",
"expression":
"resource.matchTag('123456789012/env', 'dev')"
}
}
],
"etag": "BwWKmjvelug=",
"version": 3
}
Como testar permissões
É possível testar as permissões do IAM em um usuário para um recurso da organização com o método testIamPermissions(). Esse método usa o URL do recurso e o conjunto de permissões a serem testadas. Ele retorna o subconjunto dessas permissões que
o usuário pode acessar.
Normalmente, não é necessário invocar testIamPermissions() se você estiver usando o
console doCloud de Confiance diretamente para gerenciar permissões. testIamPermissions() é
destinado à integração com seu software proprietário, como uma interface gráfica do usuário
personalizada. Por exemplo, o console do Cloud de Confiance usa
testIamPermissions() internamente para determinar qual UI está disponível para
o usuário conectado.
API
Você pode usar o método testIamPermissions() para verificar qual das permissões ao autor tem para o recurso fornecido. Esse método usa um nome de recurso e um conjunto de permissões como parâmetros. Em seguida, retorna o conjunto de permissões concedidas para o solicitante.
Veja um exemplo de código para testar as permissões de um recurso da organização:
Request:
POST https://cloudresourcemanager.googleapis.com/v3/organizations/12345:testIamPermissions
{
"permissions": [
"resourcemanager.organizations.get",
"resourcemanager.organizations.setIamPolicy"
]
}
Response:
{
"permissions": [
"resourcemanager.organizations.get"
]
}
Python
crm = discovery.build(
'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
response = crm.organizations().testIamPermissions(
resource=flags.organizationId,
body={
'resource': flags.organizationId,
'permissions': [
'resourcemanager.organizations.setIamPolicy',
'resourcemanager.projects.patch'
]
}).execute()
print json.dumps(response, indent=2)