Capítulo 19. Autenticação de clientes

Sumário
19.1. O arquivo pg_hba.conf
19.2. Métodos de autenticação
19.2.1. Autenticação de confiança
19.2.2. Autenticação por senha
19.2.3. Autenticação Kerberos
19.2.4. Autenticação baseada no Ident
19.2.5. Autenticação PAM
19.3. Problemas de autenticação

Quando uma aplicação cliente se conecta ao servidor de banco de dados especifica o nome de usuário do PostgreSQL a ser usado na conexão, de forma semelhante à feita pelo usuário para acessar o sistema operacional Unix. Dentro do ambiente SQL, o nome de usuário do banco de dados determina os privilégios de acesso aos objetos do banco de dados — Para obter mais informações deve ser visto o Capítulo 17 . Portanto, é essencial controlar como os usuários de banco de dados podem se conectar.

A autenticação é o processo pelo qual o servidor de banco de dados estabelece a identidade do cliente e, por extensão, determina se a aplicação cliente (ou o usuário executando a aplicação cliente) tem permissão para se conectar com o nome de usuário que foi informado.

O PostgreSQL possui vários métodos diferentes para autenticação de clientes. O método utilizado para autenticar uma determinada conexão cliente pode ser selecionado tomando por base o endereço de hospedeiro (do cliente), o banco de dados ou o usuário.

Os nomes de usuário do PostgreSQL são logicamente distintos dos nomes de usuário do sistema operacional onde o servidor executa. Se todos os usuários de um determinado servidor de banco de dados também possuem conta no sistema operacional do servidor, é razoável atribuir nomes de usuário do banco de dados correspondendo aos nomes de usuário do sistema operacional. Entretanto, um servidor que aceita conexões remotas pode possuir muitos usuários de banco de dados que não possuem conta no sistema operacional local e, nestes casos, não há necessidade de haver associação entre os nomes de usuário do banco de dados e os nomes de usuário do sistema operacional.

19.1. O arquivo pg_hba.conf

A autenticação do cliente é controlada pelo arquivo que por tradição se chama pg_hba.conf e é armazenado no diretório de dados do agrupamento de bancos de dados como, por exemplo, /usr/local/pgsql/data/pg_hba.conf. [1] HBA significa autenticação baseada no hospedeiro (host-based authentication). É instalado um arquivo pg_hba.conf padrão quando o diretório de dados é inicializado pelo utilitário initdb.

O formato geral do arquivo pg_hba.conf é um conjunto de registros, sendo um por linha. As linhas em branco são ignoradas, da mesma forma que qualquer texto após o caractere de comentário #. Um registro é formado por vários campos separados por espaços ou tabulações. Os campos podem conter espaços em branco se o valor do campo estiver entre aspas. Os registros não podem ocupar mais de uma linha.

Cada registro especifica um tipo de conexão, uma faixa de endereços de IP de cliente (se for relevante para o tipo de conexão), um nome de banco de dados, um nome de usuário e o método de autenticação a ser utilizado nas conexões que correspondem a estes parâmetros. O primeiro registro com o tipo de conexão, endereço do cliente, banco de dados solicitado e nome de usuário que corresponder é utilizado para realizar a autenticação. Não existe fall-through (procura exaustiva) ou backup: se um registro for escolhido e a autenticação não for bem-sucedida, os próximos registros não serão levados em consideração. Se não houver correspondência com nenhum registro, então o acesso é negado.

O registro pode ter um dos sete formatos a seguir:

local     banco_de_dados usuário método_de_autenticação  [opção_de_autenticação]
host      banco_de_dados usuário endereço_de_IP máscara_de_IP método_de_autenticação [opção_de_autenticação]
hostssl   banco_de_dados usuário endereço_de_IP máscara_de_IP método_de_autenticação [opção_de_autenticação]
hostnossl banco_de_dados usuário endereço_de_IP máscara_de_IP método_de_autenticação [opção_de_autenticação]
host      banco_de_dados usuário endereço_de_IP/tamanho_da_máscara_de_IP método_de_autenticação  [opção_de_autenticação]
hostssl   banco_de_dados usuário endereço_de_IP/tamanho_da_máscara_de_IP método_de_autenticação  [opção_de_autenticação]
hostnossl banco_de_dados usuário endereço_de_IP/tamanho_da_máscara_de_IP método_de_autenticação  [opção_de_autenticação]

