Configure um controle de acesso refinado

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Nesta página, explicamos como configurar o controle de acesso refinado para os bancos de dados do Cloud Spanner.

Para saber mais sobre controle de acesso refinado, consulte Sobre controle de acesso refinado.

A configuração de um controle de acesso refinado envolve as seguintes etapas:

  1. Criar funções de banco de dados e conceder privilégios.

  2. Opcional: criar uma hierarquia de papéis com herança.

  3. Conceda acesso aos papéis do banco de dados aos participantes do IAM.

Depois de configurar os papéis do banco de dados, um usuário de controle de acesso refinado precisa selecionar um papel para executar consultas, DML ou operações de linha no banco de dados.

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 refinados. É possível criar até 100 papéis de cada banco de dados.

Escolha 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, recomendamos que você emita as alterações de esquema 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 refinados a ele, siga estas etapas:

  1. Acesse a página Instâncias no Console do Google Cloud.

    Instâncias

  2. Selecione a instância que contém o banco de dados ao qual você quer adicionar o papel.

  3. Selecione o banco de dados.

  4. Na página Visão geral, clique em Gravar DDL.

  5. Na página Gravar instruções DDL, para cada papel de banco de dados em que você quer criar e conceder privilégios, siga estas etapas:

    1. Para criar o papel, insira a seguinte instrução:

      CREATE ROLE ROLE_NAME;
      

    2. Para conceder privilégios ao papel, digite a seguinte instrução:

      GRANT PRIVILEGE_LIST ON TABLE TABLE_LIST TO ROLE ROLE_NAME;
      

      • PRIVILEGE_LIST é uma lista de privilégios separados por vírgula. Os privilégios permitidos são SELECT, INSERT, UPDATE e DELETE. DELETE é permitido apenas no nível da tabela.

      • TABLE_LIST é 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_manager, insira a seguinte instrução:

      GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;
      

      Você pode conceder privilégios a uma lista de papéis em vez de apenas um deles.

      É possível conceder cada privilégio em um subconjunto de colunas da tabela. Para ver exemplos, consulte Privilégios de controle de acesso refinado. Veja a sintaxe detalhada da instrução GRANT em Linguagem de definição de dados do SQL padrão do Google.

      É possível usar um modelo DDL para a instrução GRANT. No menu suspenso MODELOS DDL, selecione Papéis de banco de dados e, em Conceder privilégios de papel, selecione um modelo.

  6. Clique em Enviar.

    Se houver erros na sua DDL, o console do Google Cloud retornará um erro.

gcloud

Para criar um papel de banco de dados e conceder privilégios de acesso refinados a ele, use o comando gcloud spanner databases ddl update da seguinte maneira:

gcloud spanner databases ddl update DATABASE_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 detalhado. Os privilégios permitidos são SELECT, INSERT, UPDATE e DELETE.

  • 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_manager, insira a seguinte instrução:

GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;

Você pode conceder privilégios a uma lista de papéis em vez de apenas um deles.

É possível conceder cada privilégio em um subconjunto de colunas da tabela. Para ver exemplos, consulte Privilégios de controle de acesso refinado. Veja a sintaxe detalhada da instrução GRANT em Linguagem de definição de dados do SQL padrão do Google.

Criar uma hierarquia de papéis com herança

Crie 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 membro) herdam os privilégios da família.

Para conceder um papel de banco de dados a outro de banco de dados, use a seguinte instrução:

GRANT ROLE role1 TO ROLE role2;

Para saber mais, consulte Hierarquias e funções de banco de dados do banco de dados.

Conceder acesso aos papéis do banco de dados para os participantes 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 a um principal, siga estas etapas:

  1. 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.

  2. Clique em ADICIONAR PRINCIPAL.

  3. No painel Adicionar principais e papéis, em Novos principais, especifique um ou mais principais do IAM.

  4. No menu Papel, selecione Cloud Spanner > Usuário de acesso refinado do Cloud Spanner.

    Você só precisa conceder esse papel uma vez a cada principal. Isso faz do principal um usuário de controle de acesso refinado.

  5. Clique em ADICIONAR OUTRO PAPEL.

  6. No menu Selecionar papel, escolha Cloud Spanner > Usuário de papel do banco de dados do Cloud Spanner.

  7. Siga estas etapas para criar a condição do IAM que especifica os papéis a serem concedidos.

    1. Clique em ADICIONAR CONDIÇÃO.

    2. No painel Editar condição, insira um título e uma descrição para a condição.

      Se você estiver concedendo um único papel de banco de dados, normalmente incluiria 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.

    3. Clique em EDITOR DE CONDIÇÕES.

    4. No campo Expressão, digite este código:

      resource.type == "spanner.googleapis.com/DatabaseRole" &&
      resource.name.endsWith("/ROLE")
      

      Substitua ROLE pelo nome do seu papel.

      Ou, para conceder acesso a mais de um papel, adicione mais condições com o operador ou (||), 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 e ROLE2 pelos nomes dos seus papéis. Para conceder mais de dois papéis, adicione mais ou condições.

      Use qualquer expressão de condição que seja compatível com o IAM. Para mais informações, consulte Visão geral das condições do IAM.

    5. Clique em Save.

    6. No painel Adicionar participantes, verifique se a condição aparece na coluna Condição ao lado do campo Papel.

    7. Clique em Save.

      De volta ao Painel de informações, em Papel/Principal, observe que Usuário de papéis 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 recebem o papel do banco de dados por essa condição.

    8. Para corrigir erros em nomes ou condições de papéis do banco de dados ou para adicionar outros papéis de banco de dados para um principal, siga estas etapas:

      1. Expanda a entrada Usuário do papel do banco de dados do Cloud Spanner que corresponde à condição que você quer.

      2. Na página Editar permissões, siga um destes procedimentos:

        • Clique em ADICIONAR OUTRO PAPEL.

        • Para editar a condição, clique no ícone de lápis ao lado do nome dela. Em seguida, na página Editar condição, clique em EDITOR DE CONDIÇÃO e faça as correções.

