17 septembre 2014

pg_hba.conf (part1)

Dans cette première partie on va voir comment sécuriser Postgresql  juste après son installation.


1) Vous venez donc d'installer Posgresql 9.x et voulez vous connectez en tapant psql.

> psql
psql: FATAL:  role "bidule" does not exist


En fait, en absence d'information, psql utilise le nom de l'utilisateur coté Unix et essaye de s'en servir pour se connecter à la base de données du même nom.

En fait, pour l'utilisateur 'bidule'
    > psql
est équivalant de
    > psql bidule bidule

Le premier 'bidule' est le nom de la base de données et le second le nom de l'utilisateur coté postgresql.


2) Dans toute installation par défaut de Postgresql il y a une base de données nommée postgres et un utilisateur nommé postgres. Donc ceci doit marcher :

> psql postgres postgres
psql (9.2.7)
Type "help" for help.

postgres=# _


Effectivement, on a bien le prompt du serveur Posgresql.


3) QUOI ?! Pas besoin de mot de passe !!!
Incroyable : Sur la machine où s’exécute le serveur Postgresql aucun utilisateur local n'a besoin de mot de passe pour y accéder. Ceci est dû à cette ligne dans le fichier pg_hba.conf

    local   all   all  trust

Elle signifie qu'en 'local', toutes  les bases de données (premier 'all') sont accessibles par tous les utilisateurs (deuxième 'all') à qui l'OS a déjà fait confiance ('trust') en acceptant qu'ils se connectent sur la machine.

Bien sur ceci est un véritable problème sur une machine multi-utilisateurs.

Notez que cette méthode très libérale pose exactement les mêmes problèmes que le mot de passe par défaut connu de tout le monde ou que l'utilisateur par défaut sans mot de passe.


4) Les trois premières choses à faire sont, dans cet ordre :
- attribuer un password au user 'postgres'  (coté Postgresql, pas coté Unix)
- changer la ligne de pg_hba en: "local   all   all  md5"
- mettre en commentaire toute les autres lignes utilisant la méthode 'trust'

En remplaçant la méthode 'trust' par la méthode 'md5' on force tout utilisateur local à donner le mot de passe de l'utilisateur coté base de données. Encore faut-il qu'il en ait un...

4.1) Donc on se connecte à Posgresql avec:

    > psql postgres postgres

puis on tape ces deux commandes pour attribuer un mot de passe à l'utilisateur postgres :

    ALTER USER postgres WITH PASSWORD 'Secr3tPassW0rd';
    \q



4.2) Dans le fichier pg_hba on remplace sur la ligne local la methode 'trust' par 'md5'
et on met en commentaire les deux lignes host utilisant aussi trust
# host    all  all  127.0.0.1/32   trust
# host    all  all  ::1/128        trust
On sauve, puis on redémarre le serveur Postgresql :

    systemctl restart postgresql


4.3) Maintenant si on utilise la commande  psql on doit taper le mot de passe

    > psql postgres postgres
    Password for user postgres: xxxxxxxxxxxx
    psql (9.2.7)
    Type "help" for help.
   
    postgres=# _


Ouf !

Notez qu'en remettant la méthode d'authentification pour 'local' à 'trust' pour pourrez vous connecter à nouveau (en local) sans mot de passe, ce qui est bien pratique si vous l'avez oublié.

Ce qui signifie que le 'root' Unix a tous pouvoirs sur le serveur Postgresql puisque il peut outre passer l’authentification en modifiant le fichier pg_hba.conf

Passons à l’accès via le réseaux ...