====== Permissions sous postgresql ======
--- //[[f.raynaud@arles-linux.org|François Raynaud]] 2020/06/08 15:50//
Ces commandes fonctionnent avec la version postgresql 11.
Nous allons modifier l'installation de postgresql accéder en local avec psql et apache. Ensuite nous essaierons une connexion distante. Enfin nous formaliserons un utilisateur limité pour accéder à l'application openAssociation.
Nous allons travailler essentiellement sur le fichier [[https://docs.postgresql.fr/8.2/client-authentication.html#auth-pg-hba-conf|pg_hba.conf]]
[[http://www.i3s.unice.fr/~rueher/Cours/BD/DocPostgresSQL9-5_HTML/client-authentication.html#auth-pg-hba-conf|source sur pg_pha.conf]]
Avant toute modification, il est conseillé de recopier le fichier
sudo cp /etc/postgresql/11/main/pg_hba.conf /etc/postgresql/11/main/pg_hba.confold
====Accès "local" (psql et apache)====
===Accès de l'utilisateur postgres en local===
Par défaut la méthode de connexion à l'utilisateur postgres en local est md5
# Database administrative login by Unix domain socket
local all postgres md5
# TYPE DATABASE USER ADDRESS METHOD
* TYPE : local : connexion du domaine unix
* DATABASE : all : toutes les bases de données
* USER : postgres
* ADRESS : vide car ne concerne que les adresses externes
Sur les méthodes de connexion :
argument METHOD :
* trust : autorise la connexion sans condition
* peer : recupère le nom d utilisateur linux et vérifie que cela correspond avec le SGBD
* md5 : demande au client un mot de passe chiffré
lors d'une tentative de connexion postgres
# method=md5
psql -U postgres
authentification par mot de passe échouée pour l'utilisateur postgres
# method=peer l utilisateur linux doit être postgres
su postgres
psql
postgres#
authentification peer ok
# method trust -> ok
psql -U postgres
postgres#
Il est proposé de mettre la méthode trust et redémarrer apache :
# Database administrative login by Unix domain socket
local all postgres trust
# TYPE DATABASE USER ADDRESS METHOD
service apache2 restart
===accès de l'utilisateur linux==
Il est proposé de se connecter à psql avec l'utilisateur deb qui est notre utilisateur système crée lors de la mise en place de debian.
psql postgres
le role deb n'existe pas
Il faut donc créer le role :
createuser -P deb -U postgres
Saisir le mot de passe pour le nouveau rôle : deb
Le saisir de nouveau : deb
Il est possible de se connecter à la base postgres avec le rôle "deb" .
psql postgres
postgres=#
Par défaut, la méthode de connexion pour les autres utilisateurs est peer en local
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
Il est proposé de mettre la méthode md5
# TYPE DATABASE USER ADDRESS METHOD
local all all md5
Le mot de passe sera demandé en connexion à psql
===Accès avec Apache/php===
L'objectif est de pouvoir connecter apache/php avec la base :
Le script ci dessous permet de tester la connexion php_pgsql avec la commande php [[https://www.php.net/manual/fr/function.pg-connect.php|pg_connect]]
Si il y a un message pg_connect, commande inconnue, c est que php_pgsql n'est pas installé ou il n'est pas pris en compte. Dans ce dernier cas redémarrer apache, dans l'autre voir [[install_debian|install_debian]]
Si il y a un message "erreur de connexion", c est qu'il y a un problème de droit (accès pg_hba.conf) ou de paramètre (voir le port si ce n est pas le 5432) ou d'acces à la base postgres
===Accès avec Apache/php à l'application openAssociation===
Il faut que l'utilisateur postgres deb ait les privilèges pour sur la base "openstock" dont il n'est pas propriétaire (dans notre cas c'est l'utilisateur postgres).
Il lui faut être super utilisateur et seul l'utilisateur postgres qui est super utilisateur peut
donner un role de super utilisateur.
psql -U postgres
alter role deb with superuser;
Nous allons autoriser maintenant le super utilisateur à créer des rôles et à créer des bases :
psql -U postgres
postgres=#
alter role deb with createdb;
alter role deb with createrole;
select rolname,rolsuper,rolcreaterole,rolcreatedb,rolcanlogin from pg_roles where rolcanlogin is true ;
rolname | rolsuper | rolcreaterole | rolcreatedb | rolcanlogin
----------+----------+---------------+-------------+-------------
postgres | t | t | t | t
deb | t | t | t | t
Il peut être intéressant de remettre postgres à md5 dans le fichier pg_hba.conf vu que nous avons l'utilisateur deb qui a les mêmes privilèges.
# Database administrative login by Unix domain socket
local all postgres md5
====accès avec une ip externe (contrôle IP)====
{{ :connexion_pgadmin.png?400|}}
Il faut autoriser des IP externes dans les cas suivants (tests avec un raspberry et postgres 9.4) :
* le serveur web apache est sur un autre serveur que celui de postgres
* les développeurs accèdent via un client comme pgadmin sur le serveur postgres (image ci contre)
Rajouter la ligne suivante dans /etc/postgresql/9.4/main/pg_hba.conf pour que les adresses en 192.168 se connectent à la base
# IPv4 local connections:
host all all 192.168.0.0/16 md5
Mettre * (ou l'adresseIP autorisé) à la place de localhost dans la directive listen_addresses de /etc/postgresql/11/main/postgresql.conf
listen_addresses = '*'
redémarrer postgresql
service postgresql restart
* TYPE host : intercepte les tentatives de connexion TCPIP
* TYPE hostnossl : intercepte les tentatives de connexion TCPIP qui ne sont pas ssl
* TYPE hostssl : intercepte les tentatives de connexion TCPIP qui sont ssl
* ADRESS
=====Accès limité au connecteur à postgresql pour l'application openAssociation=====
L'objectif est de limiter les privilèges du connecteur strictement au besoin de l'application openAssociation.
[[https://sqlpro.developpez.com/cours/sqlaz/dcl/#L2.1|sources pour les privilèges standard SQL2]]
Création d'un utilisateur
createuser -P deb_asso
Saisir le mot de passe pour le nouveau rôle : deb_asso
Le saisir de nouveau : deb_asso
Mot de passe : deb
Il faut donner les privilèges sur le schéma qui appartient à l'utilisateur postgres à l'utilisateur deb_asso
(dans notre cas).
* il doit pouvoir utiliser le schéma openstock_association
* il doit pouvoir utiliser les commandes select,update,insert et delete sur les tables
* il doit pouvoir utiliser les commandes select et update sur les séquences
psql openstock
grant usage on SCHEMA openstock_association to deb_asso;
grant select,insert,update,delete on all tables in schema openstock_association to deb_asso;
grant select,update on all sequences in schema openstock_association to deb_asso;
Changer l'utilisateur et le mot de passe dans l'application openassociation
root@deb:~# nano /var/www/html/openassociation_1.0.1/dyn/database.inc.php
...
// gestion association
$conn[1] = array(
"Gestion association", // Titre
"pgsql", // Type de base
"pgsql", // Type de base
"deb_asso", // Login
"deb_asso", // Mot de passe
...
Affichage des privilèges sous postgres. voir [[psql_commande|raccourci commandes en ligne]]
On peut enlever des permissions avec la commande REVOKE.
deb_asso ne peut pas créer de schéma, créer une table ou changer de propriétaire une table qui ne lui appartient pas dans le schéma openstock_association:
openstock=> create schema temp;
ERREUR: droit refusé pour la base de données openstock
openstock=> create table openstock_association.temp(id integer,libelle varchar(20));
ERREUR: droit refusé pour le schéma openstock_association
openstock=> alter table openstock_association.article owner to deb_asso ;
ERREUR: doit être le propriétaire de la table article
Par contre, il peut continuer à créer des tables dans le schéma public d'openstock et dans les autres schéma public.
Le super utilisateur PUBLIC ne vise personne en particulier ni en général. On ne peut donc retirer un privilège particulier à un utilisateur donné même si l'on a attribué des privilèges à "PUBLIC".
Il est proposé d'enlever la création de table à l'utilisateur PUBLIC sur le schéma public :
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
L'utilisateur deb_asso ne peut plus créer de table dans le schéma public.
Le super utilisateur "deb" peut continuer à le faire
[[structure_postgres|la structure de postgres]]