Nesta página, explicamos como configurar o controle de acesso minucioso para bancos de dados do Cloud Spanner.
Para saber mais sobre o controle de acesso detalhado, consulte Sobre controles de acesso minuciosos.
A configuração de um controle de acesso minucioso envolve as seguintes etapas:
Conceder acesso aos papéis do banco de dados aos principais do Identity and Access Management (IAM).
Os usuários de controle de acesso minuciosos precisam especificar um papel de banco de dados para realizar consultas, MLD ou operações de linha no banco de dados.
Criar papéis de banco de dados e conceder privilégios
Um papel de banco de dados é um conjunto de privilégios de acesso refinados. É possível criar até 100 papéis de banco de dados para cada banco de dados.
Decida os papéis e as hierarquias de papéis no banco de dados e codifique-os em DDL. Assim como acontece com outras alterações de esquema no Spanner, recomendamos que você emita alterações em um lote em vez de separadamente. Para mais informações, consulte Limitar a frequência de atualizações de esquema.
Console
Para criar um papel de banco de dados e conceder privilégios de acesso minuciosos a ele, siga estas etapas:
Acesse a página Instâncias no Console do Google Cloud.
Selecione a instância que contém o banco de dados ao qual você quer adicionar o papel.
Selecione o banco de dados.
Na página Visão geral, clique em Gravar DDL.
Na página Gravar instruções DDL, para cada papel do banco de dados em que você quer criar e conceder privilégios, siga estas etapas:
Para criar o papel, insira a seguinte instrução:
CREATE ROLE ROLE_NAME;
Não clique em Enviar.
Para conceder privilégios ao papel, insira uma instrução
GRANT
na próxima linha após a instruçãoCREATE ROLE
.Veja detalhes sobre a sintaxe da instrução
GRANT
em Linguagem de definição de dados do GoogleSQL. Para informações sobre privilégios, consulte Privilégios de controle de acesso granulares.Por exemplo, para conceder
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
ao papel de banco de dadoshr_manager
, insira a seguinte instrução:GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;
É possível usar um modelo DDL para a instrução
GRANT
. No menu suspenso MODELOS DDL, selecione Papéis do banco de dados. Em seguida, em Conceder privilégios do papel, selecione um modelo.
Selecione Enviar.
Se houver erros na DDL, o console do Google Cloud retornará um erro.
gcloud
Para criar um papel de banco de dados e conceder privilégios de acesso minuciosos a ele,
use o comando gcloud spanner databases ddl update
com instruções CREATE ROLE
e GRANT
.
Para detalhes sobre a sintaxe das instruções CREATE ROLE
e GRANT
, consulte a
linguagem de definição de dados do GoogleSQL.
Por exemplo, use o comando a seguir para criar um papel de banco de dados e conceder privilégios a ele em uma ou mais tabelas.
gcloud spanner databases ddl update DATABASE_NAME --instance=INSTANCE_NAME \ --ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE ROLE_NAME;'
PRIVILEGES
é uma lista delimitada por vírgulas de privilégios de controle de acesso minuciosos. Para informações sobre privilégios, consulte Privilégios de controle de acesso granulares.TABLES
é uma lista de tabelas delimitada por vírgulas.
Por exemplo, para conceder SELECT
, INSERT
e UPDATE
nas tabelas employees
e contractors
ao papel de banco de dados hr_analyst
no banco de dados hrdb1
na instância hr
, insira a seguinte instrução:
gcloud spanner databases ddl update hrdb1 --instance=hr \ --ddl='CREATE ROLE hr_analyst; GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_analyst;'
Bibliotecas de cliente
Essas amostras de código criam e descartam um papel de banco de dados.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Criar uma hierarquia de papéis com herança
É possível criar uma hierarquia de papéis do banco de dados ao conceder um papel de banco de dados a outro. As funções filhas (conhecidas como funções de membro) herdam os privilégios da classe mãe.
Para conceder um papel de banco de dados a outro papel, use a instrução a seguir:
GRANT ROLE role1 TO ROLE role2;
Para mais informações, consulte Hierarquias de papéis e herança de banco de dados.
Conceder acesso aos papéis do banco de dados aos principais do IAM
Use o IAM para conceder acesso aos papéis do banco de dados.
Console
Para conceder acesso aos papéis do banco de dados para um principal do IAM, siga estas etapas:
Na página Visão geral do banco de dados, clique em MOSTRAR PAINEL DE INFORMAÇÕES se o Painel de informações ainda não estiver aberto.
Clique em ADICIONAR CONTA PRINCIPAL.
No painel Conceder acesso ao database_name, em Adicionar principais, especifique um ou mais principais do IAM.
Em Atribuir papéis, no menu Selecionar um papel, selecione Cloud Spanner > Usuário de acesso refinado do Cloud Spanner.
Você precisa conceder esse papel apenas uma vez a cada principal. Isso faz do principal um usuário de controle de acesso refinado.
Clique em ADICIONAR OUTRO PAPEL.
No menu Selecionar papel, escolha Cloud Spanner > Usuário de papel do banco de dados do Cloud Spanner.
Siga estas etapas para criar a condição do IAM que especifica os papéis a serem concedidos.
Ao lado do papel de usuário do papel de banco de dados do Cloud Spanner, clique em ADICIONAR CONDIÇÃO DO IAM.
No painel Adicionar condição, insira um título e uma descrição opcional para a condição.
Se estiver concedendo um único papel de banco de dados, você normalmente incluiria o nome do papel no título da condição. Se você está concedendo vários papéis, é possível indicar algo sobre o conjunto de papéis.
Clique em EDITOR DE CONDIÇÃO.
No campo Expressão, digite o seguinte código:
resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/ROLE")
Substitua
ROLE
pelo nome do papel.Ou, para conceder acesso ao principal a mais de um papel, adicione mais condições com o operador or (
||
), conforme mostrado no exemplo a seguir:resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))
Esse código concede dois papéis. Substitua
ROLE1
eROLE2
pelos nomes dos seus papéis. Para conceder mais de duas funções, adicione mais ou condições.É possível usar qualquer expressão de condição compatível com o IAM. Para mais informações, consulte Visão geral das condições do IAM.
Clique em Save.
De volta ao painel anterior, verifique se a condição aparece na coluna Condição do IAM ao lado do campo Papel.
Clique em Save.
De volta ao painel de informações, em Papel/principal, observe que Usuário de papel do banco de dados do Cloud Spanner aparece para cada condição definida.
O número entre parênteses ao lado da condição indica o número de principais que receberam o papel de banco de dados por essa condição. Você pode clicar na seta de expansão para ver a lista de principais.
Para corrigir erros em nomes ou condições do papel do banco de dados ou adicionar outros papéis de banco de dados para um principal, siga estas etapas:
Expanda a entrada de Usuário de papel do banco de dados do Cloud Spanner que lista a condição desejada.
Clique no ícone Editar (lápis) ao lado de uma principal.
No painel Editar acesso a nome_do_banco_de_dados, siga um destes procedimentos:
Clique em ADICIONAR OUTRO PAPEL.
Para editar a condição, clique no ícone Editar (lápis) ao lado do nome dela. Na página Editar condição, clique em EDITOR DE CONDIÇÃO, faça as correções e clique em Salvar duas vezes.
gcloud
Para conceder acesso aos papéis do banco de dados para um principal do IAM, siga estas etapas:
Ative o controle de acesso minucioso para o principal usando o comando
gcloud spanner databases add-iam-policy-binding
da seguinte maneira:gcloud spanner databases add-iam-policy-binding DATABASE_NAME \ --instance=INSTANCE_NAME \ --role=roles/spanner.fineGrainedAccessUser \ --member=MEMBER_NAME \ --condition=None
MEMBER_NAME
é o identificador do principal. Ele precisa estar no formatouser|group|serviceAccount:email
oudomain:domain
.Esse comando torna o principal um usuário de controle de acesso refinado. Envie esse comando apenas uma vez para cada principal.
Se for bem-sucedido, o comando gerará toda a política para o banco de dados.
Conceda permissão para usar um ou mais papéis do banco de dados usando o comando
gcloud spanner databases add-iam-policy-binding
da seguinte maneira:gcloud spanner databases add-iam-policy-binding DATABASE_NAME \ --instance=INSTANCE_NAME \ --role=roles/spanner.databaseRoleUser \ --member=MEMBER_NAME \ --condition=CONDITION
MEMBER_NAME
é o identificador do principal. Ele precisa estar no formatouser|group|serviceAccount:email
oudomain:domain
.CONDITION
é uma expressão de condição do IAM que especifica os papéis a serem concedidos ao principal.CONDITION
tem o seguinte formato:--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/ROLE1")),title=TITLE,description=DESCRIPTION'
Ou, para conceder acesso ao principal a mais de um papel, adicione mais condições com o operador or (
||
), conforme mostrado no exemplo a seguir:--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))),title=TITLE,description=DESCRIPTION'
Esse código concede dois papéis. Substitua
ROLE1
eROLE2
pelos nomes dos seus papéis. Para conceder mais de dois papéis, adicione mais ou condições com o operador||
.É possível usar qualquer expressão de condição compatível com o IAM. Para mais informações, consulte Visão geral das condições do IAM.
Se for bem-sucedido, o comando gerará toda a política para o banco de dados.
O exemplo a seguir concede os papéis de banco de dados
hr_rep
ehr_manager
ao principaljsmith@example.com
.gcloud spanner databases add-iam-policy-binding myDatabase \ --instance=myInstance \ --role=roles/spanner.databaseRoleUser \ --member=user:jsmith@example.com \ --condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/hr_rep") || resource.name.endsWith("/hr_manager"))),title=HR roles,description=Grant permissions on HR roles'
Bibliotecas de cliente
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Fazer a transição de um principal para um controle de acesso refinado
Para fazer a transição de um principal do IAM do controle de acesso no nível do banco de dados para um controle de acesso refinado, siga estas etapas:
Ative o controle de acesso minucioso para o principal e conceda acesso a todos os papéis de banco de dados necessários, conforme descrito em Conceder acesso aos papéis de banco de dados para os principais do IAM.
Atualize todos os aplicativos executados como principal. Especifique os papéis apropriados do banco de dados nas chamadas para os métodos da biblioteca de cliente.
Revogar todos os papéis no nível do banco de dados do IAM do principal. Dessa forma, o acesso ao principal é regido por apenas um método.
Para revogar os papéis no nível do banco de dados do IAM, siga as instruções em Remover permissões no nível do banco de dados.
Listar papéis de banco de dados
É possível listar os papéis associados a um banco de dados.
Console
Para listar papéis do banco de dados, digite a seguinte consulta na página Consulta:
SELECT * FROM INFORMATION_SCHEMA.ROLES;
A resposta inclui o papel atual e os papéis com privilégios que o papel atual pode usar por meio da herança. Para buscar todos os papéis, use o comando gcloud.
gcloud
Para ver uma lista não filtrada de papéis de banco de dados, insira o comando a seguir.
Requer a permissão spanner.databaseRoles.list
.
gcloud spanner databases roles list --database=DATABASE_NAME --instance=INSTANCE_NAME
Bibliotecas de cliente
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Ver os privilégios concedidos a um papel de banco de dados
Para ver os privilégios concedidos a um papel, execute estas consultas:
SELECT * FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE grantee = 'ROLE_NAME'; SELECT * FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE grantee = 'ROLE_NAME'; SELECT * FROM INFORMATION_SCHEMA.CHANGE_STREAM_PRIVILEGES WHERE grantee = 'ROLE_NAME';
INFORMATION_SCHEMA.TABLE_PRIVILEGES
retorna privilégios nas tabelas e visualizações.
Os privilégios SELECT
, INSERT
e UPDATE
em TABLE_PRIVILEGES
também são
mostrados em COLUMN_PRIVILEGES
.
Ver usuários de controle de acesso minuciosos
Para ver uma lista dos principais que são usuários do controle de acesso minucioso, execute o seguinte
comando. Para executar o comando, é necessário ter a API Cloud Asset ativada no
projeto e ter a permissão do
IAM cloudasset.assets.searchAllIamPolicies
.
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles=roles/spanner.fineGrainedAccessUser AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' \ --flatten=policy.bindings[].members[] \ --format='table(policy.bindings.members)'
A resposta será semelhante a:
MEMBERS user:222larabrown@gmail.com user:baklavainthebalkans@gmail.com serviceAccount:cs-fgac-sa-1@cloud-spanner-demo.google.com.iam.gserviceaccount.com serviceAccount:cs-fgac-sa-2@cloud-spanner-demo.google.com.iam.gserviceaccount.com
Para mais informações, consulte Como ativar uma API no seu projeto do Google Cloud.
Ver principais do IAM com acesso a um papel de banco de dados
Para ver uma lista dos principais que receberam acesso a um papel
específico do banco de dados, execute o comando a seguir. Para executar o comando, é necessário ter a
API Cloud Asset ativada no projeto e ter a permissão
do IAM cloudasset.assets.searchAllIamPolicies
.
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles=roles/spanner.databaseRoleUser AND policy:"resource.name" AND policy:/ROLE_NAME AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' \ --flatten=policy.bindings[].members[] \ --format='table(policy.bindings.members)'
A resposta será semelhante a:
MEMBERS 222larabrown@gmail.com
Ver as condições de IAM de um principal
Para ver uma lista de condições do IAM que foram especificadas ao conceder o papel Usuário de papel do banco de dados do Cloud Spanner a um principal, execute o seguinte comando:
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles=roles/spanner.databaseRoleUser AND policy:resource.name AND policy:"PRINCIPAL_IDENTIFIER" AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' \ --flatten=policy.bindings[] \ --format='table(policy.bindings.condition.expression)'
em que PRINCIPAL_IDENTIFIER é:
{ user:user-account-name | serviceAccount:service-account-name }
Exemplos de PRINCIPAL_IDENTIFIER:
user:222larabrown@gmail.com serviceAccount:cs-fgac-sa-1@cloud-spanner-demo.google.com.iam.gserviceaccount.com
O exemplo de saída a seguir mostra duas expressões de condição.
EXPRESSION resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/hr_analyst") resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/hr_manager")
Verificar as políticas do IAM em relação às condições do papel do banco de dados ausentes
Depois de conceder acesso aos papéis do banco de dados para os principais, recomendamos garantir que cada vinculação do IAM tenha uma condição especificada.
Para fazer essa verificação, execute o seguinte comando:
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles:roles/spanner.databaseRoleUser AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' --flatten=policy.bindings[].members[]
O resultado será assim:
ROLE MEMBERS EXPRESSION roles/spanner.databaseRoleUser serviceAccount:cs-fgac-sa-1@... roles/spanner.databaseRoleUser serviceAccount:cs-fgac-sa-2@... resource.type == "spanner…"
O primeiro resultado não tem uma condição. Portanto, os principais nessa vinculação têm acesso a todos os papéis do banco de dados.
Remover um papel do banco de dados
Excluir um papel de banco de dados revoga automaticamente a associação de outros papéis e revoga a associação em outros papéis.
Para descartar um papel de banco de dados, faça o seguinte:
- Revogue todos os privilégios do controle de acesso refinado do papel.
- Remova todas as vinculações de política do IAM que façam referência a esse papel para que um papel do banco de dados criado posteriormente com o mesmo nome não herde essas vinculações.
Console
Para descartar um papel de banco de dados, siga estas etapas:
Na página Visão geral do banco de dados, clique em Gravar DDL.
Para revogar os privilégios do papel, insira uma instrução
REVOKE
.Veja detalhes sobre a sintaxe da instrução
REVOKE
em Linguagem de definição de dados do GoogleSQL. Para informações sobre privilégios, consulte Privilégios de controle de acesso granulares.Por exemplo, para revogar
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
do papel de banco de dadoshr_manager
, insira a seguinte instrução:REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM ROLE hr_manager;
É possível usar um modelo DDL para a instrução
REVOKE
. No menu suspenso MODELOS DDL, selecione Papéis do banco de dados. Em seguida, em Revogar privilégios do papel, selecione um modelo.Exclua qualquer condição do IAM associada ao papel.
Na lista de papéis no painel de informações, localize o papel de Usuário do papel de banco de dados do Cloud Spanner que tem o título da condição de interesse adjacente a ele e expanda o papel para ver os principais que têm acesso a ele.
Em uma das principais, clique no ícone Editar principal (lápis).
Na página Editar acesso, clique no ícone Excluir papel (lixeira) ao lado do papel de usuário do papel de banco de dados do Cloud Spanner.
Clique em Save.
Repita as três etapas anteriores para outros principais listados na condição.
Para descartar o papel, acesse a página Gravar DDL e insira a seguinte declaração:
DROP ROLE ROLE_NAME;
Selecione Enviar.
gcloud
Para revogar todos os privilégios de um papel e depois descartá-lo, use o comando
gcloud spanner databases ddl update
da seguinte maneira:gcloud spanner databases ddl update DATABASE_NAME \ --instance=INSTANCE_NAME \ --ddl='REVOKE PERMISSIONS ON TABLE TABLE_NAME FROM ROLE ROLE_NAME; DROP ROLE ROLE_NAME;'
Os valores válidos para
PERMISSIONS
sãoSELECT
,INSERT
,UPDATE
eDELETE
.Para excluir condições do IAM relacionadas, use o comando
gcloud spanner databases remove-iam-policy-binding
da seguinte maneira:gcloud spanner databases remove-iam-policy-binding DATABASE_NAME \ --instance=INSTANCE_NAME \ --role=ROLE_NAME \ --member=MEMBER_NAME \ --condition=CONDITION
MEMBER_NAME
é o identificador do principal. Ele precisa estar no formatouser|group|serviceAccount:email
oudomain:domain
.CONDITION
é uma expressão de condição do IAM que especifica os papéis a serem concedidos ao principal.CONDITION
tem o seguinte formato:--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))),title=TITLE,description=DESCRIPTION'
Toda a especificação de condição precisa corresponder exatamente à especificação de condição que foi usada no comando que concedeu a permissão, incluindo o título e a descrição.
Bibliotecas de cliente
Essas amostras de código criam e descartam um papel de banco de dados.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Mais informações
- Sobre controles de acesso minuciosos
- Controle de acesso refinado para fluxos de alterações
- Privilégios de controle de acesso minuciosos
- Referência DDL do GoogleSQL
- Fazer atualizações de esquema