20.2. Mapas de nome de usuário #

Ao usar um sistema de autenticação externo, como Autenticação Ident ou Autenticação GSSAPI, o nome do usuário do sistema operacional que iniciou a conexão pode não ser o mesmo que o usuário do banco de dados (role) a ser usado. Neste caso, pode ser aplicado um mapa de nome de usuário para mapear o nome de usuário do sistema operacional para o usuário do banco de dados. Para usar o mapeamento de nome de usuário, deve ser especificado map=nome_do_mapa no campo de opções no arquivo pg_hba.conf. Esta opção possui suporte em todos os métodos de autenticação que aceitam nomes de usuário externo. Como podem ser necessários diferentes mapeamentos para diferentes conexões, o nome do mapa a ser usado é especificado no parâmetro nome_do_mapa no arquivo pg_hba.conf, para indicar qual mapa usar para cada conexão individualmente.

Os mapas de nome de usuário são definidos no arquivo de mapas, que por padrão se chama pg_ident.conf, sendo armazenado no diretório de dados da instância. (É possível colocar o arquivo de mapas em outro local; veja o parâmetro de configuração ident_file.) O arquivo de mapas contém linhas com os formatos gerais:

nome_do_mapa usuário_do_sistema usuário_do_banco_de_dados
include arquivo
include_if_exists arquivo
include_dir diretório

Comentários, espaços em branco e continuações de linha são tratados da mesma forma que no arquivo pg_hba.conf. O nome_do_mapa é um nome arbitrário, que será usado para se referir a este mapeamento no arquivo pg_hba.conf. Os outros dois campos especificam o nome de usuário do sistema operacional, e o nome de usuário do banco de dados correspondente. O mesmo nome_do_mapa pode ser usado várias vezes para especificar vários mapeamentos de usuários em um único mapa.

Da mesma forma que o arquivo pg_hba.conf, as linhas neste arquivo podem conter diretivas de inclusão, seguindo as mesmas regras.

O arquivo pg_ident.conf é lido na ativação e quando o processo principal do servidor recebe um sinal SIGHUP. Se o arquivo for editado em um sistema ativo, será necessário enviar um sinal para o postmaster (usando pg_ctl reload, chamando a função SQL pg_reload_conf(), ou usando kill -HUP) para que ele releia o arquivo.

A visão do sistema pg_ident_file_mappings pode ser útil para testar previamente alterações no arquivo pg_ident.conf, ou para diagnosticar problemas caso o carregamento do arquivo não tenha produzido os efeitos esperados. As linhas na visão com campos error não nulos indicam problemas nas linhas correspondentes do arquivo.

Não há restrição com relação a quantos usuários do banco de dados um determinado usuário do sistema operacional pode corresponder, nem vice-versa. Assim, as entradas no mapa devem ser consideradas significando este usuário do sistema operacional tem permissão para se conectar como este usuário do banco de dados, em vez de implicar que são equivalentes. A conexão será permitida havendo alguma entrada de mapa que pareie o nome de usuário obtido do sistema de autenticação externo com o nome de usuário do banco de dados que o usuário solicitou para se conectar. O valor all pode ser usado como usuário_do_banco_de_dados para especificar que se o usuário_do_sistema corresponder, então este usuário poderá se conectar como qualquer um dos usuários existentes no banco de dados. Colocar all entre aspas faz com que a palavra-chave perca seu significado especial.

Se o nome do usuário_do_banco_de_dados começar pelo caractere +, então o usuário do sistema operacional poderá se conectar como qualquer usuário pertencente a esta função de banco de dados, de forma semelhante a como os nomes de usuário que começam pelo caractere + são tratados no arquivo pg_hba.conf. Portanto, um caractere + inicial significa que corresponde a qualquer uma das funções de banco de dados que sejam direta ou indiretamente membros desta função de banco de dados, enquanto um nome sem o caractere + inicial corresponde apenas a esta função de banco de dados específica. Colocar um nome de usuário começado por + entre aspas faz com que o caractere + perca seu significado especial.

Se o campo usuário_do_sistema começar por uma barra (/), o restante do campo será tratado como uma expressão regular. (Veja Detalhes sobre expressões regulares para obter informações sobre a sintaxe de expressões regulares do PostgreSQL.) A expressão regular pode incluir uma única captura ou uma subexpressão entre parênteses. A parte do nome de usuário do sistema que correspondeu à captura pode então ser referenciada no campo usuário_do_banco_de_dados como \1 (contrabarra-um). Isto permite o mapeamento de vários nomes de usuário em uma única linha, o que é particularmente útil para substituições de sintaxe simples. Por exemplo, estas entradas

mymap   /^(.*)@mydomain\.com$      \1
mymap   /^(.*)@otherdomain\.com$   guest

vão remover a parte do domínio dos usuários com nomes de usuário do sistema que terminam com @mydomain.com, permitindo que qualquer usuário cujo nome do sistema termine com @otherdomain.com se conecte como guest. Colocar um nome de usuário_do_banco_de_dados contendo \1 entre aspas não faz com que \1 perca seu significado especial.

Se o campo usuário_do_banco_de_dados começar por uma barra (/), o restante do campo será tratado como uma expressão regular. Quando o campo usuário_do_banco_de_dados é uma expressão regular, não é possível usar \1 dentro dele para se referir a uma captura do campo usuário_do_sistema.

Dica

Lembre-se que, por padrão, uma expressão regular só pode corresponder a uma parte de uma cadeia de caracteres. Geralmente é aconselhável usar os caracteres ^ e $, como mostrado no exemplo acima, para forçar corresponder ao nome completo do usuário do sistema operacional.

Um arquivo pg_ident.conf que pode ser usado em conjunto com o arquivo pg_hba.conf no Exemplo 20.1 é mostrado no Exemplo 20.2. Neste exemplo, qualquer pessoa conectada a uma máquina na rede 192.168, que não tenha o nome de usuário do sistema operacional bryanh, ann ou robert, não terá o acesso concedido. O usuário do Unix robert só teria permissão de acesso quando tentasse se conectar como o usuário do PostgreSQL bob, e não como robert ou alguém mais. A ann só teria permissão para se conectar como ann. O usuário bryanh teria permissão para se conectar como bryanh ou como guest1.

Exemplo 20.2. Exemplo de arquivo pg_ident.conf

# MAPNAME       SYSTEM-USERNAME         DATABASE-USERNAME

omicron         bryanh                  bryanh
omicron         ann                     ann
# bob tem o nome de usuário robert nessas máquinas
omicron         robert                  bob
# bryanh também pode se conectar como guest1
omicron         bryanh                  guest1