Gerenciar usuários do PostgreSQL com autenticação integrada

Para controlar o acesso ao banco de dados com credenciais baseadas em senha, é possível criar, gerenciar e remover papéis, usuários e grupos do PostgreSQL e do AlloyDB para PostgreSQL usando a autenticação integrada.

Criar usuários do PostgreSQL no AlloyDB

Quando você cria usuários do PostgreSQL, eles começam apenas com o privilégio LOGIN. Para mais informações sobre esses privilégios, consulte CREATE USER.

É possível alterar os privilégios de qualquer usuário usando o comando ALTER ROLE. Se você criar um novo usuário com o cliente psql, será possível associá-lo a um papel diferente ou atribuir outros privilégios a ele.

Gerenciar usuários

É possível criar e gerenciar usuários do AlloyDB com a Google Cloud CLI ou usando comandos do PostgreSQL. As seções a seguir demonstram tarefas comuns de gerenciamento de usuários usando qualquer um dos métodos.

Antes de começar

Para usar comandos do PostgreSQL para gerenciar usuários em um cluster, você precisa do seguinte:

  • Acesso ao cliente do psql
  • Acesso ao usuário do banco de dados postgres ou a outra função do usuário com os privilégios de administrador adequados.

Para usar o console do Google Cloud ou a Google Cloud CLI para gerenciar usuários em um cluster, ele precisa ter uma instância principal. Se o cluster não tiver uma instância principal, crie uma antes de gerenciar os usuários.

Criar um usuário de banco de dados

Para criar um usuário de banco de dados que se autentica diretamente com o banco de dados usando um nome de usuário e uma senha, também conhecida como autenticação integrada, siga as etapas nesta seção.

Para criar um usuário de banco de dados que use o Identity and Access Management (IAM) para autenticação, consulte Gerenciar a autenticação do IAM.

Console

  1. Acesse a página Clusters.

    Acessar Clusters

  2. Clique no nome do cluster em que você quer adicionar um usuário.

  3. Clique em Usuários.

  4. Clique em Adicionar conta de usuário.

  5. Deixe a opção Autenticação integrada selecionada.

    Se você quiser usar o IAM para autenticar e fazer login nos clusters de banco de dados, conclua as etapas adicionais para preparar o projeto e conceder as permissões adequadas ao novo usuário. Para mais informações, consulte Gerenciar a autenticação do IAM.

  6. Digite um nome de usuário e uma senha para o novo usuário.

  7. Para atribuir papéis diferentes do alloydbsuperuser padrão ao usuário, siga estas etapas:

    1. Insira o nome do papel em Papéis.
    2. Para adicionar o papel, pressione Enter ou Tab.
    3. Selecione x para qualquer função que você queira remover do usuário.

      Para mais informações, consulte Papéis predefinidos.

  8. Clique em Adicionar.

psql

Execute a seguinte instrução CREATE USER:

CREATE USER USERNAME WITH PASSWORD 'PASSWORD';

Substitua:

  • USERNAME: o nome de usuário do banco de dados.

  • PASSWORD: a senha a ser atribuída ao usuário.

Para mais informações sobre como criar e definir usuários de banco de dados, consulte CREATE USER.

Depois de criar um usuário, é possível alterar os privilégios dele usando o comando ALTER ROLE no cliente psql.

gcloud

Use o seguinte comando gcloud alloydb users create:

gcloud alloydb users create USERNAME \
--password=PASSWORD \
--cluster=CLUSTER_ID \
--region=REGION_ID

Substitua:

  • USERNAME: o nome de usuário do banco de dados. USERNAME precisa seguir as regras para identificadores SQL: sem caracteres especiais ou entre aspas duplas. Por exemplo, db_user_1.

  • PASSWORD: a senha do usuário do banco de dados. Para criar o usuário sem uma senha, omita esse argumento.

  • CLUSTER_ID: o ID do cluster ao qual o usuário será adicionado.

  • REGION_ID: o ID da região em que o cluster está localizado. Por exemplo, us-central1.

Depois de criar um usuário, é possível alterar os privilégios dele usando o comando gcloud alloydb users set-roles.