O significado de cada campo está descrito abaixo:

local
Este registro corresponde às tentativas de conexão feitas utilizando soquete do domínio Unix. Sem um registro deste tipo não são permitidas conexões através de soquete do domínio Unix.
host
Este registro corresponde às tentativas de conexão feitas utilizando o protocolo TCP/IP. Deve ser observado que as conexões TCP/IP não são permitidas a menos que o servidor seja inicializado com a opção -i, ou com o parâmetro de configuração tcpip_socket habilitado.
hostssl
Este registro corresponde às tentativas de conexão feitas utilizando SSL no TCP/IP. Os registros host correspondem tanto às tentativas de conexão SSL (Secure Socket Layer) quanto às não SSL, mas os registros hostssl requerem conexões SSL. Para esta opção poder ser utilizada o servidor deve ter sido construído com o suporte a SSL habilitado. Além disso, o SSL deve ser habilitado na inicialização do servidor pelo parâmetro de configuração ssl (veja a Seção 16.4 para obter mais informações).
hostnossl
Este registro é semelhante a hostssl, mas com uma lógica inversa: corresponde somente às tentativas de conexão regulares que não utilizam SSL.
banco_de_dados
Especifica quais bancos de dados este registro corresponde. O valor all especifica que corresponde a todos os bancos de dados. O valor sameuser especifica que o registro corresponde ao banco de dados com o mesmo nome do usuário fazendo o pedido de conexão. O valor samegroup especifica que o usuário deve ser membro do grupo com o mesmo nome do banco de dados do pedido de conexão. Senão, é o nome de um banco de dados específico do PostgreSQL. Podem ser fornecidos vários nomes de banco de dados separados por vírgula. Pode ser especificado um arquivo contendo nomes de banco de dados, precedendo o nome do arquivo por @. O arquivo deve estar no mesmo diretório de pg_hba.conf.
usuário
Especifica quais usuários do PostgreSQL este registro corresponde. O valor all especifica que corresponde a todos os usuários. Senão, é o nome de um usuário específico do PostgreSQL. Podem ser fornecidos vários nomes de usuário separados por vírgula. Podem ser especificados nomes de grupo precedendo o nome do grupo por +. Pode ser especificado um arquivo contendo nomes de usuário precedendo o nome do arquivo por @. O arquivo deve estar no mesmo diretório de pg_hba.conf.
endereço_de_IP
máscara_de_IP
Estes campos contêm endereços de IP e valores de máscara na notação padrão utilizando pontos (Os endereços de IP somente podem ser especificados numericamente, e não como nomes de domínios ou de hospedeiro). Tomados junto especificam os endereços de IP das máquinas que este registro corresponde. A lógica precisa é
(endereço_verdadeiro_de_IP XOR campo_de_endereço_de_IP) AND campo_de_máscara_de_IP
devendo ser igual a zero para o registro corresponder. Um endereço especificado no formato IPv4 corresponde às conexões IPv6 que possuem o endereço correspondente como, por exemplo, 127.0.0.1 corresponde ao endereço de IPv6 ::ffff:127.0.0.1. Uma entrada especificada no formato IPv6 corresponde apenas às conexões IPv6, mesmo que represente um endereço na faixa IPv4-em-IPv6. Deve ser observado que as entradas no formato IPv6 serão rejeitadas se a biblioteca C do sistema não possuir suporte a endereços IPv6. Estes campos somente se aplicam aos registros host, hostssl e hostnossl.
tamanho_da_máscara_de_IP
Este campo pode ser utilizado como uma alternativa para a notação de máscara_de_IP. É um valor inteiro especificando o número de bits de alta-ordem usados para definir a máscara. O número deve estar entre 0 e 32 (no caso de um endereço IPv4) ou 128 (no caso de um endereço IPv6), inclusive. Zero corresponde a qualquer endereço, enquanto 32 (ou 128, respectivamente) corresponde somente ao hospedeiro especificado. A mesma lógica de correspondência é utilizada para a notação com pontos máscara_de_IP. Não deve haver espaços em branco entre o endereço_de_IP e a /, nem entre a / e o tamanho_da_máscara_de_IP, ou o arquivo não será analisado corretamente. Este campo somente se aplica aos registros host, hostssl e hostnossl.
método_de_autenticação
Especifica o método de autenticação a ser utilizado para se conectar através deste registro. Abaixo está mostrado um resumo das escolhas possíveis; os detalhes podem ser encontrados na Seção 19.2 .
trust
A conexão é permitida incondicionalmente. Este método permite a qualquer um que possa se conectar ao servidor de banco de dados PostgreSQL se autenticar como o usuário do PostgreSQL que for desejado, sem necessidade de senha. Para obter detalhes deve ser vista a Seção 19.2.1 .
reject
A conexão é rejeitada incondicionalmente. É útil para "eliminar por filtragem" certos hospedeiros de um grupo.
md5
Requer que o cliente forneça uma senha criptografada pelo método md5 para autenticação. Este é o único método que permite o armazenamento de senhas criptografadas em pg_shadow. Para obter detalhes deve ser vista a Seção 19.2.2 .
crypt
Como o método md5, mas utiliza a antiga criptografia crypt(), sendo necessário para clientes pré-7.2. Deve ser preferido o md5 para os clientes 7.2 e posteriores. Para obter detalhes deve ser vista a Seção 19.2.2 .
password
O mesmo que md5, mas a senha é enviada em texto puro pela rede. Não deve ser utilizado em redes não confiáveis. Para obter detalhes deve ser vista a Seção 19.2.2 .
krb4
É utilizado Kerberos V4 para autenticar o usuário. Somente disponível para conexões TCP/IP. Para obter detalhes deve ser vista a Seção 19.2.3 .
krb5
É utilizado Kerberos V5 para autenticar o usuário. Somente disponível para conexões TCP/IP. Para obter detalhes deve ser vista a Seção 19.2.3 .
ident
Obtém o nome de usuário do sistema operacional do cliente (para conexões TCP/IP fazendo contato com o servidor de identificação no cliente, para conexões locais obtendo a partir do sistema operacional) e verifica se o usuário possui permissão para se conectar como o usuário de banco de dados solicitado consultando o mapa especificado após a palavra chave ident. Se for utilizado o mapa sameuser, é requerido que os nomes dos usuários sejam idênticos. Se não for, o nome do mapa é procurado no arquivo pg_ident.conf no mesmo diretório de pg_hba.conf. A conexão é aceita se este arquivo contiver uma entrada para este nome de mapa com o nome de usuário do sistema operacional e o nome de usuário do PostgreSQL solicitado. Para conexões locais somente funciona nas máquinas que suportam credenciais de soquete do domínio Unix (atualmente Linux, FreeBSD, NetBSD, OpenBSD e BSD/OS). Para obter detalhes deve ser vista a Seção 19.2.4 .
pam
Autenticação utilizando o serviço Pluggable Authentication Modules (PAM) fornecido pelo sistema operacional. Para obter detalhes deve ser vista a Seção 19.2.5 .

