21.2. Atributos de função de banco de dados #

Uma função de banco de dados pode ter vários atributos que definem seus privilégios, e interagem com o sistema de autenticação de cliente.

privilégio de conexão

Apenas as funções de banco de dados que possuem o atributo LOGIN definido podem ser usadas como o nome da função de banco de dados para estabelecer a conexão inicial com o servidor de banco de dados. Uma função de banco de dados com o atributo LOGIN definido pode ser considerada igual a um usuário do banco de dados. Para criar uma função de banco de dados com privilégio de conexão, podem ser usados os comandos:

CREATE ROLE nome LOGIN;
CREATE USER nome;

(O comando CREATE USER é equivalente ao comando CREATE ROLE, exceto pelo comando CREATE USER incluir LOGIN por padrão, enquanto o comando CREATE ROLE não inclui.)

status de superusuário

Um superusuário do banco de dados ignora todas as verificações de permissão, exceto o direito de se conectar. É um privilégio perigoso, não devendo ser usado descuidadamente; é melhor fazer a maior parte do trabalho como uma função de banco de dados que não seja superusuário. Para criar um novo superusuário de banco de dados, é usado o comando CREATE ROLE nome SUPERUSER. Deve ser executado por uma função de banco de dados que já é um superusuário.

criação de banco de dados

A função de banco de dados deve receber permissão explícita para criar bancos de dados (exceto para os superusuários, já que ignoram todas as verificações de permissão). Para criar uma função de banco de dados assim, é usado o comando CREATE ROLE nome CREATEDB.

criação de função de banco de dados (role)

Uma função de banco de dados deve receber permissão explícita para criar outras funções de banco de dados (exceto para os superusuários, já que ignoram todas as verificações de permissão). Para criar uma função de banco de dados com esta permissão, é usado o comando CREATE ROLE nome CREATEROLE. Uma função de banco de dados com o atributo CREATEROLE pode alterar e remover funções de banco de dados que possuam o atributo CREATEROLE com a opção ADMIN. Este privilégio ocorre automaticamente quando um usuário com o atributo CREATEROLE — que não seja um superusuário — cria uma nova função de banco de dados; assim, por padrão, um usuário com o atributo CREATEROLE pode alterar e remover os privilégios das funções de banco de dados que ele mesmo criou. Alterar uma função de banco de dados inclui a maioria das alterações que podem ser feitas usando o comando ALTER ROLE, incluindo, por exemplo, a alteração de senhas. Também inclui modificações em uma função de banco de dados que podem ser feitas usando os comandos COMMENT e SECURITY LABEL.

Entretanto, o atributo CREATEROLE não confere a capacidade de criar funções de banco de dados com o atributo SUPERUSER, nem confere qualquer poder sobre as funções de banco de dados com o atributo SUPERUSER já existentes. Além disso, o atributo CREATEROLE não confere o poder de criar usuários com o atributo REPLICATION, nem a capacidade de conceder ou revogar o atributo REPLICATION, nem a capacidade de modificar as propriedades de função de banco de dados de tais usuários. Entretanto, permite executar ALTER ROLE ... SET e ALTER ROLE ... RENAME em funções de banco de dados de REPLICATION, assim como executar COMMENT ON ROLE, SECURITY LABEL ON ROLE e DROP ROLE. Por fim, CREATEROLE não confere a capacidade de conceder ou revogar o atributo BYPASSRLS.

iniciar replicação

A função de banco de dados deve receber permissão explícita para iniciar replicação por fluxo (exceto para os superusuários, já que ignoram todas as verificações de permissão). Uma função de banco de dados usada para replicação por fluxo também deve ter a permissão de LOGIN. Para criar uma função de banco de dados assim, é usado o comando CREATE ROLE nome REPLICATION LOGIN.

senha

A senha só terá significado se o método de autenticação de cliente exigir que o usuário forneça uma senha para se conectar com o servidor de banco de dados. Os métodos de autenticação password e md5 usam senha. As senhas do banco de dados são distintas das senhas do sistema operacional. A senha é especificada na criação da função de banco de dados usando CREATE ROLE nome PASSWORD 'cadeia_de_caracteres'. (Veja Autenticação por senha.)

