Esta página explica como configurar o controlo de acesso detalhado para bases de dados com dialeto GoogleSQL e bases de dados com dialeto PostgreSQL do Spanner.
Para saber mais sobre o controlo de acesso detalhado, consulte o artigo Acerca do controlo de acesso detalhado.
Configure o controlo de acesso detalhado seguindo estes passos:
Os utilizadores do controlo de acesso detalhado têm de especificar uma função da base de dados para executar consultas, DML ou operações de linhas na base de dados.
Antes de começar
Certifique-se de que cada principal que vai ser um utilizador do controlo de acesso detalhado tem a Cloud Spanner Viewer
função de IAM (roles/spanner.viewer
) atribuída.
Esta função é recomendada ao nível do projeto para os utilizadores que têm de interagir com os recursos do Spanner na Google Cloud consola.
Para ver instruções, consulte o artigo Conceda autorizações a responsáveis.
Crie funções de base de dados e conceda privilégios
Uma função de base de dados é uma coleção de privilégios de acesso detalhados. Pode criar até 100 funções de base de dados para cada base de dados.
Decida sobre as funções e as hierarquias de funções na sua base de dados e codifique-as em DDL. Tal como acontece com outras alterações ao esquema no Spanner, recomendamos vivamente que emita alterações ao esquema num lote em vez de separadamente. Para mais informações, consulte Limite a frequência das atualizações do esquema.
Consola
Para criar uma função de base de dados e conceder-lhe privilégios de acesso detalhados, siga estes passos:
Aceda à página Instâncias na Google Cloud consola.
Selecione a instância que contém a base de dados para a qual quer adicionar a função.
Selecione a base de dados.
Na página Vista geral, clique em Spanner Studio.
Na página Spanner Studio, para cada função de base de dados que quer criar e à qual quer conceder privilégios, siga estes passos:
Para criar a função, introduza a seguinte declaração:
CREATE ROLE ROLE_NAME;
Não clique ainda em Enviar.
Para conceder privilégios à função, introduza uma declaração
GRANT
na linha seguinte à declaraçãoCREATE ROLE
.Para ver detalhes da sintaxe da declaração
GRANT
, consulte o artigo Linguagem de definição de dados do GoogleSQL. Para obter informações sobre privilégios, consulte o artigo Privilégios de controlo de acesso detalhado.Por exemplo, para conceder
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
à função de base de dadoshr_manager
, introduza a seguinte declaraçã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;
Pode usar um modelo de LDD para a declaração
GRANT
. No painel Explorador, navegue para a função à qual quer conceder privilégios. Clique em Ver ações e selecione o tipo de privilégio ao qual quer conceder acesso para esta função. A declaração do modeloGRANT
é preenchida num novo separador do editor.
Clique em Enviar.
Se existirem erros no seu DDL, a consola devolve um erro. Google Cloud
gcloud
Para criar uma função de base de dados e conceder-lhe privilégios de acesso detalhados,
use o comando gcloud spanner databases ddl update
com as declarações CREATE ROLE
e GRANT
.
Para ver detalhes da sintaxe das declarações CREATE ROLE
e GRANT
, consulte o artigo
Linguagem de definição de dados do GoogleSQL.
Por exemplo, use o seguinte comando para criar uma função de base de dados e conceder-lhe privilégios numa 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 o seguinte:
PRIVILEGES
é uma lista delimitada por vírgulas de privilégios de controlo de acesso detalhados. Para obter informações sobre privilégios, consulte Privilégios de controlo 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
à função de base de dados hr_analyst
na base de dados hrdb1
na instância hr
, introduza a seguinte declaraçã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 cliente
Estes exemplos de código criam e eliminam uma função de base de dados.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Crie uma hierarquia de funções com herança
Pode criar uma hierarquia de funções de base de dados concedendo uma função de base de dados a outra. As funções secundárias (conhecidas como funções de membro) herdam privilégios da função principal.
Para conceder uma função de base de dados a outra função de base de dados, use a seguinte declaração:
GoogleSQL
GRANT ROLE role1 TO ROLE role2;
PostgreSQL
GRANT role1 TO role2;
Para mais informações, consulte o artigo Hierarquias e herança de funções da base de dados.
Conceda funções de base de dados a principais
Para aceder aos recursos do Spanner, tem de conceder à entidade principal a função de base de dados necessária através de uma das seguintes opções:
Consola
Na página Vista geral da base de dados, clique em MOSTRAR PAINEL DE INFORMAÇÕES se o painel de informações ainda não estiver aberto.
Clique em ADICIONAR PRINCIPAL.
Em Adicionar membros, em Novos membros, introduza um ou mais membros.
Em Atribuir funções, em Selecionar uma função, selecione Cloud Spanner > Utilizador de acesso detalhado do Cloud Spanner.
Só tem de conceder esta função uma vez a cada principal. Torna o principal um utilizador de controlo de acesso detalhado.
Clique em ADICIONAR OUTRA FUNÇÃO.
Em Selecionar uma função, selecione Cloud Spanner > Utilizador da função de base de dados do Cloud Spanner.
Siga estes passos para criar a condição do IAM que especifica as funções a conceder.
Junto à função de utilizador da função de base de dados do Cloud Spanner, clique em ADICIONAR CONDIÇÃO DE IAM.
No painel Adicionar condição, introduza um título e uma descrição opcional para a condição.
Se estiver a conceder uma única função de base de dados, normalmente inclui o nome da função no título da condição. Se estiver a conceder várias funções, pode indicar algo sobre o conjunto de funções.
Clique em Editor de condições.
No campo Expressão, introduza 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 do que uma função ao principal, adicione mais condições com o operador ou (
||
), conforme mostrado no seguinte exemplo:resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))
Este código concede duas funções. Substitua
ROLE1
eROLE2
pelos nomes das suas funções. Para conceder mais de duas funções, adicione mais condições ou.Pode usar qualquer expressão de condição suportada pelo IAM. Para mais informações, consulte o artigo Vista geral das condições do IAM.
Clique em Guardar.
Verifique se a condição aparece na coluna Condição do IAM junto ao campo Função.
Clique em Guardar.
No painel de informações, em Função/principal, repare que Utilizador da função de base de dados do Cloud Spanner aparece para cada condição definida.
O número entre parênteses junto à condição indica o número de diretores aos quais é concedida a função de base de dados por essa condição. Pode clicar na seta do expansor para ver a lista de responsáveis.
Para corrigir erros nos nomes ou nas condições das funções da base de dados, ou para adicionar funções da base de dados adicionais a um principal, siga estes passos:
Expanda a entrada Utilizador da função da base de dados do Cloud Spanner que lista a condição pretendida.
Clique no ícone Editar (lápis) junto a um principal.
No painel Editar acesso à base de dados database_name, faça uma das seguintes ações:
Clique em ADICIONAR OUTRA FUNÇÃO.
Para editar a condição, clique no ícone Editar (lápis) junto ao nome da condição. Em seguida, na página Editar condição, clique em Editor de condições, faça as correções e clique em Guardar duas vezes.
gcloud
Ative o controlo de acesso detalhado para o principal através do comando
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. Tem de usar uma das seguintes sintaxes:user|group|serviceAccount:email
oudomain:domain
.Este comando torna o principal um utilizador de controlo de acesso detalhado. Envie este comando apenas uma vez para cada principal.
Se for bem-sucedido, o comando produz a política completa para a base de dados.
Conceda autorização para usar uma ou mais funções da base de dados através do comando
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. Tem de usar uma das seguintes sintaxes:user|group|serviceAccount:email
oudomain:domain
.CONDITION
é uma expressão de condição de IAM que especifica as funções a conceder ao principal.CONDITION
tem o seguinte formato:--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/ROLE1")),title=TITLE,description=DESCRIPTION'
Em alternativa, para conceder acesso ao principal a mais do que uma função, adicione mais condições com o operador ou (
||
), conforme mostrado no seguinte exemplo:--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))),title=TITLE,description=DESCRIPTION'
Este código concede duas funções. Substitua
ROLE1
eROLE2
pelos nomes das suas funções. Para conceder mais de duas funções, adicione mais condições ou com o operador||
.Pode usar qualquer expressão de condição suportada pelo IAM. Para mais informações, consulte o artigo Vista geral das condições do IAM.
Se for bem-sucedido, o comando produz a política completa para a base de dados.
O exemplo seguinte concede as funções de base 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 cliente
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Informe os utilizadores e os programadores para começarem a usar funções de base de dados
Após a conclusão da configuração inicial do controlo de acesso detalhado, informe os utilizadores e os programadores de aplicações de que têm de começar a usar funções da base de dados.
Os utilizadores do controlo de acesso detalhado têm de começar a especificar uma função de base de dados quando acedem a bases de dados do Spanner através da consola Google Cloud ou da CLI do Google Cloud.
As aplicações que usam o controlo de acesso detalhado têm de especificar uma função da base de dados quando acedem à base de dados.
Para mais informações, consulte o artigo Aceda a uma base de dados com controlo de acesso detalhado.
Transição de um principal para o controlo de acesso detalhado
Para fazer a transição de um principal do controlo de acesso ao nível da base de dados para o controlo de acesso detalhado, siga estes passos:
Ative o controlo de acesso detalhado para o principal e conceda acesso a todas as funções de base de dados necessárias, conforme descrito em Conceda funções de base de dados a principais.
Atualize todas as aplicações executadas como este principal. Especifique as funções da base de dados adequadas nas chamadas para métodos da biblioteca de cliente.
Revogue todas as funções ao nível da base de dados de IAM do principal. Desta forma, o acesso do diretor é regido apenas por um método.
Exceção: para interagir com recursos do Spanner naGoogle Cloud consola, todos os utilizadores têm de ter a função do
roles/spanner.viewer
IAM.Para revogar funções de IAM ao nível da base de dados, siga as instruções em Remova autorizações ao nível da base de dados.
Liste as funções da base de dados
Pode listar as funções da base de dados associadas a uma base de dados.
Consola
Para listar as funções da base de dados, introduza a seguinte consulta na página do Spanner Studio para a base 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 cujos privilégios a função atual pode usar através da herança. Para obter todas as funções, use o comando da CLI Google Cloud.
gcloud
Para obter uma lista não filtrada de funções da base de dados, introduza o seguinte comando.
Requer a autorização spanner.databaseRoles.list
.
gcloud spanner databases roles list --database=DATABASE_NAME --instance=INSTANCE_NAME
Bibliotecas cliente
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Veja os privilégios concedidos a uma função da base de dados
Para ver os privilégios concedidos a uma função, 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
devolve privilégios em tabelas e visualizações. Os privilégios SELECT
, INSERT
e UPDATE
em TABLE_PRIVILEGES
também são apresentados 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
devolve privilégios em tabelas e visualizações.
Os privilégios SELECT
, INSERT
e UPDATE
em table_privileges
também são apresentados em column_privileges
.
Veja utilizadores com controlo de acesso detalhado
Para ver uma lista de principais que são utilizadores do controlo de acesso detalhado, execute o seguinte comando. Para executar o comando, tem de ter a API Cloud Asset ativada no seu projeto e ter a autorizaçã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)'
O resultado é semelhante ao seguinte:
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 o artigo Ativar uma API no seu Google Cloud projeto.
Veja os responsáveis com acesso à base de dados
Para ver uma lista de responsáveis aos quais foi concedido acesso a uma base de dados específica, execute os seguintes comandos. Para executar estes comandos, tem de ter a API Cloud Asset ativada no seu projeto e ter a autorizaçã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)'
O resultado é semelhante ao seguinte:
MEMBERS 222larabrown@gmail.com
Veja as condições da IAM para um principal
Para ver uma lista das condições da IAM especificadas quando atribuiu a função Utilizador da função de base 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)'
onde PRINCIPAL_IDENTIFIER está:
{ user:user-account-name | serviceAccount:service-account-name }
PRINCIPAL_IDENTIFIER exemplos:
user:222larabrown@gmail.com serviceAccount:cs-fgac-sa-1@cloud-spanner-demo.google.com.iam.gserviceaccount.com
O exemplo de saída seguinte 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")
Verifique se existem condições de funções de base de dados em falta nas políticas de IAM
Depois de conceder acesso às funções da base de dados aos responsáveis, recomendamos que se certifique de que cada associação de IAM tem uma condição especificada.
Para realizar esta 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 é semelhante ao seguinte:
ROLE MEMBERS EXPRESSION roles/spanner.databaseRoleUser serviceAccount:cs-fgac-sa-1@... roles/spanner.databaseRoleUser serviceAccount:cs-fgac-sa-2@... resource.type == "spanner…"
Tenha em atenção que o primeiro resultado não tem uma condição e, por isso, os principais nesta associação têm acesso a todas as funções da base de dados.
Elimine uma função de base de dados
A eliminação de uma função de base de dados revoga automaticamente a associação de outras funções da função e revoga a associação da função noutras funções.
Para eliminar uma função de base de dados, primeiro tem de fazer o seguinte:
- Revogar todos os privilégios de controlo de acesso detalhado da função.
- Remova todas as associações de políticas de IAM que façam referência a essa função, para que uma função de base de dados criada posteriormente com o mesmo nome não herde essas associações.
Consola
Para eliminar uma função de base de dados, siga estes passos:
Na página Vista geral da base de dados, clique em Spanner Studio.
Para revogar privilégios da função, introduza uma declaração
REVOKE
.GoogleSQL
Para ver detalhes da sintaxe da declaração
REVOKE
, consulte o artigo Linguagem de definição de dados do GoogleSQL. Para obter informações sobre privilégios, consulte o artigo Privilégios de controlo de acesso detalhado.Por exemplo, para revogar as autorizações
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
da função de base de dadoshr_manager
, introduza a seguinte declaração:REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM ROLE hr_manager;
PostgreSQL
Para ver detalhes da sintaxe da declaração
REVOKE
, consulte o artigo Linguagem de definição de dados do PostgreSQL. Para obter informações sobre privilégios, consulte o artigo Privilégios de controlo de acesso detalhado.Por exemplo, para revogar os privilégios
SELECT
,INSERT
eUPDATE
nas tabelasemployees
econtractors
da função de base de dadoshr_manager
, introduza a seguinte declaração:REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM hr_manager;
Pode usar um modelo de LDD para a declaração
REVOKE
. No painel Explorador, navegue para a função para a qual quer revogar o privilégio. Clique em Ver ações e selecione o tipo de privilégio para o qual quer revogar o acesso para esta função. A declaração do modeloREVOKE
é preenchida num novo separador do editor.Elimine todas as condições da IAM associadas à função.
Na lista de funções no painel de informações, localize a função Utilizador da função de base de dados do Cloud Spanner que tem o título da condição de interesse junto a si e, em seguida, expanda a função para ver os principais que têm acesso à função.
Para um dos diretores, clique no ícone Editar diretor (lápis).
Na página Editar acesso, clique no ícone Eliminar função (papel de lixo) junto à função de utilizador da função de base de dados do Cloud Spanner.
Clique em Guardar.
Repita os três passos anteriores para outros responsáveis que estejam listados na condição.
Para eliminar a função, aceda à página do Spanner Studio e introduza a seguinte declaração:
DROP ROLE ROLE_NAME;
Clique em Enviar.
gcloud
Para revogar todos os privilégios de uma função e, em seguida, eliminar a função, use o comando
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 eliminar quaisquer condições da IAM relacionadas, use o comando
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. Tem de ter o formatouser|group|serviceAccount:email
oudomain:domain
.CONDITION
é uma expressão de condição de IAM que especifica as funções a conceder 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'
A especificação da condição completa tem de corresponder exatamente à especificação da condição usada no comando que concedeu autorização, incluindo o título e a descrição.
Bibliotecas cliente
Estes exemplos de código criam e eliminam uma função de base de dados.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Mais informações
- Acerca do controlo de acesso detalhado
- Controlo de acesso detalhado para streams de alterações
- Privilégios de controlo de acesso detalhados
- Referência DDL do GoogleSQL
- Faça atualizações ao esquema