opção_de_autenticação
O significado deste campo opcional depende do método de autenticação escolhido, estando descrito na próxima seção.

Uma vez que os registros de pg_hba.conf são examinados seqüencialmente a cada tentativa de conexão, a ordem dos registros possui significado. Normalmente, os primeiros registros possuem parâmetros de correspondência de conexão mais exigentes e métodos de autenticação menos exigentes, enquanto os últimos registros possuem parâmetros de correspondência menos exigentes e métodos de autenticação mais exigentes. Por exemplo, pode-se desejar utilizar a autenticação trust para conexões TCP/IP locais, mas requerer o uso de senha para conexões TCP/IP remotas. Neste caso, o registro especificando a autenticação trust para conexões a partir de 127.0.0.1 deve aparecer antes do registro especificando autenticação por senha para uma faixa mais ampla de endereços de IP de cliente permitidos.

Importante: Não se deve impedir que o superusuário tenha acesso ao banco de dados template1. Vários comandos utilitários necessitam acessar o template1.

O arquivo pg_hba.conf é lido na inicialização e quando o processo servidor principal (postmaster) recebe um sinal SIGHUP. Se o arquivo for editado com o sistema ativo, será necessário enviar este sinal para o postmaster (utilizando pg_ctl reload ou kill -HUP) para fazer o arquivo ser lido novamente.

