Comment se connecter à une base PostgreSQL après avoir installé le logiciel ? Démonstration avec un cluster PostgreSQL 9.6 fraîchement installé sur un serveur Debian :
root@srvdeb96:~# pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
9.6 main 5432 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
root@srvdeb96:~# netstat -a
...
unix 2 [ ACC ] STREAM LISTENING 11536 /var/run/postgresql/.s.PGSQL.5432
...
root@srvdeb96:~# ls -l /var/run/postgresql/.s.PGSQL.5432
srwxrwxrwx 1 postgres postgres 0 nov. 27 16:53 /var/run/postgresql/.s.PGSQL.5432
root@srvdeb96:~# psql
psql: FATAL: le rôle " root " nexiste pas
root@srvdeb96:~# su - postgres
postgres@srvdeb96:~$ psql
psql (9.6.1)
Saisissez " help " pour l'aide.
postgres=# SELECT current_user;
current_user
--------------
postgres
(1 ligne)
postgres=# \du
Liste des rôles
Nom du rôle | Attributs | Membre de
-------------+---------------------------------------------------------------------------------+-----------
postgres | Superutilisateur, Créer un rôle, Créer une base, Réplication, Contournement RLS | {}
root@srvdeb96:~# rm /var/run/postgresql/.s.PGSQL.5432
root@srvdeb96:~# su - postgres
postgres@srvdeb96:~$ psql
psql: n'a pas pu se connecter au serveur : Aucun fichier ou dossier de ce type
Le serveur est-il actif localement et accepte-t-il les connexions sur la
socket Unix " /var/run/postgresql/.s.PGSQL.5432 " ?
postgres@srvdeb96:~$ psql -h localhost -p 5432 -U postgres
Mot de passe pour lutilisateur postgres :
psql: fe_sendauth: no password supplied
root@srvdeb96:~# pg_ctlcluster 9.6 main restart
Redirecting restart request to systemctl
root@srvdeb96:~# su - postgres
postgres@srvdeb96:~$ psql
psql (9.6.1)
Saisissez " help " pour l'aide.
postgres=# SELECT version();
version
------------------------------------------------------------------------------------------
PostgreSQL 9.6.1 on x86_64-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit
(1 ligne)
SHOW ALL;
...
unix_socket_directories | /var/run/postgresql | Sets the directories where Unix-domain sockets will be created.
unix_socket_group | | Sets the owning group of the Unix-domain socket.
unix_socket_permissions | 0777 | Sets the access permissions of the Unix-domain socket.
...
postgres=# ALTER SYSTEM SET unix_socket_permissions = "0700";
ALTER SYSTEM
postgres=# \q
postgres@srvdeb96:~$ exit
déconnexion
root@srvdeb96:~# pg_ctlcluster 9.6 main restart
Redirecting restart request to systemctl
root@srvdeb96:~# ls -l /var/run/postgresql/.s.PGSQL.5432
srwx------ 1 postgres postgres 0 nov. 27 19:04 /var/run/postgresql/.s.PGSQL.5432
Que constatons-nous ? Un cluster "main" est démarré et accessible via le port 5432 (port par défaut de PostgreSQL enregistré auprès de lIANA). Une écoute est prévue via une socket Unix dont les droits sont totalement ouverts. Mais lutilisateur "root" ne peut pas se connecter. En fait, le seul utilisateur Unix pouvant se connecter localement correspond au seul utilisateur PostgreSQL créé au niveau du cluster : postgres.
Quid de la sécurité dans cette configuration ? Tout le monder peut supprimer le fichier de la socket Unix. Sil est supprimé, personne ne peut plus se connecter et un redémarrage du cluster est nécessaire. Il convient donc de protéger ce fichier. Sur une Redhat 6-like le fichier se trouve par défaut dans /tmp. Sans même parler dacte de malveillance, cela accroit le risque dune mauvaise manipulation. Sur une Debian-like comme sur une Redhat 7-like, le travail dintégration et de normalisation Unix autour de PostgreSQL est plus abouti et le fichier se trouve dans /var/run/postgresql. Cela réduit déjà les risques de mauvaises manipulations. Cependant, restreindre davantage les droits sur ce fichier peut être intéressant sur un serveur multi-utilisateurs. Cela peut être fait en positionnant unix_socket_permissions à 770 ou même 700 par exemple. Seul les membres du groupe Unix postgres (770), voire uniquement lutilisateur postgres (700), pourront alors se servir de la socket Unix.