Além disso, é possível conceder papéis ou privilégios de superusuário a um usuário durante a criação dele. Para isso, inclua os argumentos --db-roles ou --superuser, conforme descrito na seção a seguir.

Conceder papéis a um usuário do banco de dados

Console

Para conceder papéis a um usuário de banco de dados no console do Google Cloud , conecte-se ao banco de dados usando o AlloyDB Studio e execute a seguinte instrução GRANT:

GRANT ROLE TO USERNAME;

Substitua:

  • USERNAME: o nome de usuário do banco de dados.

  • ROLE: o papel a ser concedido ao usuário. Por exemplo, para conceder privilégios de superusuário ao usuário, atribua a ele o papel alloydbsuperuser.

psql

GRANT ROLE TO USERNAME;

Substitua:

  • USERNAME: o nome de usuário do banco de dados.

  • ROLE: o papel a ser concedido ao usuário. Por exemplo, para conceder ao usuário privilégios de superusuário, atribua a ele o papel alloydbsuperuser.

gcloud

Use o seguinte comando gcloud alloydb users set-roles para especificar todos os papéis que você quer que o usuário tenha:

gcloud alloydb users set-roles USERNAME \
--db-roles=ROLES \
--cluster=CLUSTER_ID \
--region=REGION_ID

Substitua:

  • USERNAME: o nome de usuário do banco de dados.

  • ROLES: uma lista separada por vírgulas de todos os papéis que você quer que o usuário tenha. Liste todos os papéis, incluindo os atuais e os novos.

    Para encontrar a lista de papéis atribuídos ao usuário, execute o seguinte comando:

    gcloud alloydb users list --cluster=CLUSTER_ID --region=REGION_ID

    Substitua:

    • CLUSTER_ID: o ID do cluster que contém o usuário.

    • REGION_ID: o ID da região em que o cluster está localizado. Por exemplo, us-central1.

    Para conceder privilégios de superusuário a um usuário, você pode conceder manualmente a ele o papel alloydbsuperuser usando psql ou executar o comando gcloud alloydb users set-superuser com o argumento --superuser=true:

    gcloud alloydb users set-superuser USERNAME \
    --superuser=true \
    --cluster=CLUSTER_ID \
    --region=REGION_ID

    Substitua:

    • USERNAME: o nome de usuário do banco de dados.

    • CLUSTER_ID: o ID do cluster que contém o usuário.

    • REGION_ID: o ID da região em que o cluster está localizado. Por exemplo, us-central1.

Mudar a senha de um usuário do banco de dados

Para definir uma nova senha para um usuário padrão do banco de dados PostgreSQL, siga as etapas nesta seção.

Não é possível alterar ou definir a senha de um usuário baseado no IAM porque os usuários do IAM não usam senhas para autenticação. Para mais informações, consulte Conectar usando uma conta do IAM.

Console

  1. Acesse a página Clusters.

    Acessar Clusters

  2. Clique no nome do cluster que contém o usuário do banco de dados.

  3. Clique em Usuários.

  4. Na linha que representa o usuário, clique em Abrir ações para este usuário.

  5. Selecione Alterar senha.

  6. Especifique uma senha:

    • Para definir uma nova senha para esse usuário, digite-a no campo Senha.

    • Para não definir uma senha para esse usuário, marque a caixa de seleção Sem senha.

  7. Clique em OK.

psql

ALTER USER USERNAME WITH PASSWORD 'PASSWORD';

Para mais informações sobre como mudar a senha de um usuário, consulte ALTER ROLE.

gcloud

Use o seguinte comando gcloud alloydb users set-password:

gcloud alloydb users set-password USERNAME \
--password=PASSWORD \
--cluster=CLUSTER_ID \
--region=REGION_ID

Substitua:

  • USERNAME: o nome de usuário do banco de dados.

  • PASSWORD: a nova senha a ser atribuída ao usuário.

  • CLUSTER_ID: o ID do cluster a que o usuário pertence.

  • REGION_ID: o ID da região em que o cluster está localizado. Por exemplo, us-central1.