Um exemplo do arquivo pg_hba.conf está mostrado no Exemplo 19-1 . Para obter detalhes sobre os diferentes métodos de autenticação deve ser vista a próxima seção.

Exemplo 19-1. Exemplo de registros do arquivo pg_hba.conf

# Permitir qualquer usuário do sistema local se conectar a qualquer banco
# de dados sob qualquer nome de usuário utilizando os soquetes do domínio
# Unix (o padrão para conexões locais).
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
local   all         all                                             trust

# A mesma coisa utilizando conexões locais TCP/IP retornantes (loopback).
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    all         all         127.0.0.1         255.255.255.255   trust

# O mesmo que o exemplo anterior mas utilizando máscara CIDR.
#
# TYPE  DATABASE    USER        IP-ADDRESS/CIDR-mask  METHOD
host    all         all         127.0.0.1/32          trust

# Permitir qualquer usuário de qualquer hospedeiro com endereço de IP 192.168.93.x
# se conectar ao banco de dados "template1" com o mesmo nome de usuário que "ident"
# informa para a conexão (normalmente o nome de usuário do Unix).
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    template1   all         192.168.93.0      255.255.255.0     ident sameuser

# O mesmo que o exemplo anterior mas utilizando máscara CIDR.
#
# TYPE  DATABASE    USER        IP-ADDRESS/CIDR-mask  METHOD
host    template1   all         192.168.93.0/24       ident sameuser

# Permite o usuário do hospedeiro 192.168.12.10 se conectar ao banco de dados
# "template1" se a senha do usuário for fornecida corretamente.
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    template1   all         192.168.12.10     255.255.255.255   md5

# Na ausência das linhas "host" precedentes, estas duas linhas rejeitam todas
# as conexões oriundas de 192.168.54.1 (uma vez que esta entrada será
# correspondida primeiro), mas permite conexões Kerberos V de qualquer ponto
# da Internet. A máscara zero significa que não é considerado nenhum bit do
# endereço de IP do hospedeiro e, portanto, corresponde a qualquer hospedeiro.
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    all         all         192.168.54.1      255.255.255.255   reject
host    all         all         0.0.0.0           0.0.0.0           krb5

# Permite os usuários dos hospedeiros 192.168.x.x se conectarem a qualquer
# banco de dados se passarem na verificação de "ident". Se, por exemplo, "ident"
# informar que o usuário é "oliveira" e este requerer se conectar como o usuário
# do PostgreSQL "guest1", a conexão será permitida se houver uma entrada
# em pg_ident.conf para o mapa "omicron" informando que "oliveira" pode se
# conectar como "guest1".
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    all         all         192.168.0.0       255.255.0.0       ident omicron

# Se as linhas abaixo forem as únicas três linhas para conexão local, vão
# permitir os usuários locais se conectarem somente aos seus próprios bancos de
# dados (bancos de dados com o mesmo nome que seus nomes de usuário), exceto
# para os administradores e membros do grupo "suporte" que podem se conectar a
# todos os bancos de dados. O arquivo $PGDATA/admins contém a lista de nomes de
# usuários. A senha é requerida em todos os casos.
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
local   sameuser    all                                             md5
local   all         @admins                                         md5
local   all         +suporte                                        md5

# As duas últimas linhas acima podem ser combinadas em uma única linha:
local   all         @admins,+suporte                                md5

# A coluna banco de dados também pode utilizar listas e nomes de arquivos,
# mas não grupos:
local   db1,db2,@demodbs  all                                       md5

Notas

[1]

/var/lib/pgsql/data/pg_hba.conf no Fedora Core 3. (N. do T.)

SourceForge.net Logo