herança de privilégios

Por padrão, uma função de banco de dados herda os privilégios das funções de banco de dados das quais é membro. Entretanto, para criar uma função de banco de dados que não herde os privilégios por padrão, deve ser usado CREATE ROLE nome NOINHERIT. Como alternativa, o privilégio de herdar pode ser sobreposto para concessões individuais usando WITH INHERIT TRUE ou WITH INHERIT FALSE.

ignorar a segurança no nível de linha

Uma função deve receber permissão explícita para ignorar todas as políticas de segurança no nível de linha (RLS) (exceto para superusuários, uma vez que eles ignoram todas as verificações de permissão). Para criar uma função de banco de dados assim, é usado o comando CREATE ROLE nome BYPASSRLS como superusuário.

limite de conexões

O limite de conexões pode especificar quantas conexões simultâneas uma função de banco de dados pode estabelecer. -1 (o padrão) significa sem limite. Deve-se especificar o limite de conexões ao criar a função de banco de dados com CREATE ROLE nome CONNECTION LIMIT 'inteiro'.

Os atributos da função de banco de dados podem ser modificados após a criação usando o comando ALTER ROLE. Veja as páginas de referência dos comandos CREATE ROLE e ALTER ROLE para obter detalhes.

Uma função de banco de dados também pode configurar suas opções padrão para muitos dos parâmetros de configuração descritos em Configuração do servidor. Por exemplo, se por algum motivo se quiser desativar as varreduras de índice (dica: não é uma boa ideia) sempre que se conectar, pode-se usar:

ALTER ROLE meu_nome SET enable_indexscan TO off;

Este comando irá salvar a configuração (mas não irá defini-la imediatamente). Nas próximas conexões realizadas por esta função de banco de dados, vai parecer como se SET enable_indexscan TO off tivesse sido executado logo antes do início da sessão. Ainda será possível alterar esta configuração durante a sessão; será apenas a configuração padrão. Para restabelecer uma determinada definição padrão da função de banco de dados, é usado o comando ALTER ROLE nome RESET parâmetro_de_configuração. Note-se que os valores predefinidos específicos da função de banco de dados, atribuídos às funções de banco de dados sem o atributo LOGIN, são bem inúteis, porque nunca serão usados.

Quando um usuário sem privilégios de superusuário cria uma função de banco de dados usando o atributo CREATEROLE, a função de banco de dados criada é automaticamente concedida de volta ao usuário que a criou, exatamente como se o superusuário de ativação do servidor (bootstrap superuser) tivesse executado o comando GRANT usuário_criado TO usuário_criador WITH ADMIN TRUE, SET FALSE, INHERIT FALSE. Como um usuário com o atributo CREATEROLE só pode exercer privilégios especiais sobre uma função de banco de dados existente se possuir o privilégio ADMIN OPTION sobre ela, esta permissão é suficiente apenas para permitir que um usuário com o atributo CREATEROLE administre as funções de banco de dados que ele mesmo criou. Entretanto, como foi criado com INHERIT FALSE, SET FALSE, o usuário com CREATEROLE não herda os privilégios da função de banco de dados criada, nem pode acessar os privilégios dessa função de banco de dados usando SET ROLE. Entretanto, como qualquer usuário que tenha a opção ADMIN OPTION em uma função de banco de dados pode conceder a participação nesta função de banco de dados a qualquer outro usuário, o usuário com CREATEROLE pode obter acesso à função de banco de dados criada simplesmente concedendo esta função de banco de dados a si mesmo com as opções INHERIT e/ou SET. Assim, o fato de que privilégios não são herdados por padrão, nem SET ROLE é concedido por padrão, constitui uma salvaguarda contra acidentes, e não um recurso de segurança. Note-se também que, como esta concessão automática é realizada pelo superusuário de ativação do servidor, ela não pode ser removida ou alterada pelo usuário com CREATEROLE; entretanto, qualquer superusuário poderia revogá-la, modificá-la e/ou conceder permissões adicionais desse tipo a outros usuários com o atributo CREATEROLE. Quaisquer usuários com CREATEROLE que possuam ADMIN OPTION sobre uma função de banco de dados em um determinado momento podem administrá-la.