Chapitre 19. Authentification du client

Table des matières
19.1. Le fichier pg_hba.conf
19.2. Méthodes d'authentification
19.2.1. Authentification Trust
19.2.2. Authentification par mot de passe
19.2.3. Authentification Kerberos
19.2.4. Authentification basée sur l'identification
19.2.5. Authentification PAM
19.3. Problèmes d'authentification

Quand une application client se connecte au serveur de base de données, elle indique le nom de l'utilisateur PostgreSQL sous lequel elle désire se connecter, comme lorsqu'on se connecte sur un ordinateur Unix sous un nom d'utilisateur particulier. Au sein de l'environnement SQL, le nom d'utilisateur de la base de données active détermine les privilèges régissant l'accès aux objets de la base de données -- voir le Chapitre 17 pour plus d'informations. Ainsi, il est essentiel de limiter le nombre des bases de données auxquelles les utilisateurs peuvent se connecter.

L'authentification est le processus par lequel le serveur de bases de données établit l'identité du client et, par extension, par lequel il détermine si l'application cliente (ou l'utilisateur sous le nom de laquelle elle tourne) est autorisée à se connecter sous le nom d'utilisateur demandé.

PostgreSQL offre quantité de méthodes d'authentification différentes. La méthode d'authentification d'une connection client particulière peut être sélectionnée d'après l'adresse, la base de données et l'utilisateur de l'hôte client.

Les noms d'utilisateurs PostgreSQL sont séparés de façon logique des noms d'utilisateurs du système d'exploitation sur lequel tourne le serveur. Si tous les utilisateurs d'un serveur donné ont aussi des comptes sur la machine serveur, il peut être pertinent d'attribuer des noms d'utilisateurs de la base de données qui correspondent aux noms d'utilisateurs du système d'exploitation. Cependant, un serveur qui accepte les connexions distantes peut avoir plusieurs utilisateurs de base de données dépourvus de compte correspondant sur le système d'exploitation, dans de tels cas il n'y a pas besoin de correspondance entre noms d'utilisateurs de bases de données et noms d'utilisateurs du système d'exploitation.

19.1. Le fichier pg_hba.conf

L'authentification du client est contrôlée par le fichier pg_hba.conf situé dans le répertoire data, par exemple /usr/local/pgsql/data/pg_hba.conf (HBA signifie << host-based authentication >> : authentification fondée sur l'hôte.) Un fichier pg_hba.conf par défaut est installé lorsque le répertoire data est initialisé par initdb.

Le format général du fichier pg_hba.conf est un ensemble d'enregistrements, un par ligne. Les lignes vides sont ignorées tout comme n'importe quel texte placé après le caractère de commentaire #. Un enregistrement est constitué d'un certain nombre de champs séparés par des espace et/ou des tabulations. Les champs peuvent contenir des espaces si la valeur du champ est mise entre guillemets. Un enregistrement ne peut pas être continué sur plusieurs lignes.

Chaque enregistrement détermine un type de connexion, une plage d'adresses IP (si approprié au type de connexion), un nom de base de données, un nom d'utilisateur et la méthode d'authentification à utiliser pour les connexions correspondant à ces paramètres. Le premier enregistrement correspondant au type de connexion, à l'adresse client, à la base de données demandée et au nom d'utilisateur est utilisé pour effectuer l'authentification. Il n'y a pas de suite après erreur (<< fall-through >> ou << backup >>) : si un enregistrement est choisi et que l'authentification échoue, les enregistrements suivants ne sont pas considérés. Si aucun enregistrement ne correspond, l'accès est refusé.

Un enregistrement peut avoir l'un des formats suivants.

local      database  user  authentication-method  [authentication-option]
host       database  user  IP-address  IP-mask  authentication-method  [authentication-option]
hostssl    database  user  IP-address  IP-mask  authentication-method  [authentication-option]
hostnossl  database  user  IP-address  IP-mask  authentication-method  [authentication-option]
host       database  user  IP-address/IP-masklen  authentication-method  [authentication-option]
hostssl    database  user  IP-address/IP-masklen  authentication-method  [authentication-option]
hostnossl  database  user  IP-address/IP-masklen  authentication-method  [authentication-option]