Revogar um papel de um usuário do banco de dados

Console

Para revogar papéis de um usuário no console do Google Cloud , conecte-se ao banco de dados usando o AlloyDB Studio e execute a seguinte instrução REVOKE:

REVOKE ROLE FROM USERNAME;

Substitua:

  • ROLE: o papel a ser revogado do usuário. Para remover os privilégios de superusuário de um usuário, revogue o papel alloydbsuperuser dele.

  • USERNAME: o nome de usuário do banco de dados.

psql

É possível revogar privilégios concedidos anteriormente de um ou mais papéis ou revogar a associação de um usuário em um papel, conforme mostrado:

REVOKE ROLE FROM USERNAME;

Para remover os privilégios de superusuário de um usuário, revogue o papel alloydbsuperuser dele.

gcloud

Para revogar um papel com a Google Cloud CLI, use o seguinte comando gcloud alloydb users set-roles para especificar todos os papéis que você quer que o usuário tenha e omitir os papéis que serão revogados do usuário:

gcloud alloydb users set-roles USERNAME \
--db-roles=ROLES \
--cluster=CLUSTER_ID \
--region=REGION_ID

Substitua:

  • USERNAME: o nome de usuário do banco de dados.

  • ROLES: uma lista separada por vírgulas de todos os papéis que você quer que o usuário tenha. Liste todos os papéis, incluindo os atuais e os novos.

    Para encontrar a lista de papéis atribuídos ao usuário, execute o seguinte comando:

    gcloud alloydb users list --cluster=CLUSTER_ID --region=REGION_ID
  • CLUSTER_ID: o ID do cluster que contém o usuário.

  • REGION_ID: o ID da região em que o cluster está localizado. Por exemplo, us-central1.

Para revogar os privilégios de superusuário, remova manualmente o papel alloydbsuperuser de um usuário usando psql ou execute o comando gcloud alloydb users set-superuser com o argumento --superuser=false.

Ver uma lista de usuários do banco de dados

Console

  1. Acesse a página Clusters.

    Acessar Clusters

  2. Clique no nome do cluster com os usuários que você quer ver.

  3. Clique em Usuários.

psql

Use o seguinte comando \du para imprimir uma tabela de todos os usuários do banco de dados, que inclui as associações de grupo:

\du

gcloud

Use o seguinte comando gcloud alloydb users list:

gcloud alloydb users list \
--cluster=CLUSTER_ID \
--region=REGION_ID

Substitua:

  • CLUSTER_ID: o ID do cluster que contém os usuários.

  • REGION_ID: o ID da região em que o cluster está localizado. Por exemplo, us-central1.

Remover dependências do usuário

Antes de excluir um usuário do banco de dados, é necessário remover todos os objetos do banco de dados que pertencem a ele e revogar todos os privilégios concedidos a ele. Caso contrário, a tentativa de exclusão falhará com um erro (por exemplo, ERROR: role "username" cannot be dropped because some objects depend on it).

