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_mapausuário_do_sistemausuário_do_banco_de_dadosincludearquivoinclude_if_existsarquivoinclude_dirdiretó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.
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