Habilitei o SSL no meu banco de dados PostgreSQL e o apliquei usando pg_hba.conf
a seguinte linha:
hostssl all all 0.0.0.0/0 md5
A partir dos logs de conexão do PostgreSQL e do tráfego de rede capturado via tcpdump, parece que conexões SSL estão sendo feitas:
2024-10-20 10:12:16.140 UTC [63] LOG: connection authenticated: identity="user" method=md5 (/etc/postgresql/pg_hba.conf:136)
2024-10-20 10:12:16.140 UTC [63] LOG: connection authorized: user=user database=db SSL enabled (protocol=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384, bits=256)
No entanto, como o Dovecot e o PostgreSQL estão sendo executados em máquinas diferentes e o certificado e sua CA não são confiáveis na máquina dovecot, eu esperava que o Dovecot, que se conecta ao PostgreSQL, sinalizasse um problema com o certificado autoassinado, mas não há reclamações. Isso me leva a acreditar que o certificado não está sendo validado corretamente, tornando a conexão vulnerável a ataques como MITM (Man-in-the-Middle).
Há alguma configuração extra ou etapa que estou esquecendo para impor a validação do certificado? Como posso garantir que as conexões sejam seguras e que o certificado esteja sendo validado corretamente?
Este é um problema de configuração do cliente , e a biblioteca de cliente suportada para PostgreSQL é chamada
libpq
, que o Dovecot está usando. A página do manual relacionada, libpq SSL Support (para a versão 17), declara explicitamente:Para forçar a verificação,
sslmode
é necessário definirverify-ca
para verificar se o certificado é confiável para a cadeia ou também paraverify-full
verificar se o nome no certificado corresponde ao nome na string de conexão.libpq
Se você usar o driver SQL do Dovecot , isso pode ser parecido com isto:
Somente Dovecot é mencionado; imagino que haja também pelo menos algum MTA, que pode precisar de um ajuste semelhante em sua configuração.
Seu sistema cliente também deve ter
~/.postgresql/root.crt
um arquivo com certificados CA raiz confiáveis. Portanto, você deve localizar o diretório home do usuário do Dovecot e colocar o certificado raiz lá. Como alternativa, você pode definirsslrootcert=/path/to/file
o parâmetro para a string de conexão para especificar o arquivo com o certificado CA raiz confiável e fornecer esse arquivo em vez disso.