Nesta página, explicamos como configurar o controle de acesso refinado para bancos de dados do Spanner com dialeto GoogleSQL e PostgreSQL.
Para saber mais sobre o controle de acesso refinado, consulte Sobre o controle de acesso refinado.
Para configurar o controle de acesso detalhado, siga estas etapas:
Os usuários de controle de acesso granular precisam especificar uma função de banco de dados para realizar consultas, DML ou operações de linha no banco de dados.
Antes de começar
Verifique se cada principal que será um usuário de controle de acesso granular recebeu
o papel do IAM Cloud Spanner Viewer
(roles/spanner.viewer
).
Esse papel é recomendado no nível do projeto para usuários que precisam interagir com
recursos do Spanner no console Google Cloud .
Para instruções, consulte Conceder permissões a principais.
Criar papéis de banco de dados e conceder privilégios
Um papel de banco de dados é um conjunto de privilégios de acesso refinado. É possível criar até 100 papéis de banco de dados para cada banco de dados.
Decida sobre as funções e hierarquias de funções no seu banco de dados e codifique-as em DDL. Assim como em outras mudanças de esquema no Spanner, recomendamos emitir as mudanças em lote, em vez de separadamente. Para mais informações, consulte Limitar a frequência de atualizações de esquema.
Console
Para criar uma função de banco de dados e conceder privilégios de acesso refinado a ela, siga estas etapas:
Acesse a página Instâncias no Google Cloud console.
Selecione a instância que contém o banco de dados para o qual você quer adicionar a função.
Selecione o banco de dados.
Na página Visão geral, clique em Spanner Studio.
Na página Spanner Studio, para cada papel de banco de dados que você quer criar e conceder privilégios, siga estas etapas:
Para criar a função, 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 depois da instruçãoCREATE ROLE
.Para detalhes da 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
à função de banco de dadoshr_manager
, 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;
Você pode usar um modelo DDL para a instrução
GRANT
. No painel Explorer, navegue até a função a que você quer conceder privilégios. Clique em Ver ações e selecione o tipo de privilégio que você quer conceder a essa função. A instrução de modeloGRANT
é preenchida em uma nova guia do editor.
Clique em Enviar.
Se houver erros na DDL, o console Google Cloud vai retornar um erro.
gcloud
Para criar uma função de banco de dados e conceder privilégios de acesso refinados a ela,
use o comando gcloud spanner databases ddl update
com as instruções CREATE ROLE
e GRANT
.
Para detalhes da sintaxe das instruções CREATE ROLE
e GRANT
, consulte
Linguagem de definição de dados do GoogleSQL.
Por exemplo, use o comando a seguir para criar uma função de banco de dados e conceder privilégios a ela 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 separada por vírgulas de privilégios de controle de acesso refinado. Para informações sobre privilégios, consulte Privilégios de controle de acesso detalhado.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:
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 uma função 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 a outro. As funções secundárias (conhecidas como funções de membro) herdam privilégios da função principal.
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ça de papéis de banco de dados.
Conceder papéis de banco de dados aos principais
Para acessar recursos do Spanner, um principal precisa receber o papel de banco de dados necessário usando uma das seguintes opções:
Console
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.
Em Adicionar principais, em Novos principais, insira um ou mais principais.
Em Atribuir papéis, em Selecionar um papel, escolha Cloud Spanner > Usuário de acesso refinado do Cloud Spanner.
Você só precisa conceder essa função uma vez a cada principal. Isso torna o principal um usuário de controle de acesso refinado.
Clique em ADICIONAR OUTRO PAPEL.
Em Selecionar um papel, escolha Cloud Spanner > Usuário do papel de banco de dados do Cloud Spanner.
Siga estas etapas para criar a condição do IAM que especifica as funções a serem concedidas.
Ao lado do papel "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 você estiver concedendo uma única função de banco de dados, geralmente inclua o nome da função no título da condição. Se você estiver concedendo vários papéis, poderá 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 da sua função.Para conceder mais de um papel ao principal, adicione mais condições com o operador or (
||
), como mostrado no exemplo a seguir:resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))
Esse código concede duas funções. Substitua
ROLE1
eROLE2
pelos nomes das suas funções. 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 a visão geral das condições do IAM.
Clique em Salvar.
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 o Usuário com 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 a quantidade de principais que recebem a função de banco de dados por essa condição. Clique na seta de expansão para ver a lista de participantes.
Para corrigir erros em nomes ou condições de papéis de banco de dados ou adicionar outros papéis de banco de dados para um principal, siga estas etapas:
Expanda a entrada Usuário com papel do banco de dados do Cloud Spanner que lista a condição desejada.
Clique no ícone Editar (lápis) ao lado de um principal.
No painel Editar acesso ao database_name, faça uma das seguintes ações:
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
Ative o controle de acesso refinado 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. Ela precisa usar uma das seguintes sintaxes:user|group|serviceAccount:email
oudomain:domain
.Esse comando transforma o principal em um usuário de controle de acesso refinado. Envie esse comando apenas uma vez para cada principal.
Se bem-sucedido, o comando vai gerar a política inteira do 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 do principal. Ela precisa usar uma das seguintes sintaxes:user|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 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 duas funções. Substitua
ROLE1
eROLE2
pelos nomes das suas funções. Para conceder mais de dois papéis, adicione mais condições ou com o operador||
.É possível usar qualquer expressão de condição compatível com o IAM. Para mais informações, consulte a visão geral das condições do IAM.
Se bem-sucedido, o comando vai gerar a política inteira do 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 do controle de acesso granular for concluída, informe aos usuários e desenvolvedores de aplicativos que eles precisam começar a usar papéis de banco de dados.
Os usuários do controle de acesso granular precisam começar especificando uma função de banco de dados ao acessar os bancos de dados do Spanner pelo console Google Cloud ou pela Google Cloud CLI.
Os aplicativos que usam controle de acesso refinado precisam especificar uma função de banco de dados ao acessar o banco de dados.
Para mais informações, consulte Acessar um banco de dados com controle de acesso detalhado.
Fazer a transição de um principal para o controle de acesso refinado
Para fazer a transição de um principal 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 granular para o principal e conceda acesso a todos os papéis de banco de dados necessários, conforme descrito em Conceder papéis de banco de dados a principais.
Atualize todos os aplicativos executados como esse principal. Especifique as funções de banco de dados adequadas nas chamadas para métodos de biblioteca de cliente.
Revogue todos os papéis do IAM no nível do banco de dados da principal. Assim, o acesso para a conta principal é regido por apenas um método.
Exceção: para interagir com recursos do Spanner no consoleGoogle Cloud , todos os usuários precisam ter a função do IAM
roles/spanner.viewer
.Para revogar papéis do IAM no nível do banco de dados, 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 as funções de banco de dados associadas a um banco de dados.
Console
Para listar os papéis do banco de dados, insira a seguinte consulta na 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 o papel atual e aqueles cujos privilégios o papel atual pode usar por herança. Para buscar todas as funções, use o comando da Google Cloud CLI.
gcloud
Para receber uma lista não filtrada de funções de banco de dados, insira o seguinte comando:
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
Ver os privilégios concedidos a uma função de banco de dados
Para conferir 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
.
Ver usuários do controle de acesso refinado
Para conferir uma lista de principais que são usuários do controle de acesso detalhado, execute o seguinte
comando. Para executar o comando, é necessário ter a API Cloud Asset ativada no seu
projeto e a permissão de 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 Google Cloud .
Ver principais com acesso ao banco de dados
Para conferir uma lista de principais que receberam acesso a um banco de dados específico, execute os comandos a seguir. Para executar esses comandos, é necessário ter a
API Cloud Asset ativada no seu projeto e a permissão
cloudasset.assets.searchAllIamPolicies
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
Ver as condições do IAM para um principal
Para conferir uma lista de condições do IAM especificadas ao conceder o papel Usuário do papel de 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 políticas do IAM em busca de condições de função de banco de dados ausentes
Depois de conceder acesso aos papéis de banco de dados aos principais, recomendamos que você verifique se cada vinculação do IAM tem 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 participantes nesta vinculação têm acesso a todas as funções do banco de dados.
Remover uma função de banco de dados
Ao remover uma função de banco de dados, a associação de outras funções é revogada automaticamente, assim como a associação da função em outras funções.
Para descartar uma função de banco de dados, primeiro faça o seguinte:
- Revogue todos os privilégios de controle de acesso refinado da função.
- 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 excluir uma função de banco de dados, siga estas etapas:
Na página Visão geral do banco de dados, clique em Spanner Studio.
Para revogar privilégios da função, insira uma instrução
REVOKE
.GoogleSQL
Para detalhes da 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 as permissões
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
da função de banco de dadoshr_manager
, insira a seguinte instrução:REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM ROLE hr_manager;
PostgreSQL
Para detalhes da sintaxe da instrução
REVOKE
, consulte Linguagem de definição de dados do PostgreSQL. Para informações sobre privilégios, consulte Privilégios de controle de acesso detalhado.Por exemplo, para revogar os privilégios
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
da função de banco de dadoshr_manager
, insira a seguinte instrução:REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM hr_manager;
Você pode usar um modelo DDL para a instrução
REVOKE
. No painel Explorer, navegue até a função para revogar o privilégio. Clique em Ver ações e selecione o tipo de privilégio que você quer revogar para essa função. A instrução de modeloREVOKE
é preenchida em uma nova guia do editor.Exclua todas as condições do IAM associadas à função.
Na lista de papéis no Painel de informações, localize o papel Usuário do papel de banco de dados do Cloud Spanner que tem o título da condição de interesse ao lado dele e expanda o papel para ver os principais que têm acesso a ele.
Em um dos participantes, clique no ícone Editar participante (lápis).
Na página Editar acesso, clique no ícone Excluir papel (lixeira) ao lado do papel Usuário do papel de banco de dados do Cloud Spanner.
Clique em Salvar.
Repita as três etapas anteriores para outros principais listados na condição.
Para descartar a função, 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 uma função e depois descartá-la, 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 as condições relacionadas do IAM, 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 usada no comando que concedeu a permissão, incluindo título e descrição.
Bibliotecas de cliente
Esses exemplos de código criam e descartam uma função de banco de dados.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Mais informações
- Sobre o controle de acesso granular
- Controle de acesso minucioso para streams de alteração
- Privilégios de controle de acesso refinado
- Referência da DDL do GoogleSQL
- Fazer atualizações no esquema