postgres postgresql usuario user role group

Papéis de usuários e grupos

Da mesma forma que um sistema operacional mantém um cadastro de usuários, grupos e respectivas permissões sobre seus objetos (arquivos, diretórios, processos…), o PostgreSQL também mantém um cadastro similar de usuários e grupos e permissões sobre seus objetos (tabelas, schemas, visões, bancos de dados…). Esses cadastros são independentes um do outro, mas em alguns pontos da autenticação o PostgreSQL pode usar informações do usuário do sistema operacional, por exemplo nas autenticações peer e ident.

O termo geral role (papel) engloba tanto user (usuário) quanto group (grupo). Mesmo esses dois são similares, com a única diferença sendo que um usuário é um grupo criado com permissão de LOGIN, enquanto que um grupo é um usuário criado sem a permissão de LOGIN.

Um papel pode ter permissões específicas associadas a ele, que controlam sua autorização em ações que são indepentendes de bancos de dados (como operações sobre objetos globais) e propriedades próprias do usuário (senha, login).

As permissões de papéis são:

Papéis/usuários podem fazer parte de papéis/grupos. Dessa forma, as permissões atribuídas ao papel/grupo estão disponíveis para todos os membros dele.

Prática

Criando um usuário

As três formas a seguir são válidas e produzem o mesmo resultado:

[[local]:5432] postgres@postgres=# CREATE USER alice;

Com CREATE ROLE, adicionando a permissão de LOGIN:

[[local]:5432] postgres@postgres=# CREATE ROLE alice LOGIN;

Com o sinônimo CREATE GROUP:

[[local]:5432] postgres@postgres=# CREATE GROUP alice LOGIN;

Criando um papel/grupo com permissão de superusuário

As três formas a seguir são válidas e produzem o mesmo resultado:

[[local]:5432] postgres@postgres=# CREATE ROLE dba SUPERUSER;

Com o sinônimo CREATE GROUP:

[[local]:5432] postgres@postgres=# CREATE GROUP dba SUPERUSER;

Com CREATE USER, removendo a permissão de LOGIN:

[[local]:5432] postgres@postgres=# CREATE USER dba NOLOGIN SUPERUSER;

Adicionando um usuário a um grupo

[[local]:5432] postgres@postgres=# GRANT dba TO alice;

Atribuindo outra permissão a um usuário

[[local]:5432] postgres@postgres=# ALTER USER alice BYPASSRLS;

Listando usuários, papéis e grupos

[[local]:5432] postgres@postgres=# \du
                                    List of roles
╔═══════════╤════════════════════════════════════════════════════════════╤═══════════╗
║ Role name │                         Attributes                         │ Member of ║
╠═══════════╪════════════════════════════════════════════════════════════╪═══════════╣
║ alice     │ Bypass RLS                                                 │ {dba}     ║
║ dba       │ Superuser, Cannot login                                    │ {}        ║
║ postgres  │ Superuser, Create role, Create DB, Replication, Bypass RLS │ {}        ║
╚═══════════╧════════════════════════════════════════════════════════════╧═══════════╝

[[local]:5432] postgres@postgres=#

Removendo um usuário de um grupo

[[local]:5432] postgres@postgres=# REVOKE dba FROM alice;

Alterando a senha do usuário

A forma recomendada de alterar senhas é através do metacomando \password, que não mostra a senha na tela e não guarda ela no histórico:

[[local]:5432] postgres@postgres=# \password alice
Enter new password:
Enter it again:
[[local]:5432] postgres@postgres=#

Também é possível alterar a senha com um ALTER USER ou CREATE USER, que não são recomendados pois a senha é apresentada na tela, fica registrada no histórico do psql e, possivelmente, também nos logs do servidor:

[[local]:5432] postgres@postgres=# ALTER USER bob PASSWORD 'segredo_indevidamente_visivel';

E:

[[local]:5432] postgres@postgres=# CREATE USER bob PASSWORD 'segredo_indevidamente_visivel';

Obs.: Existe uma cláusula ENCRYPTED PASSWORD, que é ignorada mas mantida por razões históricas. Toda senha é armazenada como um hash md5 (devidamente salgado) ou um hash scram-sha-256.

Removendo um usuário

[[local]:5432] postgres@postgres=# DROP USER alice;