Gestion des accès, configuration par défaut

Accéder à un cluster PostgreSQL après une installation par défaut

Hors de la boîte

      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 " n’existe 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 l’utilisateur 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 l’IANA). Une écoute est prévue via une socket Unix dont les droits sont totalement ouverts. Mais l’utilisateur "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. S’il 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 d’acte de malveillance, cela accroit le risque d’une mauvaise manipulation. Sur une Debian-like comme sur une Redhat 7-like, le travail d’inté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 l’utilisateur postgres (700), pourront alors se servir de la socket Unix.

Mise à jour : 03/02/2018