La signification des champs est la suivante :

local

Cet enregistrement intercepte les tentatives de connexion utilisant les sockets du domaine Unix. Sans un enregistrement de ce type, les connections de sockets du domaine Unix ne sont pas permises.

host

Cet enregistrement intercepte les tentatives de connexion utilisant les réseaux TCP/IP. Remarquez que les connexions TCP/IP sont désactivées sauf si le serveur est lancé avec l'option -i ou si le paramètre de configuration tcpip_socket est activé.

hostssl

Cet enregistrement intercepte les tentatives de connexions utilisant SSL sur TCP/IP. Les enregistrements host intercepteront les tentatives de connexion SSL ou non-SSL mais les enregistrements hostssl nécessitent des connexions SSL.

Pour être en mesure de faire usage de cette fonction, le serveur doit être compilé avec le support SSL activé. De plus, SSL doit être activé en positionnant le paramètre de configuration ssl (voir Section 16.4 pour plus d'informations).

hostnossl

Cet enregistrement est similaire à hostssl mais avec une logique opposée : il n'intercepte que les tentatives de connexion n'utilisant pas SSL.

database

Indique quelles bases de données l'enregistrement concerne. La valeur all indique qu'il concerne toutes les bases de données. La valeur sameuser spécifie que l'enregistrement n'intercepte que si la base de données demandée a le même nom que l'utilisateur demandé. La valeur samegroup spécifie que l'utilisateur demandé doit être membre du groupe portant le même nom que la base de données demandée. Sinon, c'est le nom d'une base de données PostgreSQL particulière. Des noms de bases de données multiples peuvent être fournis en les séparant par des virgules. Un fichier contenant des noms de bases de données peut être indiqué en faisant précéder le nom de fichier de @. Le fichier doit être dans le même répertoire que pg_hba.conf.

user

Indique à quels utilisateurs PostgreSQL cet enregistrement correspond. La valeur all indique qu'il concerne tous les utilisateurs. Autrement, c'est le nom d'un utilisateur PostgreSQL particulier. Plusieurs noms d'utilisateurs peuvent être fournis en les séparant avec des virgules. Les noms de groupes peuvent être spécifiés en précédant le nom de groupe du signe +. Un fichier contenant des noms d'utilisateurs peut être indiqué en faisant précéder le nom de fichier du signe @. Le fichier doit être dans le même répertoire que pg_hba.conf.

IP-address
IP-mask

Ces deux champs contiennent les adresses IP et les masques en notation pointée standard. (Les adresses IP ne peuvent être spécifiées que sous forme numérique, pas sous forme de noms de domaines ou d'hôtes.) Pris séparément, ils spécifient les adresses IP des machines clientes que cet enregistrement intercepte. La logique précise est que

 (actual-IP-address
xor IP-address-field) and
IP-mask-field 

doit être égal à zéro pour que l'enregistrement intercepte.

Une adresse IP au format IPv4 correspondra aux connexions IPv6 qui auront l'adresse correspondante. Par exemple, 127.0.0.1 correspondra à l'adresse IPv6 ::ffff:127.0.0.1. Une entrée donnée au format IPv6 correspondra uniquement aux connexions IPv6 même si l'adresse représentée est dans le domaine IPv4-vers-IPv6. Notez que les adresses au format IPv6 seront rejetées si la bibliothèque système C ne supporte pas les adresses IPv6.

Ces champs ne concernent que les enregistrements host, hostssl et hostnossl.

IP-masklen

Ce champ peut être utilisé à la place de la notation IP-mask notation. C'est un entier précisant le nombre de bits significatifs à placer dans le masque. Le nombre doit être compris entre 0 et 32 inclus (dans le cas d'une adresse IPv4) ou 128 inclus (dans le cas d'une adresse IPv6). 0 interceptera toutes les adresses, tandis que 32 (respectivement 128) n'interceptera que l'hôte spécifié. La même logique s'applique pour une notation pointée IP-Mask.

Il ne doit pas y avoir d'espace entre l'adresse IP et le / ou le / et le IP-masklen, sinon le fichier ne sera pas analysé correctement.

Ce champ ne concerne que les enregistrements host, hostssl et hostnossl.

authentication-method

Détermine la méthode d'authentification à utiliser lors d'une connexion via cet enregistrement. Les choix possibles sont résumés ici ; les détails se trouvent dans la Section 19.2.

trust

La connexion est permise sans conditions. Cette méthode permet à n'importe qui de se connecter au serveur de bases de données PostgreSQL, de s'enregistrer comme n'importe quel utilisateur PostgreSQL de son choix sans nécessiter de mot de passe. Voir la Section 19.2.1 pour les détails.

reject

La connexion est rejetée sans conditions. Ce cas est utile pour << filtrer >> certains hôtes d'un groupe.

md5

Demande au client de fournir un mot de passe encrypté MD5 pour son authentification. C'est la seule méthode permettant d'enregistrer les mots de passes encryptés dans pg_shadow. Voir la Section 19.2.2 pour les détails.

crypt

Identique à la méthode md5 mais utilise une fonction de cryptage crypt() plus ancienne, nécessaire pour les clients pré-7.2. On préférera md5 pour les clients 7.2 et suivants. Voir Section 19.2.2 pour les détails.

password

Identique à md5, mais le mot de passe est envoyé en texte clair sur le réseau. Ceci ne devrait pas être utilisé sur les réseaux peu dignes de confiance. Voir Section 19.2.2 pour les détails.

krb4

Kerberos V4 est utilisé pour authentifier l'utilisateur. Ceci n'est disponible que pour les connexions TCP/IP. Voir Section 19.2.3 pour les détails.

krb5

Kerberos V5 est utilisé pour authentifier l'utilisateur. Ceci n'est disponible que pour les connexions TCP/IP. Voir Section 19.2.3 pour les détails.

ident

Récupère le nom de l'utilisateur du système d'exploitation du client (pour les connexions TCP/IP en contactant le serveur d'identification sur le client, pour les connexions locales, en l'obtenant du système d'exploitation.) et vérifie si l'utilisateur est autorisé à se connecter en tant qu'utilisateur de la base de données demandé en consultant la correspondance indiquée après le mot clé ident.

Si vous utilisez la correspondance sameuser, les noms d'utilisateurs doivent être identiques. Sinon, le nom de la correspondance est recherché dans le fichier pg_ident.conf dans le même répertoire que pg_hba.conf. La connexion est acceptée si ce fichier contient une entrée pour cette correspondance avec le nom de l'utilisateur du système d'exploitation et le nom d'utilisateur PostgreSQL demandé.

Pour les connexions locales, ceci ne marche que sur les machines qui supportent les certificats sockets du domaine Unix (actuellement Linux, FreeBSD, NetBSD, OpenBSD et BSD/OS).

Voir Section 19.2.4 ci-dessous pour les détails.

pam

Authentifie en utilisant les Pluggable Authentification Modules (PAM) fournis par le système d'exploitation. Voir Section 19.2.5 pour les détails.

authentication-option

La signification de ce champ optionnel dépend de la méthode d'authentification choisie et est décrite dans la section suivante.

Les enregistrements du fichier pg_hba.conf sont examinés séquentiellement pour chaque tentative de connexion, l'ordre des enregistrements est significatif. Généralement, les premiers enregistrements auront des paramètres d'interception de connexions plus stricts alors que les enregistrements suivants auront des paramètres plus larges et des méthodes d'authentification plus fortes. Par exemple, on pourrait souhaiter utiliser l'authentification trust pour les connexions TCP/IP locales mais demander un mot de passe pour les connexion TCP/IP distantes. Dans ce cas, un enregistrement spécifiant une authentification trust pour les connexions issues de 127.0.0.1 apparaîtrait avant un enregistrement spécifiant une authentifications par mot de passe pour une plage plus étendue d'adresses IP client autorisées.

Important : N'interdisez pas au super-utilisateur d'accéder à la base de données template1. Plusieurs commandes de gestion ont besoin d'accéder à template1.

Le fichier pg_hba.conf est lu au démarrage et quand le processus serveur principal (postmaster) reçoit un signal SIGHUP. Si vous éditez le fichier sur un système actif, vous aurez à signaler au postmaster (en utilisant pg_ctl reload ou kill -HUP) de relire le fichier.

Un exemple de fichier pg_hba.conf est décrit ci-dessous Exemple 19-1. Voir la section suivante pour les détails des méthodes d'authentification.

Exemple 19-1. Un fichier pg_hba.conf d'exemple

# Permet à n'importe quel utilisateur du système local de se connecter à la base
# de données sous n'importe quel nom d'utilisateur en utilisant les sockets du
# domaine Unix. (par défaut pour les connexions locales)
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
local   all         all                                             trust

# Identique à ci-dessus mais utilise les connexions TCP/IP locales loopback.
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    all         all         127.0.0.1         255.255.255.255   trust     

# Identique à la dernière ligne mais en utilisant un masque CDIR.
#
# TYPE  DATABASE    USER        IP-ADDRESS/CIDR-mask  METHOD
host    all         all         127.0.0.1/32          trust     

# Permet à n'importe que utilisateur de n'importe quel hôte avec l'adresse IP
# 192.168.93.x de se connecter à la base de données "template1" sous le même nom
# d'utilisateur que l'identification le signale à la connexion (généralement le
# nom utilisateur Unix).
# 
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    template1   all         192.168.93.0      255.255.255.0     ident
sameuser

# Identique à la ligne précédente mais en utilisant un masque CDIR.
#
# TYPE  DATABASE    USER        IP-ADDRESS/CIDR-mask  METHOD
host    template1   all         192.168.93.0/24       ident sameuser

# Permet à un utilisateur de l'hôte 192.168.12.10 de se connecter à la base de
# données "template1" si le mot de passe de l'utilisateur est fourni sans
# erreur.
# 
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    template1   all         192.168.12.10     255.255.255.255   md5

# En l'absence de lignes "host" antérieures, ces deux lignes rejetteront toutes
# les connexions en provenance de 192.168.54.1 (puisque cette entrée déclenchera
# en premier), mais autorisera les connexions Kerberos V de n'importe où
# ailleurs sur l'Internet. Le masque zéro signifie qu'aucun bit sur l'ip de
# l'hôte n'est considéré, de sorte à correspondre à tous les hôtes.
# 
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    all         all         192.168.54.1      255.255.255.255   reject host
all         all         0.0.0.0           0.0.0.0           krb5

# Permet à tous les utilisateurs de se connecter depuis 192.168.x.x à n'importe
# quelle base de données si ils passent la verification d'identification. Si,
# par exemple, l'identification indique que l'utilisateur est "bryanh" et qu'il
# demande à se connecter en tant qu'utilisateur PostgreSQL "guest1", la
# connexion n'est permise que s'il existe une entrée dans pg_ident.conf pour la
# correspondance "omicron" disant que "bryanh" est autorisé à se connecter en
# tant que "guest1".
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
host    all         all         192.168.0.0       255.255.0.0       ident
omicron

# Si ce sont les trois seules lignes traitant les connexions locales, elles
# autoriseront les utilisateurs locaux à se connecter uniquement à leur propre
# base de données (bases de données ayant le même nom que leur nom
# d'utilisateur) exception faite pour les administrateurs et les membres du
# groupe "support" qui peuvent se connecter à toutes les bases de données.  Le
# fichier $PGDATA/admins contient une liste de noms d'utilisateurs. Un mot de
# passe est requis dans tous les cas.
#
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
local   sameuser    all                                             md5 local
all         @admins                                         md5 local   all
+support                                        md5

# Les deux dernières lignes ci-dessus peuvent être combinées en une seule ligne:
local   all         @admins,+support                                md5

# La colonne database peut aussi utiliser des listes et des noms de fichiers
# mais pas de groupes:
local   db1,db2,@demodbs  all                                       md5