Pular para conteúdo

Diagnóstico de erro "no pg_hba.conf entry" causado por método de autenticação inválido no PostgreSQL

Informação Valor
Tipo Estudo de Caso
Categoria PostgreSQL / Autenticação
Nível Intermediário
Ambiente PostgreSQL 16 / Debian
Data 2025-07-21

Objetivo

Documentar o processo de investigação de um erro de autenticação no PostgreSQL onde conexões remotas eram recusadas com a mensagem:

FATAL: no pg_hba.conf entry for host "...", user "...", database "...".

Embora inicialmente o problema indicasse falta de configuração de rede e usuario no pg_hba.conf, a investigação demonstrou que a causa raiz era um erro de sintaxe em duas linhas não relacionadas do próprio arquivo.

Este estudo apresenta as hipóteses levantadas, os testes realizados, as evidências coletadas e a solução definitiva.


Ambiente

Item Valor
Sistema Operacional Debian
PostgreSQL 16
Autenticação MD5
Cliente psql
Tipo de acesso TCP/IP

Sintoma

Toda tentativa de conexão remota retornava:

FATAL: no pg_hba.conf entry for host "...",
user "...",
database "...",
SSL encryption

FATAL: no pg_hba.conf entry for host "...",
user "...",
database "...",
no encryption

O erro ocorria para diversos usuários de banco, indicando que não estava relacionado apenas a um único usuário.


Primeira hipótese

A hipótese inicial foi de que a rede cliente não estivesse autorizada no pg_hba.conf.

Foi adicionada uma regra semelhante a:

host    all    usuario_aplicacao    198.51.100.0/24    md5

Após a alteração foi executado:

SELECT pg_reload_conf();

O retorno foi:

t

Mesmo assim as conexões continuavam falhando.


Verificação da regra carregada

Para confirmar que o PostgreSQL interpretava corretamente a regra adicionada foi utilizada a visão:

SELECT
    line_number,
    type,
    database,
    user_name,
    address,
    netmask,
    auth_method,
    error
FROM pg_hba_file_rules
WHERE user_name @> ARRAY['usuario_aplicacao'];

Resultado:

line_number | type | database | address | netmask
------------+------+----------+---------+--------------
100         | host | {all}    | 198.51.100.0 | 255.255.255.0

Isso comprovava que a regra estava correta.

Mesmo assim a autenticação continuava falhando.


Segunda hipótese

Como a regra parecia correta, iniciou-se a validação do ambiente.

Foram verificadas:

  • endereço IP do cliente;
  • rede configurada;
  • usuário;
  • banco;
  • senha;
  • método de autenticação;
  • recarga das configurações;
  • cluster PostgreSQL utilizado;
  • processo ativo;
  • diretório de dados;
  • arquivo de configuração.

Confirmação do ambiente

Foram executados:

SHOW config_file;
SHOW hba_file;
SHOW listen_addresses;
SHOW port;

Também foi validado o processo PostgreSQL:

systemctl show postgresql@16-main -p MainPID

e posteriormente:

tr '\0' ' ' < /proc/<PID>/cmdline

confirmando que o servidor realmente utilizava:

/etc/postgresql/16/main/postgresql.conf

e

/etc/postgresql/16/main/pg_hba.conf

Confirmação do reload

Também foi verificado o horário de carregamento da configuração:

SELECT now(), pg_conf_load_time();

Após:

SELECT pg_reload_conf();

foi possível confirmar que o PostgreSQL realmente havia recebido o sinal de reload.


Verificação dos logs

O log do PostgreSQL mostrava:

LOG: connection received
FATAL: no pg_hba.conf entry for host "...",
user "...",
database "...",

Portanto:

  • a conexão chegava ao servidor;
  • o servidor recusava a autenticação antes da validação da senha.

Hipóteses descartadas

Durante a investigação foram descartadas as seguintes possibilidades:

  • erro de senha;
  • usuário inexistente;
  • banco inexistente;
  • regra de rede incorreta;
  • IP do cliente incorreto;
  • cluster PostgreSQL incorreto;
  • porta incorreta;
  • falha de reload.

Investigação do pg_hba.conf

Como todas as verificações anteriores estavam corretas, decidiu-se validar integralmente o arquivo utilizando:

SELECT
    line_number,
    type,
    database,
    user_name,
    address,
    auth_method,
    error
FROM pg_hba_file_rules
WHERE error IS NOT NULL
ORDER BY line_number;

Resultado:

line_number | error
------------+-----------------------------------------
125         | invalid authentication method "md5sum"
126         | invalid authentication method "md5sum"

Foi identificado que duas linhas do arquivo possuíam:

host all zbx_monitor 127.0.0.1/32 md5sum
host all zbx_monitor ::1/128 md5sum

Causa raiz

O método de autenticação

md5sum

não existe no PostgreSQL.

O método correto é:

md5

As linhas corretas são:

host all zbx_monitor 127.0.0.1/32 md5
host all zbx_monitor ::1/128 md5

Solução

Após corrigir as duas linhas inválidas foi executado novamente:

SELECT pg_reload_conf();

A autenticação passou a funcionar imediatamente.


Observações importantes

Um detalhe importante observado durante a investigação é que:

  • pg_reload_conf() retornar true significa apenas que o sinal SIGHUP foi enviado ao servidor;
  • isso não garante que o arquivo pg_hba.conf tenha sido aceito integralmente.

Da mesma forma, consultar apenas regras específicas em:

pg_hba_file_rules

não é suficiente.

É necessário verificar também se existem erros globais no arquivo.


Procedimento recomendado

Sempre que houver alterações no pg_hba.conf, execute:

SELECT
    line_number,
    error
FROM pg_hba_file_rules
WHERE error IS NOT NULL;

O resultado esperado deve ser:

(0 linhas)

Somente após essa validação execute:

SELECT pg_reload_conf();

Evidências coletadas

Durante a investigação foram utilizadas as seguintes consultas:

Validação da regra carregada:

SELECT
    line_number,
    type,
    database,
    user_name,
    address,
    netmask,
    auth_method,
    error
FROM pg_hba_file_rules;

Validação de erros:

SELECT
    line_number,
    error
FROM pg_hba_file_rules
WHERE error IS NOT NULL;

Confirmação do arquivo carregado:

SHOW hba_file;

Confirmação da configuração:

SHOW config_file;

Confirmação do reload:

SELECT pg_conf_load_time();