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.
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:
(endereço_verdadeiro_de_IP XOR campo_de_endereço_de_IP) AND campo_de_máscara_de_IPdevendo 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.
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
.
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
[1] |
/var/lib/pgsql/data/pg_hba.conf no Fedora Core 3. (N. do T.) |