Nesta página, explicamos como configurar o controle de acesso detalhado para os bancos de dados do Spanner.
Consulte Sobre o controle de acesso detalhado para saber mais.
A configuração do controle de acesso detalhado envolve as seguintes etapas:
Conceder acesso a papéis de banco de dados aos principais do Identity and Access Management (IAM).
Informe os usuários e desenvolvedores para começar a usar os papéis do banco de dados.
Os usuários de controle de acesso refinado precisam, então, especificar um papel de banco de dados para executar consultas, DML ou operações de linha no banco de dados.
Antes de começar
Garanta que cada principal que seja um usuário de controle de acesso detalhado receba o papel Cloud Spanner Viewer
do IAM (roles/spanner.viewer
). Esse papel é recomendado no nível do projeto para usuários que precisam interagir com os recursos do Spanner no console do Google Cloud.
Para instruções, consulte Conceder permissões aos principais.
Criar funções 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 para cada banco de dados.
Decida papéis e hierarquias de papéis no banco de dados e codifique-os em DDL. Assim como acontece com outras alterações de esquema no Spanner, é altamente recomendável emitir as alterações de esquema em lote, e não 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 refinados 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 Spanner Studio.
Na página do Spanner Studio, para cada papel de banco de dados 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 ainda.
Para conceder privilégios ao papel, insira uma instrução
GRANT
na próxima linha após a instruçãoCREATE ROLE
.Veja detalhes de sintaxe para a instrução
GRANT
em Linguagem de definição de dados do GoogleSQL. Saiba mais sobre privilégios em Privilégios de controle de acesso granular.Por exemplo, para conceder
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
ao papelhr_manager
do banco de dados, insira a seguinte instrução:GoogleSQL
GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;
PostgreSQL
GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO hr_manager;
É possível usar um modelo DDL para a instrução
GRANT
. No painel Explorer, navegue até o papel para o qual você quer conceder privilégios. Clique em Ver ações e selecione o tipo de privilégio a que você quer conceder acesso a esse papel. A instrução do modeloGRANT
é preenchida em uma nova guia do editor.
Clique em 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 detalhados a ele, use o comando gcloud spanner databases ddl update
com as instruções CREATE ROLE
e GRANT
.
Para detalhes de sintaxe nas instruções CREATE ROLE
e GRANT
, consulte Linguagem de definição de dados do GoogleSQL.
Por exemplo, use o seguinte comando para criar um papel de banco de dados e conceder privilégios a ele em uma ou mais tabelas.
GoogleSQL
gcloud spanner databases ddl update DATABASE_NAME --instance=INSTANCE_NAME \ --ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE ROLE_NAME;'
PostgreSQL
gcloud spanner databases ddl update DATABASE_NAME --instance=INSTANCE_NAME \ --ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE_NAME;'
Substitua:
PRIVILEGES
é uma lista delimitada por vírgulas de privilégios de controle de acesso refinados. Saiba mais sobre privilégios em Privilégios de controle de acesso granular.TABLES
é uma lista de tabelas delimitadas por vírgulas;
Por exemplo, para conceder SELECT
, INSERT
e UPDATE
nas tabelas employees
e contractors
ao papel hr_analyst
no banco de dados hrdb1
na instância hr
, insira a seguinte instrução:
GoogleSQL
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;'
PostgreSQL
gcloud spanner databases ddl update hrdb1 --instance=hr \ --ddl='CREATE ROLE hr_analyst; GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO hr_analyst;'
Bibliotecas de cliente
Esses exemplos de código criam e eliminam um papel do 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 de banco de dados concedendo um papel de banco de dados a outro. As funções filhas (conhecidas como funções de participante) herdam os privilégios do pai.
Para conceder um papel de banco de dados a outro, use a seguinte instrução:
GoogleSQL
GRANT ROLE role1 TO ROLE role2;
PostgreSQL
GRANT role1 TO role2;
Para mais informações, consulte Hierarquias de papéis do banco de dados e herança.
Conceder acesso aos papéis de banco de dados aos principais do IAM
Antes que um principal possa usar um papel de banco de dados para acessar os recursos do Spanner, é preciso conceder a ele acesso ao papel de banco de dados.
Console
Para conceder acesso a papéis de banco de dados a 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 com que o principal seja um usuário de controle de acesso detalhado.
Clique em ADICIONAR OUTRO PAPEL.
No menu Selecionar um papel, escolha Cloud Spanner > Usuário com papel de 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 do banco de dados do Cloud Spanner, clique em ADICIONAR CONDIÇÃO DE IAM.
No painel Adicionar condição, insira um título e uma descrição opcional para a condição.
Se você estiver concedendo um único papel de banco de dados, normalmente incluirá o nome do papel no título da condição. Se você estiver concedendo vários papéis, é possível indicar algo sobre o conjunto de papéis.
Clique em EDITOR DE CONDIÇÕES.
No campo Expressão, insira o seguinte código:
resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/ROLE")
Substitua
ROLE
pelo nome do seu 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 papéis. Para conceder mais de dois papéis, adicione mais condições or.É 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 Salvar.
De volta ao painel anterior, verifique se a condição aparece na coluna Condição do IAM ao lado do campo Papel.
Clique em Salvar.
De volta ao painel Informações, em Papel/Principal, observe que Usuário do 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 do banco de dados por essa condição. Clique na seta de expansão para ver a lista de principais.
Para corrigir erros em nomes ou condições de papéis de banco de dados ou para adicionar outros papéis de banco de dados para um principal, siga estas etapas:
Expanda a entrada Usuário do papel do banco de dados do Cloud Spanner que lista a condição que você quer.
Clique no ícone Editar (lápis) ao lado de um principal.
No painel Acesso para editar a database_name, 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. Em seguida, na página Editar condição, clique em EDITOR DE CONDIÇÕES, faça as correções e clique em Salvar duas vezes.
gcloud
Para conceder acesso a papéis de banco de dados a um principal do IAM, siga estas etapas:
Ative o controle de acesso detalhado 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 da principal. Ele precisa estar no formatouser|group|serviceAccount:email
oudomain:domain
.Esse comando torna o principal um usuário de controle de acesso detalhado. Envie este comando apenas uma vez para cada principal.
Se bem-sucedido, o comando vai gerar toda a política para o banco de dados.
Conceda permissão para usar um ou mais papéis de 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 da 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 papéis. Para conceder mais de dois papéis, adicione mais condições or 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 bem-sucedido, o comando vai 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
Informar usuários e desenvolvedores para começar a usar funções de banco de dados
Depois que a configuração inicial refinada de controle de acesso for concluída, informe aos usuários e os desenvolvedores de aplicativos que eles precisam começar a usar os papéis de banco de dados.
Os usuários de controle de acesso refinado precisam começar a especificar um papel de banco de dados quando acessam bancos de dados do Spanner por meio do console do Google Cloud ou da Google Cloud CLI.
Os aplicativos que usam controle de acesso refinado precisam especificar um papel para o banco de dados ao acessá-lo.
Para mais informações, consulte Acessar um banco de dados com controle de acesso refinado.
Transição de uma principal para um controle de acesso detalhado
Para fazer a transição de um principal do IAM do controle de acesso no nível do banco de dados para o controle de acesso refinado, siga estas etapas:
Ative o controle de acesso detalhado para o principal e conceda acesso a todos os papéis de banco de dados necessários, conforme descrito em Conceder acesso a papéis de banco de dados aos principais do IAM.
Atualize todos os aplicativos executados como este principal. Especifique os papéis de banco de dados apropriados 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 para o principal é regido por apenas um método.
Exceção: para interagir com os recursos do Spanner no Console do Google Cloud, todos os usuários precisam ter o papel
roles/spanner.viewer
do IAM.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 do banco de dados
É possível listar os papéis associados a um banco de dados.
Console
Para listar os papéis de banco de dados, insira a seguinte consulta na página do Spanner Studio referente ao banco de dados:
GoogleSQL
SELECT * FROM INFORMATION_SCHEMA.ROLES;
PostgreSQL
SELECT * FROM information_schema.enabled_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 da Google Cloud CLI.
gcloud
Para consultar uma lista não filtrada de papéis de banco de dados, digite o seguinte comando.
A permissão spanner.databaseRoles.list
é necessária.
gcloud spanner databases roles list --database=DATABASE_NAME --instance=INSTANCE_NAME
Bibliotecas de cliente
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Exibir os privilégios concedidos a um papel de banco de dados
Para ver os privilégios concedidos a um papel, execute as seguintes consultas:
GoogleSQL
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 em tabelas e visualizações.
Os privilégios SELECT
, INSERT
e UPDATE
em TABLE_PRIVILEGES
também são
mostrados em COLUMN_PRIVILEGES
.
PostgreSQL
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 em tabelas e visualizações.
Os privilégios SELECT
, INSERT
e UPDATE
em table_privileges
também são
mostrados em column_privileges
.
Conferir usuários de controle de acesso refinados
Para ver uma lista dos principais que são usuários de controle de acesso detalhado, execute o comando
a seguir. Para executar o comando, você precisa ter a API Cloud Asset ativada no
projeto e 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.
Visualizar 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, você precisa ter a API Cloud Asset ativada no projeto e 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 do IAM de um principal
Para ver uma lista de condições do IAM que foram especificadas ao conceder o papel Usuário do 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 se há condições ausentes nas políticas do IAM para papéis do banco de dados
Depois de conceder acesso aos papéis do banco de dados aos principais, recomendamos que você garanta 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…"
Observe que o primeiro resultado não tem uma condição. Portanto, os principais dessa vinculação têm acesso a todos os papéis do banco de dados.
Remover um papel do banco de dados
O descarte de um papel de banco de dados revoga automaticamente a assinatura de outros papéis dele e a assinatura do papel em outros.
Para descartar um papel de banco de dados, faça o seguinte:
- Revogue todos os privilégios de controle de acesso refinados do papel.
- Remova todas as vinculações de política do IAM que se referem a esse papel, para que um papel de 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 Spanner Studio.
Para revogar os privilégios da função, digite uma instrução
REVOKE
.GoogleSQL
Veja detalhes de sintaxe para a instrução
REVOKE
em Linguagem de definição de dados do GoogleSQL. Saiba mais sobre privilégios em Privilégios de controle de acesso granular.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;
PostgreSQL
Se quiser detalhes de sintaxe para a instrução
REVOKE
, consulte Linguagem de definição de dados do PostgreSQL. Saiba mais sobre privilégios em Privilégios de controle de acesso granular.Por exemplo, para revogar os privilégios
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
do papelhr_manager
do banco de dados, insira a seguinte instrução:REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM hr_manager;
É possível usar um modelo DDL para a instrução
REVOKE
. No painel Explorer, navegue até o papel para o qual você quer revogar o privilégio. Clique em Ver ações e selecione o tipo de privilégio para o qual você quer revogar o acesso a esse papel. A instrução do modeloREVOKE
é preenchida em uma nova guia do editor.Exclua as condições do IAM associadas ao papel.
Na lista de papéis do Painel de informações, localize o papel Usuário do papel do banco de dados do Cloud Spanner que tem o título de condição de interesse ao lado e expanda o papel para visualizar os principais que têm acesso a ele.
Para um dos principais, clique no ícone Editar principal (lápis).
Na página Acesso para editar, clique no ícone Excluir papel (lixeira) ao lado do papel de usuário do papel de banco de dados do Cloud Spanner.
Clique em Salvar.
Repita as três etapas anteriores para os outros principais listados na condição.
Para descartar o papel, acesse a página do Spanner Studio e insira a seguinte instrução:
DROP ROLE ROLE_NAME;
Clique em Enviar.
gcloud
Para revogar todos os privilégios de um papel e descartar o papel, use o comando
gcloud spanner databases ddl update
da seguinte maneira:GoogleSQL
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;'
PostgreSQL
gcloud spanner databases ddl update DATABASE_NAME \ --instance=INSTANCE_NAME \ --ddl='REVOKE PERMISSIONS ON TABLE TABLE_NAME FROM ROLE_NAME; DROP ROLE ROLE_NAME;'
Os valores válidos para
PERMISSIONS
sãoSELECT
,INSERT
,UPDATE
eDELETE
.Para excluir qualquer condição do IAM relacionada, 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 da 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 da condição precisa corresponder exatamente à especificação da condição usada no comando que concedeu a permissão, incluindo o título e a descrição.
Bibliotecas de cliente
Esses exemplos de código criam e eliminam um papel do banco de dados.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Mais informações
- Sobre o controle de acesso detalhado
- Controle de acesso refinado para fluxos de alteração
- Privilégios de controle de acesso granular
- Referência de DDL do GoogleSQL
- Fazer atualizações no esquema