Activer le SSL sous PostgreSQL
Par Sébastien Le Ray le mardi 28 juillet 2009, 20:08 - Sysadmin - Lien permanent
Des fois ça marche tout seul et des fois non.
Cet article décrit comment faire en sorte de pouvoir utiliser des connexions chiffrées (via SSL/TLS) dans PostgreSQL 8.3.
Cet article fait suite à la constatation récente que PostgreSQL sous Debian ne permet pas systématiquement l'utilisation de connexions chiffrées. Nous allons donc voir comment le paramétrer.
L'activation de SSL lors de l'installation dépend de la présence, ou non, du paquet ssl-cert. Si celui-ci est disponible, vous aurez vraissemblablement deux fichiers (au moins) : /etc/ssl/certs/ssl-cert-snakeoil.pem et /etc/ssl/private/ssl-cert-snakeoil.key. Dans ce cas, pg_createcluster crée les liens symboliques adéquats dans /var/lib/postgresql/8.3/nomcluster et le SSL est activé par défaut. Si le paquet n'est pas présent, il va falloir faire les choses à la main.
Si vous tentez d'activer ssl (option ssl=true dans postgresql.conf) alors que les fichiers nécessaires (la clé et le certificat) n'existent pas, vous aurez droit à l'erreur suivante au démarrage de Postgre :
PostgreSQL server failed to start. Please check the log output: [horodatage] FATAL: n'a pas pu charger le fichier du certificat serveur « server.crt » : Aucun fichier ou répertoire de failed!
ou (dans la langue de Shakespeare), quelque chose du type :
PostgreSQL server failed to start. Please check the log output: [horodatage] FATAL: unable to load server certificate file « server.crt »: no such file or directory failed!
Pour résoudre le problème, on distingue deux cas : vous avez installé ssl-cert postérieurement à l'installation de PostgreSQL et vous souhaitez utiliser le certificat par défaut fourni avec ou vous souhaitez utiliser un certificat distinct (pour la forme, on supposera que vous souhaitez en créer un autosigné).
Dans tous les cas, il faut passer le paramètre de configuration ssl dans postgresql.conf à true.
Si vous souhaitez utiliser le certificat fourni avec ssl-cert, il vous suffit de créer les liens adéquats dans /var/lib/postgresql/8.3/nomcluster, quelque chose du genre :
sebastien@boiboite$ sudo ln -s /etc/ssl/private/ssl-cert-snakeoil.key /var/lib/postgresql/8.3/[nomcluster]/server.key sebastien@boiboite$ sudo ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /var/lib/postgresql/8.3/[nomcluster]/server.crt
et d'ajouter postgres au groupe ssl-cert pour ne pas qu'il chouine en disant qu'il n'a pas les droits sur les fichiers :
sebastien@boiboite$ sudo usermod -a -G ssl-cert postgres
Si vous souhaitez utiliser un certificat distinct, il suffit de copier la clé et le certificat correspondant aux emplacements adéquats (/var/lib/postgresql/8.3/nomcluster/server.{crt,key}). Pour rappel, la procédure de création d'un certificat autosigné est la suivante :
sebastien@boiboite$ openssl req -new -text -out server.req # (renseignez les infos et une passphrase) sebastien@boiboite$ openssl rsa -in privkey.pem -out server.key # (renseignez la passphrase pour déverrouiller la clé et supprimer cette passphrase) sebastien@boiboite$ rm privkey.pem # supprime la version de la clé avec passphrase sebastien@boiboite$ openssl req -x509 -in server.req -text -key server.key -out server.crt # autosigne le certificat
Copiez ensuite les fichiers au bon endroit après ajustement des permissions :
sebastien@boiboite$ sudo chown postgres\: server.{crt,key}
sebastien@boiboite$ sudo chmod 600 server.key
sebastien@boiboite$ sudo mv server.{key,crt} /var/lib/postgresql/8.3/[nomcluster]
C'est fini ! un sudo /etc/init.d/postgresql-8.3 restart et vous pourrez utiliser des connexions sécurisées.