Para identificar e remover essas dependências, conecte-se ao banco de dados usando o cliente psql como o usuário postgres ou qualquer conta com o papel alloydbsuperuser e execute as seguintes etapas para cada banco de dados no cluster:

  1. Execute a consulta a seguir para listar os objetos, como tabelas, visualizações, esquemas e bancos de dados, que pertencem ao usuário que você quer excluir:

    SELECT
        n.nspname AS schema_name,
        c.relname AS object_name,
        CASE c.relkind
          WHEN 'r' THEN 'table'
          WHEN 'v' THEN 'view'
          WHEN 'm' THEN 'materialized view'
          WHEN 'i' THEN 'index'
          WHEN 'S' THEN 'sequence'
          WHEN 't' THEN 'TOAST table'
          WHEN 'f' THEN 'foreign table'
          WHEN 'p' THEN 'partitioned table'
          WHEN 'I' THEN 'partitioned index'
        END as object_type
    FROM pg_catalog.pg_class c
    JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE pg_catalog.pg_get_userbyid(c.relowner) = 'USERNAME'
      AND n.nspname NOT IN ('pg_catalog', 'information_schema')
      AND n.nspname !~ '^pg_toast';
    

    Substitua USERNAME pelo nome do usuário que você quer excluir.

  2. Para os objetos identificados, é necessário mudar a propriedade de cada um.

    • Para mudar o proprietário de uma tabela ou visualização:

      ALTER TABLE SCHEMA_NAME.OBJECT_NAME OWNER TO NEW_OWNER;
      

      Substitua:

      • SCHEMA_NAME: o nome do esquema que contém a tabela ou visualização.

      • OBJECT_NAME: o nome da tabela ou visualização.

      • NEW_OWNER: o nome de usuário da pessoa que você quer que seja proprietária.

    • Para mudar o proprietário de um banco de dados:

      ALTER DATABASE DATABASE_NAME OWNER TO NEW_OWNER;
      

      Substitua:

      • DATABASE_NAME: o nome do banco de dados.

      • NEW_OWNER: o nome de usuário da pessoa que você quer que seja proprietária.

  3. Identificar e revogar privilégios. O usuário também pode ter privilégios concedidos em outros objetos ou associações de papéis que impedem a exclusão.

    • Para listar as associações de função do usuário:

      WITH RECURSIVE cte AS (
      SELECT oid ,oid as member_of,1 as d,''::name as path FROM pg_roles r where r.rolname !~ '^pg_'
          UNION
          SELECT m.roleid,m.member as member_of ,d+1,path||'->'||pg_get_userbyid(cte.oid) as path
          FROM cte
          JOIN pg_auth_members m ON m.member = cte.oid where d<15
      )
      SELECT
      DISTINCT pg_get_userbyid(member_of)::varchar AS username,
      pg_get_userbyid(oid)::varchar as parent_role,
      d::int as depth, substr(path::text||'->'||pg_get_userbyid(oid),3) as path
      FROM cte
      WHERE d > 1
      ORDER BY depth;
      
    • Para revogar a associação de papel:

      REVOKE ROLE_NAME FROM USERNAME;
      

      Substitua:

      • ROLE_NAME: a associação ao papel que você quer revogar.

      • USERNAME: o nome do usuário que tem a associação de papel que você quer revogar.

    • Para revogar privilégios em uma tabela:

      1. Conceda o papel de proprietário da tabela ao usuário executor:

        GRANT TABLE_OWNER TO EXECUTOR_USER;
        

        Substitua:

        • TABLE_OWNER: o nome de usuário ou papel que é proprietário da tabela.

        • EXECUTOR_USER: o nome do usuário que está executando, por exemplo, postgres.

      2. Revogue os privilégios na tabela:

        REVOKE ALL PRIVILEGES ON TABLE SCHEMA_NAME.TABLE_NAME FROM USERNAME;
        

        Substitua:

        • SCHEMA_NAME: o nome do esquema que contém a tabela.

        • TABLE_NAME: o nome da tabela.

        • USERNAME: o nome do usuário de quem você quer revogar os privilégios.

Excluir um usuário do banco de dados

Antes de excluir um usuário, é preciso descartar ou reatribuir todos os objetos que pertencem a ele e revogar todos os privilégios concedidos ao usuário em outros objetos. Veja mais detalhes em Remover dependências do usuário.

Console

  1. Acesse a página Clusters.

    Acessar Clusters

  2. Clique no nome do cluster que contém o usuário.

  3. Clique em Usuários.

  4. Na linha que representa o usuário, clique em Abrir ações para este usuário.

  5. Selecione Remover.

  6. Na caixa de diálogo Remover conta de usuário?, clique em Remover.

psql

Use o seguinte:

DROP ROLE USERNAME;

gcloud

Use o seguinte comando gcloud alloydb users delete:

gcloud alloydb users delete USERNAME \
--cluster=CLUSTER_ID \
--region=REGION_ID

Substitua:

  • USERNAME: o nome de usuário do banco de dados.

  • CLUSTER_ID: o ID do cluster a que o usuário pertence.

  • REGION_ID: o ID da região em que o cluster está localizado. Por exemplo, us-central1.

A seguir