Esta página explica como configurar um controle de acesso detalhado para bancos de dados do Spanner.
Para saber mais sobre o controle de acesso detalhado, consulte Sobre o controle de acesso detalhado.
A configuração do controle de acesso detalhado envolve as seguintes etapas:
Conceda acesso a papéis de banco de dados para principais do Identity and Access Management (IAM).
Informe os usuários e desenvolvedores para começar a usar os papéis de banco de dados.
Os usuários de controle de acesso granular devem especificar um papel de banco de dados para realizar consultas, DML ou operações de linha no banco de dados.
Antes de começar
Garanta que todos os principais que serão usuários de controle de acesso refinados recebam
o papel de IAM Cloud Spanner Viewer
(roles/spanner.viewer
).
Esse papel é recomendado no nível do projeto para usuários que devem interagir
Recursos do Spanner no console do Google Cloud.
Para instruções, consulte Conceda permissões aos principais.
Criar funções de banco de dados e conceder privilégios
Um papel de banco de dados é uma coleção de privilégios de acesso detalhados. Você pode criar até 100 papéis para cada banco de dados.
Defina papéis e hierarquias no banco de dados e codifique-os em DDL. Conforme com outras alterações de esquema no Spanner, é altamente recomendável emitir as mudanças de esquema em lote e não separadamente. Para mais informações, consulte Limite a frequência das atualizações do esquema.
Console
Para criar um papel de banco de dados e conceder privilégios de acesso detalhados 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 em que você quer incluir 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 para 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
no próximo linha após a instruçãoCREATE ROLE
.Para detalhes de sintaxe da instrução
GRANT
, consulte Linguagem de definição de dados do GoogleSQL. Para informações sobre privilégios, consulte Privilégios de controle de acesso detalhado.Por exemplo, para conceder
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
para o função de banco de dadoshr_manager
, digite 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
. Na Explorer, navegue até o papel a que você quer conceder para conceder privilégios de acesso. Clique em Ver ações. e selecione o tipo de privilégio ao qual você quer conceder acesso para essa função. A instrução do modeloGRANT
será preenchida em uma nova guia do editor.
Clique em Enviar.
Se houver erros no DDL, o console do Google Cloud retornará uma erro.
gcloud
Para criar um papel de banco de dados e conceder privilégios de acesso detalhados a ele,
use o gcloud spanner databases ddl update
com 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 comando a seguir para criar um papel de banco de dados e conceder 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 granular. Para informações sobre privilégios, consulte Privilégios de controle de acesso refinados.TABLES
é uma lista de tabelas delimitadas por vírgulas.
Por exemplo, para conceder SELECT
,
INSERT
e UPDATE
nas tabelas employees
e contractors
para a
papel de banco de dados 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 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 de banco de dados concedendo um papel de banco de dados para outra. Os papéis filhos (conhecidos como funções de membro) herdam 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 e heranças de papéis do banco de dados.
Conceder acesso a papéis de banco de dados aos principais do IAM
Antes que um principal possa usar um papel de banco de dados para acessar o Spanner você precisa conceder a eles acesso ao papel de banco de dados.
Console
Para conceder acesso aos 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 a caixa Informações painel ainda não estiver aberto.
Clique em ADICIONAR CONTA PRINCIPAL.
No painel Conceder acesso a database_name, em Adicione 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 para cada principal. Isso faz com que principal um usuário de controle de acesso refinado.
Clique em ADICIONAR OUTRO PAPEL.
No menu Selecionar 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 que serão 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.
Ao conceder um único papel de banco de dados, você normalmente incluir o nome do papel no título da condição. Se você estiver concedendo a várias você pode 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 papel.Ou, para conceder acesso ao principal a mais de um papel, adicione mais condições com o operador or (
||
), conforme mostrado no exemplo: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 ou.É 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.
No 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 de informações, em Papel/Principal, Observe que Usuário com função de 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 estão que receberam o papel de banco de dados por essa condição. Você pode clicar no botão seta de expansão para conferir 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 com papel de 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, escolha uma das o seguinte:
Clique em ADICIONAR OUTRO PAPEL.
Para editar a condição, clique no ícone Editar (lápis) ao lado. ao nome da condição. 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 aos papéis de banco de dados a um principal do IAM, siga estas etapas:
Ative o controle de acesso detalhado para o principal usando a
gcloud spanner databases add-iam-policy-binding
da seguinte forma: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 detalhado. Enviar apenas uma vez para cada principal.
Se bem-sucedido, o comando gera a política inteira para o banco de dados.
Conceda permissão para usar um ou mais papéis de banco de dados usando
gcloud spanner databases add-iam-policy-binding
da seguinte forma: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 condição do IAM expressão 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:--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 ou com||
usando um operador lógico.É 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 gera a política inteira para o banco de dados.
O exemplo a seguir concede aos 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 papéis de banco de dados
Após a conclusão da configuração inicial refinada do controle de acesso, informe os usuários e desenvolvedores de aplicativos que precisam começar a usar papéis de banco de dados.
Os usuários de controle de acesso granular devem começar a especificar um papel de banco de dados ao acessar os bancos de dados do Spanner pelo console do Google Cloud ou a Google Cloud CLI.
Os aplicativos que usam controle de acesso refinado precisam especificar um papel de banco de dados ao acessar o banco de dados.
Para mais informações, consulte Acesse um banco de dados com controle de acesso refinado.
Transição de um principal para um controle de acesso detalhado
Para fazer a transição de um principal do IAM do nível do banco de dados controle de acesso a controle de acesso refinados, siga estas etapas:
Ative o controle de acesso detalhado para o principal e conceda acesso a todos os de banco de dados, conforme descrito nas Conceda acesso a papéis de banco de dados para principais do IAM.
Atualize todos os aplicativos executados como este principal. Especifique o funções de banco de dados em chamadas para métodos da biblioteca de cliente.
Revogue todos os papéis do banco de dados do IAM do principal. Assim, o acesso do principal é regido por somente um método.
Exceção: para interagir com recursos do Spanner na console do Google Cloud, todos os usuários precisam ter a permissão
roles/spanner.viewer
papel do IAM.Para revogar esses papéis, siga as instruções em Remova permissões no nível do banco de dados.
Listar papéis de banco de dados
É possível listar os papéis de banco de dados associados a um banco de dados.
Console
Para listar papéis de banco de dados, insira a seguinte consulta no Página do Spanner Studio para o banco de dados:
GoogleSQL
SELECT * FROM INFORMATION_SCHEMA.ROLES;
PostgreSQL
SELECT * FROM information_schema.enabled_roles;
A resposta inclui a função atual e as funções com os privilégios que o usuário atual pode usar por meio da herança. Para buscar todos os papéis, use o comando da Google Cloud CLI.
gcloud
Para receber uma lista não filtrada de papéis do banco de dados, digite o comando a seguir.
Ela exige 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
Visualizar 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 estã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 estão
mostrados em column_privileges
.
Visualize usuários de controle de acesso detalhados
Para ver uma lista de principais que são usuários de controle de acesso refinados, execute o seguinte
kubectl. Para executar o comando, a API Cloud Asset precisa estar ativada no seu
projeto, e é necessário ter
cloudasset.assets.searchAllIamPolicies
permissão do IAM.
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 projeto do Google Cloud.
Mostrar principais do IAM com acesso a um papel de banco de dados
Para visualizar uma lista dos principais que receberam acesso a uma determinada
de banco de dados, execute o comando a seguir. Para executar o comando, você precisa ter o
a API Cloud Asset ativada no projeto. Além disso, é necessário ter
cloudasset.assets.searchAllIamPolicies
permissão do IAM.
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
Consultar as condições do IAM para um principal
Para conferir uma lista de condições do IAM que foram especificadas ao conceder o papel Usuário com papel de banco de dados do Cloud Spanner em uma conta 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 condicionais.
EXPRESSION resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/hr_analyst") resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/hr_manager")
Verifique se há condições de papéis de banco de dados ausentes nas políticas do IAM
Depois de conceder acesso aos papéis de banco de dados aos principais, recomendamos para 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, então os principais nesta vinculação têm acesso a todos os papéis do banco de dados.
Remover um papel de banco de dados
O descarte de um papel de banco de dados revoga automaticamente a associação de outros papéis do papel e revoga a associação dele a outros papéis.
Para descartar um papel de banco de dados, primeiro faça o seguinte:
- Revogue todos os privilégios de controle de acesso detalhados do papel.
- Remover todas as vinculações de políticas do IAM que se referem a ele. Assim, um papel de banco de dados criado posteriormente com o mesmo não herdam 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 do papel, digite uma instrução
REVOKE
.GoogleSQL
Para detalhes de sintaxe da instrução
REVOKE
, consulte Linguagem de definição de dados do GoogleSQL. Para informações sobre privilégios, consulte Privilégios de controle de acesso detalhado.Por exemplo, para revogar
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
da função de banco de dadoshr_manager
, digite a seguinte instrução:REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM ROLE hr_manager;
PostgreSQL
Para detalhes de sintaxe da instrução
REVOKE
, consulte Linguagem de definição de dados PostgreSQL. Para informações sobre privilégios, consulte Privilégios de controle de acesso detalhado.Por exemplo, para revogar a
SELECT
,INSERT
eUPDATE
naemployees
econtractors
tabelas do papel de banco de dadoshr_manager
, insira o 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
. Na Explorer, navegue até o papel que você quer revogar privilégio mínimo. Clique em Ver ações. e selecione o tipo de privilégio ao qual você quer revogar o acesso para essa função. A instrução do modeloREVOKE
será preenchida em uma nova guia do editor.Exclua qualquer condição do IAM associada ao papel.
Na lista de papéis no Painel de informações, localize o Papel Usuário do papel do banco de dados do Cloud Spanner com o título da condição de interesse adjacentes a ele e, em seguida, expandir o papel para visualizar os principais que têm acesso à função.
Para um dos principais, clique no ícone Editar principal (lápis).
Na página Editar acesso, clique no ícone Excluir função (lixeira) adjacente ao papel de usuário do papel de banco de dados do Cloud Spanner.
Clique em Salvar.
Repita as três etapas anteriores para outros principais listados em a condição.
Para descartar o papel, acesse a página Spanner Studio e insira o seguinte: declaração:
DROP ROLE ROLE_NAME;
Clique em Enviar.
gcloud
Para revogar todos os privilégios de um papel e, em seguida, descartar o papel, use o
gcloud spanner databases ddl update
da seguinte forma: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 quaisquer condições de IAM relacionadas, use
gcloud spanner databases remove-iam-policy-binding
da seguinte forma: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 condição do IAM expressão 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 à condição. específica usada no comando que concedeu permissão, incluindo título e descrição.
Bibliotecas de cliente
Esses exemplos 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 o controle de acesso detalhado
- Controle de acesso refinado para fluxos de alterações
- Privilégios de controle de acesso refinados
- Referência de DDL do GoogleSQL
- Fazer atualizações de esquema