Petit aide-mémoire pour mettre en place ce qu’il faut pour travailler en SSL avec PostgreSQL.
Mettre en place une CA
Il faut commencer par mettre en place une CA
Créer un certificat pour le serveur
Se placer dans le dossier /etc/ssl
cd /etc/ssl
Créer la CSR et retirer la passphrase
D’abord Créer la CSR :
openssl req -new -text -out server.csr
Donner une passphrase quelconque (on va l’enlever après pour que PostgreSQL (re)démarre sans demander un mot de passe à chaque fois). Indiquer le nom de la machine dans Common Name
.
Puis retirer la passphrase :
openssl rsa -in privkey.pem -out server.key
rm privkey.pem
Indiquer la passphrase précédemment entrée puis (auto) signer la clé avec notre CA :
openssl ca -out server.crt -infiles server.csr
Fournir les certificats à PostgreSQL
Comme la documentation de PostgreSQL l’indique, il faut placer les certificats dans le dossier $PGDATA
(/var/lib/postgresql/9.1/main
par exemple dans Debian/Ubuntu) :
Le certificat de la CA qui signe les certificats utilisateurs :
cp /etc/ssl/maCA/root-ca.crt /var/lib/postgresql/9.1/main/root.crt
Le certificat du serveur (signé par la CA) que le client vérifiera et sa clé privée :
cp /etc/ssl/maCA/server.crt /var/lib/postgresql/9.1/main/server.crt
cp /etc/ssl/maCA/server.key /var/lib/postgresql/9.1/main/server.key
S’assurer que les droits sur la clé privée sont bien restreints :
chown postgres:postgres /var/lib/postgresql/9.1/main/server.key
chmod 0600 /var/lib/postgresql/9.1/main/server.key
Astuces
Le fichier pg_hba.conf
Pour autoriser une connexion via SSL, il faut une ligne comme celle-ci :
hostssl dbname myappuser 0.0.0.0/0 cert map=monclient
Elle dit, en substance : autoriser un utilisateur qui se présente avec un certificat valide à se connecter à la base dbname
avec le compte myappuser
. Bien sûr, il faut que myappuser
ait les droits sur la base en question. La map
est facultative, voir ci-dessous. La méthode d’authentification cert
ne requiert pas de mot de passe, il suffit d’un certificat valide.
Le fichier pg_ident.conf
Il permet d’établir un lien entre le Common Name
stocké dans le certificat et un utilisateur de la base de données :
#mapname common name db user
monclient pierredupont myappuser
Lorsque l’application se connecte à PostgreSQL, elle présente le certificat, la base de données souhaitée et le nom de l’utilisateur (myappuser
). Le mapping permet d’autoriser le certificat ayant pierredupont
comme Common Name à se connecter en tant que myappuser
.