PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 15.6 » Internes » Protocole Frontend/Backend » Authentification SASL

55.3. Authentification SASL

SASL est un cadre pour l'authentification dans des protocoles orientés connexions. Actuellement, PostgreSQL implémente deux mécanismes d'authentification SASL, SCRAM-SHA-256 et SCRAM-SHA-256-PLUS. D'autres pourraient être ajoutés dans le futur. Les étapes ci-dessous illustrent comment l'authentification SASL est réalisé en général, alors que la sous-section suivante donne plus de détails sur SCRAM-SHA-256 et SCRAM-SHA-256-PLUS.

Flot de message d'authentification SASL

  1. Pour commencer un échange d'authentification SASL, le serveur envoie un message AuthenticationSASL. Il inclut une liste des mécanismes d'authentification SASL que le serveur peut accepter, dans l'ordre de préférence du serveur.

  2. Le client sélectionne un des mécanismes supportés dans la liste, et envoie un message SASLInitialResponse au serveur. Le message inclut le nom du mécanisme sélectionné, et un optionnel Initial Client Response, si le mécanisme sélectionné utilise cela.

  3. Un ou plusieurs messages server-challenge et client-response suivront. Chaque message server-challenge est envoyé dans un message AuthenticationSASLContinue, suivi par une réponse d'un client dans un message SASLResponse. Les particularités des messages sont spécifiques au mécanisme.

  4. Enfin, quand l'échange d'authentification est terminé avec succès, le serveur envoie un message AuthenticationSASLFinal, suivi immédiatement par un message AuthenticationOk. Le message AuthenticationSASLFinal contient des données supplémentaires du serveur au client, dont le contenu est spécifique au mécanisme d'authentification sélectionné. Si le mécanisme d'authentification n'utilise pas les données supplémentaires envoyées en fin, le message AuthenticationSASLFinal n'est pas envoyé.

En cas d'erreur, le serveur peut annuler l'authentification à tout moment, et envoie un message ErrorMessage.

55.3.1. Authentification SCRAM-SHA-256

Les mécanismes SASL implémentés actuellement sont SCRAM-SHA-256 et son variant avec la liaison de canal SCRAM-SHA-256-PLUS. Ils sont décrits en détails dans RFC 7677 et RFC 5802.

Quand SCRAM-SHA-256 est utilisé dans PostgreSQL, le serveur ignorera le nom d'utilisateur que le client envoie dans client-first-message. Le nom d'utilisateur qui était déjà envoyé dans le message de démarrage est utilisé à la place. PostgreSQL accepte plusieurs encodages de caractères, alors que SCRAM impose l'utilisation d'UTF-8 pour le nom d'utilisateur, donc il pourrait être impossible de représenter le nom d'utilisateur PostgreSQL en UTF-8.

La spécification SCRAM impose que le mot de passe soit aussi en UTF-8, et soit traité avec l'algorithme SASLprep. Néanmoins, PostgreSQL ne requiert pas l'utilisation d'UTF-8 pour le mot de passE. Quand le mot de passe d'un utilisateur est configuré, il est traité avec SASLprep comme s'il était en UTF-8, quelque soit l'encodage réel. Néanmoins, s'il ne s'agit pas d'une séquence légale d'octets UTF-8 ou s'il contient des séquences d'octets UTF-8 qui sont interdites par l'algorithme SASLprep, le mot de passe brut sera utilisé sans le traitement de SASLprep, au lieu de renvoyer une erreur. Ceci permet au mot de passe d'être normalisé quand il est en UTF-8, en autorisant toujours l'utilisation d'un mot de passe non UTF-8, sans nécessiter que le système connaisse l'encodage du mot de passe.

La liaison de canal (Channel binding) est accepté par PostgreSQL si ce dernier a été compilé avec le support de SSL. Le nom du mécanisme SASL pour SCRAM avec liaison de canal est SCRAM-SHA-256-PLUS. Le type de liaison utilisé par PostgreSQL est tls-server-end-point.

Dans SCRAM sans liaison de canal, le serveur choisit un nombre aléatoire qui est transmis au client pour être mélangé avec le mot de passe fourni par l'utilisateur dans le hachage transmis du mot de passe. Bien que ceci empêche le hachage du mot de passe d'être retransmis avec succès dans une session ultérieure, cela n'empêche pas un faux serveur entre le serveur réel et le client de passer la valeur aléatoire du serveur et de s'authentifier avec succès.

SCRAM avec liaison de canal empêche ce type d'attaques man-in-the-middle en mélangeant la signature du certificat du serveur dans le hachage transmis du mot de passe. Bien qu'un faux serveur peut retransmettre le certificat du vrai serveur, il n'a pas accès à la clé privée correspondant à ce certificat et ne peut donc pas prouver qu'il en est le propriétaire, imposant de ce fait un échec de la connexion SSL.

Exemple

  1. Le serveur envoie un message AuthenticationSASL. Il inclut une liste des mécanismes d'authentification SASL que le serveur peut accepter. Ce sera SCRAM-SHA-256-PLUS et SCRAM-SHA-256 si le serveur dispose du support de SSL. Dans le cas contraire, ce sera uniquement le dernier.

  2. Le client répond en envoyant un message SASLInitialResponse, qui indique le mécanisme choisi, SCRAM-SHA-256 ou SCRAM-SHA-256-PLUS. (Un client est libre de choisir un mécanisme mais pour une sécurité plus forte, il devra choisir la variante à liaison de canal s'il le gère.) Dans le champ Initial Client response, le message contient le message SCRAM client-first-message. Le message client-first-message contient aussi le type de liaison de canal choisi par le client.

  3. Le serveur envoie un message AuthenticationSASLContinue, avec un message SCRAM server-first-message comme contenu.

  4. Le client envoie un message SASLResponse, avec le message SCRAM client-final-message comme contenu.

  5. Le serveur envoie un message AuthenticationSASLFinal, avec le message SCRAM server-final-message, suivi immédiatement par un message AuthenticationOk.