Modifications entre les versions 3 et 30 (s'étendant sur 27 versions)
Version 3 à la date du 2006-12-15 21:32:02
Taille: 5566
Commentaire: refonte + ajout de IMAP
Version 30 à la date du 2012-05-03 08:27:00
Taille: 15488
Éditeur: TruongTungLam
Commentaire:
Texte supprimé. Texte ajouté.
Ligne 1: Ligne 1:
Cette page présente une façon de configurer [:Postfix:] afin d'y activer l'authentification des connexions via SASL.

Note : [:JeanChristopheAndré:Je] présente ici l'installation sur une Debian ''Sarge'' ou ''Etch''.

== Installation des outils requis ==

Afin de pouvoir s'authentifier en toute sécurité, il est fortement conseillé d'activer le [:../Chiffrement:chiffrement TLS] des connexions SMTP. C'est même indispensable pour la configuration que je présente ici, car on y utilise le mécanisme `PLAIN` qui consiste à transmettre le mot de passe en clair lors de l'authentification (nécessaire pour certains mécanismes sous-jacents).

Dans tous les cas, il faut au moins installer les modules SASL :
{{{
$ sudo aptitude install libsasl2-modules
}}}
<<TableOfContents()>>
Cette page présente une façon de configurer [[Postfix]] afin d'y activer l'authentification des connexions via SASL.

= A quoi ça sert ? =

L'authentification permet de connaître précisément l'utilisateur qui demande l'accès au services offerts. Cela permet alors de donner des droits supplémentaires pour à ces utilisateurs authentifiés, droits qu'on ne donnerait pas forcément à des utilisateurs quelconques (anonymes).

Le standard SASL ajoute un dialogue entre le client et le serveur pour choisir la méthode d'authentification à utiliser, ce qui autorise plus de souplesse qu'avec une simple authentification par un certificat TLS/SSL.

Un exemple d'utilisation concrète est de pouvoir offrir un service qui permet à tous vos utilisateurs d'envoyer des messages via votre serveur, même s'ils sont en dehors de votre réseau local. Normalement, puisque nos serveurs ne sont pas ouverts au relayage, ce n'est pas possible : on active donc un système qui permet aux utilisateurs de s'authentifier sur le serveur. Une fois qu'ils seront authentifiés avec leur nom d'utilisateur et leur mot de passe, on leur permet d'utiliser le serveur pour envoyer des messages à n'importe qui.

= Pré-requis IMPORTANT : chiffrement des communications en TLS =

Afin de pouvoir s'authentifier en toute sécurité, il est très fortement conseillé d'activer le [[../Chiffrement|chiffrement TLS]] des connexions SMTP. C'est même '''indispensable''' pour la configuration présentée ici, car on y utilise le mécanisme `PLAIN` qui consiste à transmettre le mot de passe en clair lors de l'authentification. Ceci est souvent nécessaire pour les mécanismes sous-jacents, qui doivent recevoir le mot de passe « tel quel » afin de le crypter avec leur propre algorithme.


= La méthode préférée =
Cette méthode est valable à partir de Postfix version 2.3

== Principe de ce que nous allons mettre en place ==

Voici la chaîne d'authentification que nous allons installer :
{{attachment:SMTP_Auth.png}}

Lors d'une demande d'authentification :
 1. Postfix reçoit un login et un mot de passe
 1. Il passe à dovecot.
 1. Ce démon est configuré pour intérroger la base MySQL afin de vérifier le login + mot de passe reçu.
 1. Si la requête renvoie un résultat, c'est que c'est bon. La réponse (1 ou 0, oui ou non) "remonte" la chaîne jusqu'à Postfix.

== Configuration postfix et dovecot ==

On suppose que Postfix et Dovecot sont déjà installés

Le fichier /etc/dovecot/dovecot.conf

{{{
   auth default {
      socket listen {
        client {
          # Assuming the default Postfix $queue_directory setting
          path = /var/spool/postfix/private/auth
          mode = 0660
          # Assuming the default Postfix user and group
          user = postfix
          group = postfix
        }
      }
   }
}}}

Le fichier /etc/postfix/main.cf

{{{
   smtpd_sasl_auth_enable = yes
   smtpd_sasl_type = dovecot
   smtpd_sasl_path = private/auth
   smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
}}}

Attn: avec l'option permit_mynetworks, les machines qui sont listées dans mynetworks= n'ont pas besoin d'authentifier pour envoyer des mails. Pour tester il faut obliger l'option d'authentification dans Thunderbird


= La 2eme méthode =
Cette méthode est obsolète, mais on la conserve car il peut y avoir des cas où ce sera utile (un postfix avec authentification, mais sans boîtes aux lettres donc sans dovecot)

== Principe de ce que nous allons mettre en place ==

Voici la chaîne d'authentification que nous allons installer :
 . {{attachment:postfix-sasl-pam-mysql.png}}

Lors d'une demande d'authentification :
 1. Postfix reçoit un login et un mot de passe
 1. Il passe par sa composante SASL. Celle-ci interroge un démon `saslauthd`.
 1. Ce démon est configuré pour demander au système PAM
 1. PAM utilise le module `pam_mysql.so` qui effecture une requête SQL afin de vérifier le login + mot de passe reçu.
 1. Si la requête renvoie un (et un seul) résultat, c'est que c'est bon. La réponse (1 ou 0, oui ou non) "remonte" la chaîne jusqu'à Postfix.
 1. Ouf !

Et tout cela sans serveur Radius ! ;)




== Installation des outils ==

On suppose que Postfix et MySQL sont déjà présents.

Il faut installer les modules SASL et les programmes nécessaires (dont le démon d'authentification `saslauthd`) :
 {{{
# aptitude install libsasl2-modules sasl2-bin
}}}

On installe aussi le module de PAM qui permet d'interroger une base MySQL :
 {{{
# aptitude install libpam-mysql
 }}}

== Configuration du démon d'authentification saslauthd ==

Ce démon sera interrogé par les systèmes qui veulent faire de l'authentification. C'est lui qui saura quel module contacter. La configuration se fait dans `/etc/default/saslauthd` :

 {{{
# extrait de /etc/default/saslauthd :
START=yes
# le mécanisme à utiliser (PAM est sans doute le plus générique)
MECHANISMS="pam"
MECH_OPTIONS=""
# 5 processus en parallèle, ça suffit :
THREADS=5
# Très important pour Postfix : (lire "man saslauthd")
# option -m : pour Postfix, qui tourne en chroot
# option -r : construit un identifiant prenom.nom@domain
OPTIONS="-r -m /var/spool/postfix/var/run/saslauthd"
}}}

Il faut ensuite rendre le service d'authentification disponible depuis l'environnement ''chroot'' de Postfix :

 {{{
# invoke-rc.d saslauthd start # start/stop : astuce pour créer le répertoire /var/run/salsauthd
# invoke-rc.d saslauthd stop
# mkdir -p /var/spool/postfix/var/run
# mv /var/run/saslauthd /var/spool/postfix/var/run/
# ln -s /var/spool/postfix/var/run/saslauthd /var/run/
# adduser postfix sasl # ajoute postfix au groupe sasl (faire "id postfix" pour vérifier)
# invoke-rc.d saslauthd start
}}}

== Configuration de PAM pour utiliser MySQL ==

Nous avons dit à `saslauthd` d'utiliser PAM (Pluggable Authentication Modules). Il faut donc configurer PAM pour lui dire d'aller chercher les informations d'authentification dans MySQL.

On installe le module de PAM qui permet d'interroger une base MySQL :
 {{{
# aptitude install libpam-mysql}}}

Et on configure PAM pour lui dire d'utiliser ce module pour le service ``smtp`` (fichier `/etc/pam.d/smtp`) :
 {{{
# fichier /etc/pam.d/smtp
# attention, c'est sur deux lignes seulement (votre navigateur les coupe certainement) :
auth required pam_mysql.so user=messagerie passwd=vousrevez host=127.0.0.1 db=mail table=utilisateurs usercolumn=source passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=messagerie passwd=vousrevez host=127.0.0.1 db=mail table=utilisateurs usercolumn=source passwdcolumn=password crypt=1
}}}

Dans cet exemple, nous avons un serveur MySQL local (127.0.0.1), avec une base ''mail'' qui contient une table ''adresses'' dans laquelle on trouve les colonnes ''source'' (le login, de type `prenom.nom``@auf.``org`) et ''password''.

Pour plus d'information, la documentation d'utilisation du module PAM est dans `/usr/share/doc/libpam-mysql/README.gz`

Note : pour que l'authentification soit validée, la requête SQL ne doit renvoyer '''une seule''' ligne de résultat. Dans tous les autres cas, `pam_mysql.so` considère que l'authentification a échoué. C'est bon à savoir quand on a des tables un petit peu plus complexes que des simples couples login/password.
Ligne 16: Ligne 154:
=== Authentification via PAM, LDAP ou IMAP ===

Il faut ici utiliser l'authentification externe via `saslauthd`.

Pour ce faire, il faut installer les outils SASL :
{{{
$ sudo aptitude install sasl2-bin
}}}

On indiquera le système d'authentification dans `/etc/postfix/sasl/smtpd.conf` :
{{{
SASL est prêt, on va maintenant demander à Postfix de l'utiliser.

On précise le système d'authentification de SASL dans `/etc/postfix/sasl/smtpd.conf`. Dans notre cas, on passe par `saslauthd` :
 {{{
# dans /etc/postfix/sasl/smtpd.conf :
Ligne 29: Ligne 161:
}}}

On spécifiera la méthode d'authentification dans `/etc/default/saslauthd` :
{{{
START=yes
MECHANISMS="pam"
}}}
ou bien :
{{{
START=yes
MECHANISMS="ldap"
}}}
ou encore :
{{{
START=yes
MECHANISMS="rimap"
PARAMS="-O localhost" # serveur imap
}}}

Pour LDAP il faudra alors créer un fichier supplémentaire `/etc/saslauthd.conf` :
{{{
ldap_servers: ldap://127.0.0.1/
ldap_search_base: o=AuF
ldap_filter: mail=%U@auf.org
ldap_use_sasl: no
ldap_auth_method: bind
}}}
Voir `/usr/share/doc/sasl2-bin/LDAP_SASLAUTHD.gz` pour les options disponibles.

Il faut ensuite rendre le service d'authentification disponible depuis l'environnement de Postfix :
{{{
$ sudo invoke-rc.d saslauthd start # astuce pour créer le répertoire de travail
$ sudo invoke-rc.d saslauthd stop
$ sudo mkdir -p /var/spool/postfix/var/run
$ sudo mv /var/run/saslauthd /var/spool/postfix/var/run/
$ sudo ln -s /var/spool/postfix/var/run/saslauthd /var/run/
$ sudo usermod -G $(id -Gn postfix | tr ' ' ','),sasl postfix # pour ajouter postfix au groupe sasl
$ sudo invoke-rc.d saslauthd start
}}}

=== Authentification via MySQL ===

<!> Attention : cette solution n'a pas encore été testée !

Dans ce cas on n'a pas besoin de `saslauthd` mais il faut en revanche installer les modules SQL :
{{{
$ sudo aptitude install libsasl2-modules-sql
}}}

Voici un exemple de configuration dans `/etc/postfix/sasl/smtpd.conf` :
{{{
pwcheck_method: auxprop
mech_list: PLAIN LOGIN ANONYMOUS
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: localhost
sql_user: postfix
sql_passwd: XXXXX
sql_database: system
sql_select: SELECT password FROM system WHERE username='%u'
}}}

== Configuration de Postfix pour utiliser SASL ==

On pourra utiliser l'extrait de configuration suivant dans `/etc/postfix/main.cf` :
{{{
# n'offrir la possibilité de s'authentifier *que* si on est sécurisé via TLS
log_level: 7
}}}

Ensuite on active le système SASL au niveau de `/etc/postfix/main.cf` :
 {{{
# activation de l'authentification :
smtpd_sasl_auth_enable = yes

# modifiez votre option smtpd_recipient_restrictions pour y ajouter une permission
# au niveau SASL : les clients authentifiés pourront utiliser le serveur pour envoyer
# des messages à qui il veulent (pas de restrictions sur les "recipients") :
# smtpd_recipient_restrictions = (...), permit_sasl_authenticated, reject_unauth_destination
# Sur une configuration classique, cela sera :
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

# IMPORTANT : n'offrir la possibilité de s'authentifier *que* si le canal
# est sécurisé via TLS (il faut donc aussi activer TLS)
# voir http://wiki.auf.org/wikiteki/Postfix/Chiffrement
Ligne 97: Ligne 180:

#===== SASL
# compatibilité avec les clients bogués (de chez Micro$oft...)
#broken_sasl_auth_clients = yes
#----- connexion entrante
smtpd_sasl_auth_enable = yes
#smtpd_sasl_security_options = noanonymous, noplaintext
#----- connexion sortante
#smtp_sasl_auth_enable = no
#smtp_sasl_password_maps = hash:$config_directory/saslpass
#smtp_sasl_security_options = noplaintext, noanonymous

# filtrage des envois pour n'autoriser que ceux authentifiés
smtpd_recipient_restrictions = ..., permit_sasl_authenticated, reject_unauth_destination
}}}

Il faut bien évidement penser à redémarrer (et non recharger) Postfix :
{{{
$ sudo invoke-rc.d postfix restart
}}}

== Filtrage des envois selon l'adél de l'émetteur ==

Après authentification, Postfix permet également de vérifier la ou les adéls utilisées par l'émetteur (pas obligatoire, mais peut être utile pour stopper les pourriels).

Par exemple, j'ai créé un fichier `/etc/postfix/sender_login` contenant :
{{{
bilou@microsoft.com bgates
}}}
(Ne pas oublier de lancer `postmap /etc/postfix/sender_login`.)

Puis j'ai ajouté les lignes suivantes dans `/etc/postfix/main.cf` :
{{{
}}}

Il faut ensuite redémarrer Postfix :
{{{
# invoke-rc.d postfix restart
}}}


 ||<#ffa000> L'authentification doit fonctionner à partir de ce moment là. ||

== Erreurs classiques ==

 * `no SASL authentication mechanisms`
  Vérifiez que les mécanismes d'authentification du client, de `postfix` (option `smtpd_sasl_security_options`) et de `saslauthd` sont compatibles. En particulier vérifiez que vous n'avez pas mis à la fois `mech_list: PLAIN` et `smtpd_sasl_security_options = noplaintext`.

 * `Sender address rejected: not logged in`
  Vous avez bien mis une ligne pour votre adél dans le fichier `sender_login`, mais vous avez sans doute oublié d'activer l'authentification SMTP du coté client.
  Autre cas possible : vous utilisez un filtre de contenu et votre message passe alors deux fois par postfix, la première fois avec authentification et la seconde fois sans (puisque c'est le logiciel de filtrage qui le renvoie). Dans ce cas il faut s'assurer que le fitrage puisse faire son renvoi sans blocage en l'autorisant avant la vérification du login. Par exemple : `smtpd_sender_restrictions = permit_mynetworks, reject_sender_login_mismatch, permit`.

 * `SASL PLAIN authentication failed`
  Si vous ne vous êtes pas trompé de mot de passe, c'est sans doute qu'il y a un problème avec le service d'authentification, par exemple avec `saslauthd`. Dans ce cas, pensez à vérifier `/var/log/auth.log` pour avoir des détails sur le problème.


= Mise en place du port "submission" 587/tcp (RFC 2476) =

Les manipulations décrites ci-dessus permettent d'activer une authentification sécurisée sur le port 25/tcp. Or, dans le cadre de la lutte ant-virus et anti-spam, ce port est de plus en plus souvent filtré dans les réseaux, surtout les réseaux publics. Si nous proposons un service sur le port 25/tcp, il risque donc de ne pas être accessible depuis n'importe où...

Pour ce faire, on va configurer Postfix pour qu'il sache recevoir des connexions sur le port 587/tcp (submission). On imposera que ces connexions soient chiffrées en TLS et on imposera également une authentification SASL. Nous proposerons ainsi à nos utilisateurs un service leur permettant d'envoyer des mails depuis n'importe quel client de messagerie connecté à Internet (le port 587/tcp n'est pas filtré puisqu'il est censé toujours proposer des services avec authentification, donc pas (trop) de spam ni virus).

Cette technique est décrite dans la [[http://www.ietf.org/rfc/rfc2476.txt|RFC 2476]].

Pour activer le service, il suffit de le rajouter dans le fichier `/etc/postfix/master.cf` :

 {{{
# lignes à ajouter dans /etc/postfix/master.cf :
# submission : on ouvre le port 587/tcp sur lequel on impose TLS
# et on n'accepte que les clients authentifiés. Cela impose d'avoir
# déjà configuré TLS et SASL, bien entendu.
# service type private unpriv chroot wakeup maxproc command + args
submission inet n - - - - smtpd
        -o smtpd_tls_security_level=encrypt
        -o smtpd_client_restrictions=permit_sasl_authenticated,reject
}}}

Notes :
 * sur les anciennes versions de Postfix (< 2.3), on indique `smtpd_enforce_tls=yes` au lieu de `smtpd_tls_security_level=encrypt`)
 * ne pas oublier d'ouvrir le port 587/tcp vers le serveur au niveau du parefeu : c'est un service à ouvrir à tout Internet

Ce service est notamment activé sur la messagerie de Montréal, vous trouverez le mode d'emploi côté client ici : MessagerieAufOrg/EnvoiSmtpSortant



= Annexes =

== Filtrage des envois selon l'adresse de l'expéditeur ==

Après authentification, Postfix peut vérifier l'adresse utilisée par l'émetteur. Cela peut être utile pour stopper les virus-pourriels (si vous avez encore des clients Outlook et compagnie), éventuellement de limiter les possibilités usurpations.

On utilise pour cela la table ''smtpd_sender_login_maps'' qui établit une correspondance entre une adresse et le login correspondant, c'est-à-dire l'utilisateur authentifié qui aura le droit d'utiliser l'adresse. Par exemple on crée un fichier `/etc/postfix/sender_login` :
 {{{
# /etc/postfix/sender_login
# après chaque modif, lancer : postmap /etc/postfix/sender_login
jean-christophe.andre@auf.org progfou
thomas.noel@auf.org thomas
}}}

Puis on demande à Postfix de faire une restriction par rapport à cette table :
 {{{
# extrait de /etc/postfix/main.cf
Ligne 133: Ligne 252:
(Ne pas oublier de recharger Postfix.)

Après cela, l'utilisateur `bgates` ne peut plus utiliser d'autre adresse que `bilou@microsoft.com` faute de quoi son envoi sera simplement rejeté, ce avant même d'être mis dans la queue d'envoi.

== Discussions ==
 . ThomasNoël : On peut pas faire du SASL sans TLS ? Les mots de passe ne circulent pas en clair de toute façon, non ?
  . JeanChristopheAndré : Oui, on peut, en utilisant une authentification plus forte que le simple PLAIN (mot de passe encodé en base64) ; la config ci-dessus marche avec Mozilla mais je n'ai pas encore testé avec les outils Micro$oft...
  . JeanChristopheAndré : Ma priorité était surtout d'empêcher les virus de sortir via le port SMTP, ce qui fonctionne bougrement bien ! Pour un nomade il suffira de le configurer pour utiliser un accès SMTP authentifié sur le serveur de Montréal ou celui de Paris (s'assurer que les filtrages soient ouverts à cet effet), et éventuellement créer un login+mdp pour les invités qui l'utiliseront pour sortir en SMTP le temps de leur passage chez nous.

Après cela, l'utilisateur `progfou` ne peut plus utiliser d'adresse d'expédition autre que <<MailTo(jean-christophe DOT NOSPAM andre AT auf DOT org)>>, faute de quoi son envoi sera simplement rejeté, ce avant même d'être mis dans la queue d'envoi.

== Filtrage des envois selon utilisateur pour certaines adresses seulement ==

La restriction ci-dessus est un peu rude : elle impose une vérification de toutes les adresse d'expédition. On peut préférer laisser les utilisateurs authentifiés utiliser notre serveur avec d'autres adresses. (La trace de l'authentifiant sera dans les entêtes des mails, donc on pourra facilement détecter une usurpation éventuelle). En revanche, on veut être sûr que pour les domaines gérés localement (comme @xx.refer.org ou @auf.org), il n'y aura pas d'usurpation.

Autrement dit, on veut laisser les utilisateurs envoyer (aprés authentification) des mails depuis des domaines externes (@gmail.com ou @free.fr par exemple) et ne faire la vérification de l'adresse d'expéditeur que pour certaines adresses spécifiques (typiquement les adresses gérées localement).

La configuration du {{{smtpd_sender_login_maps}}} reste similaire à celle indiquée ci-dessus, mais s'y ajoute une table listant les adresses pour lesquelles la vérification doit se faire :

{{{
# /etc/postfix/adresses_avec_login
# Pour chaque des adresses indiquée, on déclare qu'il faut
# refuser le mail si l'utilisateur authentifié ne correspond pas
# NB : cela implique que l'authentifiant SASL doit être l'adresse mail
raymonde.dugenoux@auf.org reject_sender_login_mismatch
}}}

ou, de manière plus radicale, pour tout un domaine :
{{{
# /etc/postfix/adresses_avec_login
# Toute adresses du domaine @auf.org ne pourra être l'adresse
# de l'expéditeur QUE si le mail est envoyé par l'utilisateur
# authentifié
auf.org reject_sender_login_mismatch
}}}

puis dans le main.cf on ajoute une vérification :
{{{
smtpd_sender_restrictions = ..., check_sender_access hash:/etc/postfix/adresses_avec_login, ...
}}}

Cette page présente une façon de configurer Postfix afin d'y activer l'authentification des connexions via SASL.

A quoi ça sert ?

L'authentification permet de connaître précisément l'utilisateur qui demande l'accès au services offerts. Cela permet alors de donner des droits supplémentaires pour à ces utilisateurs authentifiés, droits qu'on ne donnerait pas forcément à des utilisateurs quelconques (anonymes).

Le standard SASL ajoute un dialogue entre le client et le serveur pour choisir la méthode d'authentification à utiliser, ce qui autorise plus de souplesse qu'avec une simple authentification par un certificat TLS/SSL.

Un exemple d'utilisation concrète est de pouvoir offrir un service qui permet à tous vos utilisateurs d'envoyer des messages via votre serveur, même s'ils sont en dehors de votre réseau local. Normalement, puisque nos serveurs ne sont pas ouverts au relayage, ce n'est pas possible : on active donc un système qui permet aux utilisateurs de s'authentifier sur le serveur. Une fois qu'ils seront authentifiés avec leur nom d'utilisateur et leur mot de passe, on leur permet d'utiliser le serveur pour envoyer des messages à n'importe qui.

Pré-requis IMPORTANT : chiffrement des communications en TLS

Afin de pouvoir s'authentifier en toute sécurité, il est très fortement conseillé d'activer le chiffrement TLS des connexions SMTP. C'est même indispensable pour la configuration présentée ici, car on y utilise le mécanisme PLAIN qui consiste à transmettre le mot de passe en clair lors de l'authentification. Ceci est souvent nécessaire pour les mécanismes sous-jacents, qui doivent recevoir le mot de passe « tel quel » afin de le crypter avec leur propre algorithme.

La méthode préférée

Cette méthode est valable à partir de Postfix version 2.3

Principe de ce que nous allons mettre en place

Voici la chaîne d'authentification que nous allons installer : SMTP_Auth.png

Lors d'une demande d'authentification :

  1. Postfix reçoit un login et un mot de passe
  2. Il passe à dovecot.
  3. Ce démon est configuré pour intérroger la base MySQL afin de vérifier le login + mot de passe reçu.
  4. Si la requête renvoie un résultat, c'est que c'est bon. La réponse (1 ou 0, oui ou non) "remonte" la chaîne jusqu'à Postfix.

Configuration postfix et dovecot

On suppose que Postfix et Dovecot sont déjà installés

Le fichier /etc/dovecot/dovecot.conf

   auth default {
      socket listen {
        client {
          # Assuming the default Postfix $queue_directory setting
          path = /var/spool/postfix/private/auth
          mode = 0660
          # Assuming the default Postfix user and group
          user = postfix
          group = postfix
        }
      }
   }

Le fichier /etc/postfix/main.cf

   smtpd_sasl_auth_enable = yes
   smtpd_sasl_type = dovecot
   smtpd_sasl_path = private/auth
   smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

Attn: avec l'option permit_mynetworks, les machines qui sont listées dans mynetworks= n'ont pas besoin d'authentifier pour envoyer des mails. Pour tester il faut obliger l'option d'authentification dans Thunderbird

La 2eme méthode

Cette méthode est obsolète, mais on la conserve car il peut y avoir des cas où ce sera utile (un postfix avec authentification, mais sans boîtes aux lettres donc sans dovecot)

Principe de ce que nous allons mettre en place

Voici la chaîne d'authentification que nous allons installer :

  • postfix-sasl-pam-mysql.png

Lors d'une demande d'authentification :

  1. Postfix reçoit un login et un mot de passe
  2. Il passe par sa composante SASL. Celle-ci interroge un démon saslauthd.

  3. Ce démon est configuré pour demander au système PAM
  4. PAM utilise le module pam_mysql.so qui effecture une requête SQL afin de vérifier le login + mot de passe reçu.

  5. Si la requête renvoie un (et un seul) résultat, c'est que c'est bon. La réponse (1 ou 0, oui ou non) "remonte" la chaîne jusqu'à Postfix.
  6. Ouf !

Et tout cela sans serveur Radius ! ;)

Installation des outils

On suppose que Postfix et MySQL sont déjà présents.

Il faut installer les modules SASL et les programmes nécessaires (dont le démon d'authentification saslauthd) :

  • # aptitude install libsasl2-modules sasl2-bin

On installe aussi le module de PAM qui permet d'interroger une base MySQL :

  • # aptitude install libpam-mysql

Configuration du démon d'authentification saslauthd

Ce démon sera interrogé par les systèmes qui veulent faire de l'authentification. C'est lui qui saura quel module contacter. La configuration se fait dans /etc/default/saslauthd :

  • # extrait de /etc/default/saslauthd :
    START=yes
    # le mécanisme à utiliser (PAM est sans doute le plus générique)
    MECHANISMS="pam"
    MECH_OPTIONS=""
    # 5 processus en parallèle, ça suffit :
    THREADS=5
    # Très important pour Postfix : (lire "man saslauthd")
    # option -m : pour Postfix, qui tourne en chroot
    # option -r : construit un identifiant prenom.nom@domain
    OPTIONS="-r -m /var/spool/postfix/var/run/saslauthd"

Il faut ensuite rendre le service d'authentification disponible depuis l'environnement chroot de Postfix :

  • # invoke-rc.d saslauthd start   # start/stop : astuce pour créer le répertoire /var/run/salsauthd
    # invoke-rc.d saslauthd stop
    # mkdir -p /var/spool/postfix/var/run
    # mv /var/run/saslauthd /var/spool/postfix/var/run/
    # ln -s /var/spool/postfix/var/run/saslauthd /var/run/
    # adduser postfix sasl         # ajoute postfix au groupe sasl (faire "id postfix" pour vérifier)
    # invoke-rc.d saslauthd start

Configuration de PAM pour utiliser MySQL

Nous avons dit à saslauthd d'utiliser PAM (Pluggable Authentication Modules). Il faut donc configurer PAM pour lui dire d'aller chercher les informations d'authentification dans MySQL.

On installe le module de PAM qui permet d'interroger une base MySQL :

  • # aptitude install libpam-mysql

Et on configure PAM pour lui dire d'utiliser ce module pour le service smtp (fichier /etc/pam.d/smtp) :

  • # fichier /etc/pam.d/smtp
    # attention, c'est sur deux lignes seulement (votre navigateur les coupe certainement) :
    auth required pam_mysql.so user=messagerie passwd=vousrevez host=127.0.0.1 db=mail table=utilisateurs usercolumn=source passwdcolumn=password crypt=1
    account sufficient pam_mysql.so user=messagerie passwd=vousrevez host=127.0.0.1 db=mail table=utilisateurs usercolumn=source passwdcolumn=password crypt=1

Dans cet exemple, nous avons un serveur MySQL local (127.0.0.1), avec une base mail qui contient une table adresses dans laquelle on trouve les colonnes source (le login, de type prenom.nom@auf.org) et password.

Pour plus d'information, la documentation d'utilisation du module PAM est dans /usr/share/doc/libpam-mysql/README.gz

Note : pour que l'authentification soit validée, la requête SQL ne doit renvoyer une seule ligne de résultat. Dans tous les autres cas, pam_mysql.so considère que l'authentification a échoué. C'est bon à savoir quand on a des tables un petit peu plus complexes que des simples couples login/password.

Configuration de l'authentification SASL de Postfix

SASL est prêt, on va maintenant demander à Postfix de l'utiliser.

On précise le système d'authentification de SASL dans /etc/postfix/sasl/smtpd.conf. Dans notre cas, on passe par saslauthd :

  • # dans /etc/postfix/sasl/smtpd.conf :
    pwcheck_method: saslauthd
    mech_list: PLAIN LOGIN ANONYMOUS
    log_level: 7

Ensuite on active le système SASL au niveau de /etc/postfix/main.cf :

  • # activation de l'authentification :
    smtpd_sasl_auth_enable = yes
    
    # modifiez votre option smtpd_recipient_restrictions pour y ajouter une permission
    # au niveau SASL : les clients authentifiés pourront utiliser le serveur pour envoyer
    # des messages à qui il veulent (pas de restrictions sur les "recipients") :
    # smtpd_recipient_restrictions = (...), permit_sasl_authenticated, reject_unauth_destination
    # Sur une configuration classique, cela sera :
    smtpd_recipient_restrictions =  permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
    
    # IMPORTANT : n'offrir la possibilité de s'authentifier *que* si le canal
    # est sécurisé via TLS (il faut donc aussi activer TLS)
    # voir http://wiki.auf.org/wikiteki/Postfix/Chiffrement
    smtpd_tls_auth_only = yes

Il faut ensuite redémarrer Postfix :

# invoke-rc.d postfix restart
  • L'authentification doit fonctionner à partir de ce moment là.

Erreurs classiques

  • no SASL authentication mechanisms

    • Vérifiez que les mécanismes d'authentification du client, de postfix (option smtpd_sasl_security_options) et de saslauthd sont compatibles. En particulier vérifiez que vous n'avez pas mis à la fois mech_list: PLAIN et smtpd_sasl_security_options = noplaintext.

  • Sender address rejected: not logged in

    • Vous avez bien mis une ligne pour votre adél dans le fichier sender_login, mais vous avez sans doute oublié d'activer l'authentification SMTP du coté client. Autre cas possible : vous utilisez un filtre de contenu et votre message passe alors deux fois par postfix, la première fois avec authentification et la seconde fois sans (puisque c'est le logiciel de filtrage qui le renvoie). Dans ce cas il faut s'assurer que le fitrage puisse faire son renvoi sans blocage en l'autorisant avant la vérification du login. Par exemple : smtpd_sender_restrictions = permit_mynetworks, reject_sender_login_mismatch, permit.

  • SASL PLAIN authentication failed

    • Si vous ne vous êtes pas trompé de mot de passe, c'est sans doute qu'il y a un problème avec le service d'authentification, par exemple avec saslauthd. Dans ce cas, pensez à vérifier /var/log/auth.log pour avoir des détails sur le problème.

Mise en place du port "submission" 587/tcp (RFC 2476)

Les manipulations décrites ci-dessus permettent d'activer une authentification sécurisée sur le port 25/tcp. Or, dans le cadre de la lutte ant-virus et anti-spam, ce port est de plus en plus souvent filtré dans les réseaux, surtout les réseaux publics. Si nous proposons un service sur le port 25/tcp, il risque donc de ne pas être accessible depuis n'importe où...

Pour ce faire, on va configurer Postfix pour qu'il sache recevoir des connexions sur le port 587/tcp (submission). On imposera que ces connexions soient chiffrées en TLS et on imposera également une authentification SASL. Nous proposerons ainsi à nos utilisateurs un service leur permettant d'envoyer des mails depuis n'importe quel client de messagerie connecté à Internet (le port 587/tcp n'est pas filtré puisqu'il est censé toujours proposer des services avec authentification, donc pas (trop) de spam ni virus).

Cette technique est décrite dans la RFC 2476.

Pour activer le service, il suffit de le rajouter dans le fichier /etc/postfix/master.cf :

  • # lignes à ajouter dans /etc/postfix/master.cf :
    # submission : on ouvre le port 587/tcp sur lequel on impose TLS
    # et on n'accepte que les clients authentifiés. Cela impose d'avoir
    # déjà configuré TLS et SASL, bien entendu.
    # service  type private unpriv  chroot  wakeup  maxproc command + args
    submission inet n       -       -       -       -       smtpd
            -o smtpd_tls_security_level=encrypt
            -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Notes :

  • sur les anciennes versions de Postfix (< 2.3), on indique smtpd_enforce_tls=yes au lieu de smtpd_tls_security_level=encrypt)

  • ne pas oublier d'ouvrir le port 587/tcp vers le serveur au niveau du parefeu : c'est un service à ouvrir à tout Internet

Ce service est notamment activé sur la messagerie de Montréal, vous trouverez le mode d'emploi côté client ici : MessagerieAufOrg/EnvoiSmtpSortant

Annexes

Filtrage des envois selon l'adresse de l'expéditeur

Après authentification, Postfix peut vérifier l'adresse utilisée par l'émetteur. Cela peut être utile pour stopper les virus-pourriels (si vous avez encore des clients Outlook et compagnie), éventuellement de limiter les possibilités usurpations.

On utilise pour cela la table smtpd_sender_login_maps qui établit une correspondance entre une adresse et le login correspondant, c'est-à-dire l'utilisateur authentifié qui aura le droit d'utiliser l'adresse. Par exemple on crée un fichier /etc/postfix/sender_login :

  • # /etc/postfix/sender_login
    # après chaque modif, lancer : postmap /etc/postfix/sender_login
    jean-christophe.andre@auf.org progfou
    thomas.noel@auf.org thomas

Puis on demande à Postfix de faire une restriction par rapport à cette table :

  • # extrait de /etc/postfix/main.cf
    smtpd_sender_login_maps = hash:$config_directory/sender_login
    smtpd_sender_restrictions = ..., reject_sender_login_mismatch, ...

Après cela, l'utilisateur progfou ne peut plus utiliser d'adresse d'expédition autre que <jean-christophe DOT NOSPAM andre AT auf DOT org>, faute de quoi son envoi sera simplement rejeté, ce avant même d'être mis dans la queue d'envoi.

Filtrage des envois selon utilisateur pour certaines adresses seulement

La restriction ci-dessus est un peu rude : elle impose une vérification de toutes les adresse d'expédition. On peut préférer laisser les utilisateurs authentifiés utiliser notre serveur avec d'autres adresses. (La trace de l'authentifiant sera dans les entêtes des mails, donc on pourra facilement détecter une usurpation éventuelle). En revanche, on veut être sûr que pour les domaines gérés localement (comme @xx.refer.org ou @auf.org), il n'y aura pas d'usurpation.

Autrement dit, on veut laisser les utilisateurs envoyer (aprés authentification) des mails depuis des domaines externes (@gmail.com ou @free.fr par exemple) et ne faire la vérification de l'adresse d'expéditeur que pour certaines adresses spécifiques (typiquement les adresses gérées localement).

La configuration du smtpd_sender_login_maps reste similaire à celle indiquée ci-dessus, mais s'y ajoute une table listant les adresses pour lesquelles la vérification doit se faire :

# /etc/postfix/adresses_avec_login
# Pour chaque des adresses indiquée, on déclare qu'il faut
# refuser le mail si l'utilisateur authentifié ne correspond pas
# NB : cela implique que l'authentifiant SASL doit être l'adresse mail
raymonde.dugenoux@auf.org  reject_sender_login_mismatch

ou, de manière plus radicale, pour tout un domaine :

# /etc/postfix/adresses_avec_login
# Toute adresses du domaine @auf.org ne pourra être l'adresse
# de l'expéditeur QUE si le mail est envoyé par l'utilisateur
# authentifié
auf.org  reject_sender_login_mismatch

puis dans le main.cf on ajoute une vérification :

smtpd_sender_restrictions = ..., check_sender_access hash:/etc/postfix/adresses_avec_login, ...

Postfix/Authentification (dernière édition le 2012-05-03 08:27:00 par TruongTungLam)