gcloud

Para conceder acesso aos papéis do banco de dados a um principal do IAM, siga estas etapas:

  1. 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
    
    • MEMBER_NAME é o identificador do principal. Ele precisa estar no formato user|group|serviceAccount:email ou domain:domain.

    • Esse comando torna o principal um usuário de controle de acesso refinado. Envie esse comando apenas uma vez para cada principal.

  2. 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. Ele precisa estar no formato user|group|serviceAccount:email ou domain:domain.

    • CONDITION é uma expressão de condição do IAM que especifica os papéis que serão 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'
      

      Esse código concede dois papéis. Substitua ROLE1 e ROLE2 pelos nomes dos seus papéis. Para conceder apenas um papel de banco de dados, exclua a expressão após o operador ||. Para conceder mais de dois papéis, adicione mais condições ou com o operador ||.

      Use qualquer expressão de condição que seja compatível com o IAM. Para mais informações, consulte Visão geral das condições do IAM.

    O exemplo a seguir concede os papéis de banco de dados hr_rep e hr_manager ao principal jsmith@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'
    

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 o controle de acesso refinado, siga estas etapas:

  1. Ative o controle de acesso refinado para o principal e conceda acesso a todos os papéis do banco de dados necessários, conforme descrito em Conceder acesso aos papéis do banco de dados aos principais do IAM.

  2. Atualize todos os aplicativos executados como principal. Especifique os papéis apropriados do banco de dados nas chamadas para métodos de biblioteca de cliente.

  3. Revogar todos os papéis de participante do IAM no nível do banco de dados. Dessa forma, o acesso ao principal é regido por apenas um método.

    Console

    gcloud

    • Para revogar um papel no nível do banco de dados do IAM, insira o seguinte comando:

      gcloud spanner databases remove-iam-policy-binding DATABASE_NAME \
      --instance=INSTANCE_NAME \
      --role=roles/IAM_ROLE_NAME \
      --member=MEMBER_NAME
      
      • MEMBER_NAME é o identificador do principal. Ele precisa estar no formato user|group|serviceAccount:email ou domain:domain.

Listar papéis de banco de dados

Para listar os papéis do banco de dados usando o console do Google Cloud, insira a consulta a seguir na página Consulta do banco de dados:

  SELECT * FROM INFORMATION_SCHEMA.ROLES;

Ver os privilégios concedidos a uma função de banco de dados

Para ver os privilégios concedidos a uma função em todas as tabelas, use esta consulta:

  SELECT * FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE grantee = ROLE_NAME;
  

Para ver os privilégios concedidos a uma função em todas as colunas, use a seguinte consulta:

  SELECT * FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE grantee = ROLE_NAME;
  

Remover um papel do banco de dados

Descartar um papel de banco de dados revoga automaticamente a associação de outros papéis do papel, e revoga a associação de papéis em outros papéis.

Primeiro, é necessário revogar todos os privilégios de um papel de banco de dados antes de deixá-lo de lado. É possível soltar um papel de banco de dados, mesmo que os principais tenham permissões nele.

Antes de remover um papel de banco de dados, remova todas as vinculações de política do IAM que se referem a esse papel. Assim, um papel de banco de dados criado com o mesmo nome não herda essas vinculações.

Console

Para cancelar um papel de banco de dados, siga estas etapas:

  1. Na página Visão geral do banco de dados, clique em Gravar DDL.

  2. Para revogar privilégios da função, digite a seguinte instrução:

    REVOKE PRIVILEGE_LIST ON TABLE TABLE_LIST FROM ROLE ROLE_NAME;
    

    • PRIVILEGE_LIST é uma lista de privilégios separados por vírgula. Os privilégios permitidos são SELECT, INSERT, UPDATE e DELETE.

    • TABLE_LIST é uma lista de tabelas delimitada por vírgulas.

    Por exemplo, para revogar SELECT, INSERT e UPDATE nas tabelas employees e contractors do papel de banco de dados hr_manager, insira a seguinte instrução:

    REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM ROLE hr_manager;
    
  3. Para descartar o papel, insira a seguinte instrução:

    DROP ROLE ROLE_NAME;
    

  4. Para aplicar as atualizações, clique em Enviar.

  5. Excluir qualquer condição do IAM associada ao papel.

    1. Na lista de papéis no Painel de informações, localize o papel Usuário de papéis do banco de dados do Cloud Spanner que tenha o título da condição de interesse adjacente e, em seguida, expanda o papel para visualizar os principais que têm acesso a ele.

    2. Para uma das principais, clique no ícone Editar principal (lápis).

    3. Na página Editar permissões, clique no ícone Editar condição do IAM (lápis) ao lado da condição.

    4. Na página Editar condição, clique em EXCLUIR.

    5. Confirme a exclusão e clique em Salvar.

gcloud

  1. Para revogar todos os privilégios de um papel e 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ão SELECT, INSERT, UPDATE e DELETE.

  2. Para excluir condições de 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 formato user|group|serviceAccount:email ou domain:domain.

    • CONDITION é uma expressão de condição do IAM que especifica os papéis que serão 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 usada no comando que concedeu permissão, incluindo o título e a descrição.

Mais informações