J'ai une application sensible avec le serveur d'applications et la base de données sur des machines distinctes, et dans le cas de la base de données esclave, dans des centres de données distincts.
Bien que je pense que mes postgresqls sont configurés pour toujours utiliser ssl, j'ai besoin d'un moyen de revérifier cela.
Existe-t-il un moyen simple de vérifier que toutes les connexions client sont effectivement forcées d'utiliser SSL?
Les connexions non SSL peuvent être désactivées via pg_hba.conf
.
Par exemple, cela peut commencer comme ceci:
# allow local connections through Unix domain sockets
local all all peer
# allow non-encrypted local TCP connections with passwords
Host all all 127.0.0.1/32 md5
Host all all ::1/128 md5
# reject any other non-encrypted TCP connection
hostnossl all all 0.0.0.0/0 reject
hostnossl all all ::/0 reject
# other rules...
Les règles sont testées dans l'ordre et jusqu'au premier match, donc toute règle après celles-ci n'aura aucun effet lors de l'un de ces matchs.
Au moment de l'exécution, pour vérifier quelles sessions sont chiffrées, il y a pg_stat_ssl
vue système (depuis PostgreSQL 9.5). Sa colonne pid
fait référence à pg_stat_activity
contenant les autres informations pouvant être utiles pour identifier la connexion, telles que usename
, datname
, client_addr
..., vous pouvez donc utiliser cette requête, par exemple:
SELECT datname,usename, ssl, client_addr
FROM pg_stat_ssl
JOIN pg_stat_activity
ON pg_stat_ssl.pid = pg_stat_activity.pid;
Vous pouvez consulter pg_stat_ssl pour vous assurer que les clients sont connectés via SSL. Bien que si vous pensez que pg_hba est un buggy, je ne sais pas pourquoi vous auriez plus confiance en pg_stat_ssl. Mais notez que cela ne montre que le client est connecté via SSL. Il n'y a aucun moyen de savoir à partir du serveur si le client a effectivement effectué une vérification complète sur le certificat des serveurs. (Ou bien sûr, si le client est connecté à un serveur hostile plutôt qu'au serveur correct, le bon serveur n'en sera pas conscient).
Du côté client, vous devez les configurer pour utiliser sslmode = verify-full. Pour tester que cette configuration est effective, vous pouvez temporairement saboter ~/.postgresql/root.crt en la renommant et en vous assurant que les connexions échouent. Comme une mauvaise configuration est facile à faire, il peut être plus sûr de compiler votre propre client qui ignore le paramètre de sslmode et implémente toujours la vérification complète.