Postfix est certainement un des meilleurs serveurs d'e-mail existant, c'est pourquoi mon choix se porte sur celui-ci. Le sujet des e-mails est un sujet compliqué ou les documentations sont nombreuses et confusent assez souvent, je n'en ferai aujourd'hui toujours pas ma spécialité. Je vais donc ne pas m'étendre sur ce sujet.

Nous voulons ici créer un serveur MX principal qui recevra nos mails et les enverra au reste du monde. Nous souhaitons pouvoir envoyé des e-mails depuis ce serveur depuis n'importe où. Dans cette configuration pour ne pas finir en open relay, il n'y a que l'authentification SMTP qui puisse nous protégé de ceci. J'ai testé auparavant le pop-before-smtp qui permet d'en faire autant mais ce n'est qu'un bricolage face à l'authentification SMTP. C'est pourquoi ici on fera une véritable authentification bien sur avec un peu de SSL.

Commençons par installer Postfix et ce qui sera nécessaire à l'authentification SMTP.

  1. ALBAN@bebeserv:~$ sudo -i
  2. Password:
  3. bebeserv:~# apt-get update
  4. [...]
  5. bebeserv:~# apt-get install postfix libsasl2-modules sasl2-bin
  6. [...]

L'installateur vous pose deux questions pour la configuration de Postfix. Répondez à la première "Site internet" et laisser la seconde qui devrait ressembler à « bebeserv.bebenet.local » tel quel.

Maintenant que c'est fait, stoppez Postfix :

  1. bebeserv:~# /etc/init.d/postfix stop
  2. [...]

Maintenant configurons notre serveur d'e-mail :

  1. bebeserv:~# cd /etc/postfix
  2. bebeserv:/etc/postfix# nano main.cf

Afin de garantir la sécurité du MTA faisons le passer pour un serveur Sendmail (un concurrent plus ancien) :

  1. mail_name = Sendmail
  2. mail_version = 8.12.10
  3. smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)

Maintenant quelques fonctionnalités et configuration :

  1. append_dot_mydomain = yes
  2. mynetwork_style = host
  3. proxy_interfaces = 10.0.0.1
  4. relay_domains=
  5. masquerade_domains = bebenet.local
  6. local_transport = virtual:$myhostname

Les utilisateurs virtuels

  1. virtual_alias_domains = hash:/etc/postfix/conf.d/virtual_alias_domains
  2. virtual_alias_maps = hash:/etc/postfix/conf.d/virtual_alias
  3. virtual_mailbox_domains = hash:/etc/postfix/conf.d/virtual_mailbox_domains
  4. virtual_mailbox_base = /var/mail/virtual
  5. virtual_mailbox_maps = hash:/etc/postfix/conf.d/virtual_mailbox
  6. virtual_uid_maps = static:5000
  7. virtual_gid_maps = static:5000

Encore un peu de sécurité et pour l'authentification SMTP

  1. smtp_helo_timeout = 10s
  2. smtpd_recipients_limit = 16
  3. smtpd_soft_error_limit = 3
  4. smtpd_hard_error_limit = 12
  5. smtpd_helo_required = yes
  6. smtpd_delay_reject = yes
  7. disable_vrfy_command = yes
  8. strict_rfc821_envelopes = yes
  9.  
  10. broken_sasl_auth_clients = yes
  11. smtpd_sasl_auth_enable = yes
  12. smtpd_sasl_path = smtpd
  13. smtpd_sasl_exceptions_networks = $mynetworks
  14. smtpd_sasl_security_options = noanonymous
  15.  
  16.  
  17. smtpd_helo_restrictions =
  18. permit_mynetworks,
  19. reject_invalid_hostname,
  20. reject_unknown_hostname,
  21. reject_non_fqdn_hostname
  22.  
  23. smtpd_client_restrictions =
  24. sleep 1,
  25. reject_unauth_pipelining
  26.  
  27. smtpd_recipient_restrictions =
  28. permit_mynetworks,
  29. permit_sasl_authenticated,
  30. reject_invalid_hostname,
  31. reject_unauth_destination,
  32. reject_unknown_sender_domain,
  33. reject_unknown_recipient_domain,
  34. reject_non_fqdn_recipient
  35.  
  36. smtpd_sender_restrictions =
  37. reject_unknown_sender_domain,
  38. reject_non_fqdn_sender,


Pour le SSL :

  1. smtpd_use_tls=yes
  2. smtpd_tls_cert_file = /etc/postfix/smtpd.cert
  3. smtpd_tls_key_file = /etc/postfix/smtpd.key

Enregistrez et quittez. Générons directement les nouveaux certificats SSL pour Postfix :

  1. bebeserv:/etc/postfix# openssl req -new -outform PEM -out /etc/postfix/smtpd.cert -newkey rsa:2048 -nodes -keyout /etc/postfix/smtpd.key -keyform PEM -days 365 -x509
  2. bebeserv:/etc/postfix# chmod 640 smtpd.key

Le fait d'utiliser Sasl (un serveur d'authentification) nous impose de lui montré comment nous souhaitons authentifier les utilisateurs : Pour ceci nous créons comme précisé par notre configuration : « smtpd_sasl_path » le fichier « /etc/postfix/sasl/smtpd.conf »

  1. bebeserv:/etc/postfix# cd sasl
  2. bebeserv:/etc/postfix/sasl# nano smtpd.conf

Entrez ceci :

  1. pwcheck_method: saslauthd
  2. mech_list: plain login

Enregistrer et quitter. Visiblement la commande suivante est utile pour remédier à une histoire de bug...

  1. bebeserv:/etc/postfix/sasl# ln -s /etc/postfix/sasl/smtpd.conf /usr/lib/sasl2/smtpd.conf

Éditez le fichier de configuration de Sasl :

  1. bebeserv:/etc/postfix/sasl# nano /etc/default/saslauthd

Modifier les lignes suivantes :

  1. START=yes
  2. MECHANISMS="rimap"
  3. MECH_OPTIONS="localhost"
  4. OPTIONS="-r -c -m /var/spool/postfix/var/run/saslauthd"

Enregistrez et quitter. Maintenant ajoutons l'utilisateur Postfix au groupe Sasl et faisons en sorte que Sasl puisque créer ses fichiers dans la cage de postfix (ça aussi ça ne s'invente pas) :

  1. bebeserv:/etc/postfix/sasl# dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd
  2. bebeserv:/etc/postfix/sasl# adduser postfix sasl
  3. [...]

Maintenant il va falloir alimenter les différentes bases de Postfix :

  1. bebeserv:/etc/postfix/sasl# cd ..
  2. bebeserv:/etc/postfix# mkdir conf.d
  3. bebeserv:/etc/postfix# cd conf.d
  4. bebeserv:/etc/postfix/conf.d# nano virtual_mailbox_domains

Entrez :

  1. bebeserv.local x

Enregistrez et quitter.

  1. bebeserv:/etc/postfix/conf.d# nano virtual_mailbox

Entrez :

  1. test@bebeserv.local bebeserv.local/test/

Enregistrez et quitter.

  1. bebeserv:/etc/postfix/conf.d# nano virtual_alias

Entrez :

  1. postmaster@bebeserv.local test@bebeserv.local
  2. hostmaster@bebeserv.local test@bebeserv.local
  3. webmaster@bebeserv.local test@bebeserv.local
  4. www@bebeserv.local test@bebeserv.local
  5. ALBAN@bebeserv.local test@bebeserv.local

Enregistrez et quitter.

  1. bebeserv:/etc/postfix/conf.d# nano virtual_alias_domains

Entrez :

  1. localhost bebeserv.local

Enregistrez et quitter. Créons maintenant les bases compilées à l'aide de « postmap » :

  1. bebeserv:/etc/postfix/conf.d# postmap virtual_alias
  2. bebeserv:/etc/postfix/conf.d# postmap virtual_alias_domains
  3. bebeserv:/etc/postfix/conf.d# postmap virtual_mailbox
  4. bebeserv:/etc/postfix/conf.d# postmap virtual_mailbox_domains

Redirigeons « root » qui est normalement alias de tous les autres démon vers notre utilisateur principal :

  1. bebeserv:/etc/postfix/conf.d# nano /etc/aliases

Entrez à la fin du fichier :

  1. root: ALBAN

Enregistrez et quittez. Remettons, de la même manière que les autres tables, celle-ci à jour :

  1. bebeserv:/etc/postfix/conf.d# postalias /etc/aliases

Créons l'utilisateur et le groupe « virtual » et le dossier des boites e-mail virtuelles :

  1. bebeserv:/etc/postfix/conf.d# cd /var/mail
  2. bebeserv:/var/mail# mkdir virtual
  3. bebeserv:/var/mail# groupadd -g 5000 virtual
  4. bebeserv:/var/mail# useradd -u 5000 -g virtual -d /var/mail/virtual -s /usr/sbin/nologin virtual
  5. bebeserv:/var/mail# chown virtual.virtual virtual

Parfait ! Maintenant Postfix est fonctionnel et bien configuré. Nous l'avons configuré de sorte que les e-mails émis par les utilisateurs locaux soit traiter par le relay virtual, que localhost soit assimilé à notre domaine, que les sous domaines de notre domaine soit assimilé à notre domaine. Il ne nous reste plus qu'à installer un client IMAP pour lire nos messages.

Installons « courier-imap-ssl » :

  1. bebeserv:/var/mail# apt-get install courier-imap-ssl

Stoppons les serveur nouvellement installés :

  1. bebeserv:/var/mail# /etc/init.d/courier-authdaemon stop
  2. [...]
  3. bebeserv:/var/mail# /etc/init.d/courier-imap stop
  4. [...]
  5. bebeserv:/var/mail# /etc/init.d/courier-imap-ssl stop
  6. [...]

Regénérons un certificat propre à notre domaine pour IMAP :

  1. bebeserv:/var/mail# cd /etc/courier
  2. bebeserv:/etc/courier# rm imapd.pem
  3. bebeserv:/etc/courier# nano imapd.cnf

Modifiez ceci :

  1. [ req_dn ]
  2. C=FR
  3. ST=FRANCE
  4. L=Paris
  5. O=Courier Mail Server
  6. OU=IMAP SSL key
  7. CN=imap.bebenet.local
  8. emailAddress=postmaster@bebenet.local

Enregistrez et quittez. Maintenant créons un beau certificat :

  1. bebeserv:/etc/courier# dpkg-reconfigure courier-imap-ssl
  2. [...]

Ceci fait, ré-arretons le serveur qui a été redémarrer et configurons l'authentification (ici authdaemon à ne pas confondre avec saslauthd) :

  1. bebeserv:/etc/courier# /etc/init.d/courier-imap-ssl stop
  2. [...]
  3. bebeserv:/etc/courier# nano authdaemonrc

Modifiez cette ligne :

  1. authmodulelist="authuserdb"

Enregistrez et quittez. Maintenant nous allons créer la base des utilisateurs qui vont pouvoir se connecter à IMAP. Pour simplifier les choses je vous ai concocté un petit script:

  1. bebeserv:/etc/courier# mkdir userdb
  2. bebeserv:/etc/courier# chmod 0000 userdb
  3. bebeserv:/etc/courier# nano userdb-utils

Entrez ceci :

  1. #!/bin/bash
  2. cd /etc/courier
  3. case "$1" in
  4. add)
  5. if [ $# -lt 2 ]; then
  6. echo "Usage: ./userdb-utils add user@domain.tld"
  7. exit 1
  8. fi
  9. EMAIL=$2
  10. DIR=/var/mail/virtual
  11. USER=$(echo $EMAIL | cut -d@ -f1)
  12. DOMAIN=$(echo $EMAIL | cut -d@ -f2)
  13. userdb $DOMAIN/$EMAIL set mail=$DIR/$DOMAIN/$USER home=$DIR/$DOMAIN/$USER uid=5000 gid=5000
  14. userdbpw -md5 | userdb $DOMAIN/$EMAIL set systempw
  15. makeuserdb
  16. ;;
  17. del)
  18. if [ $# -lt 2 ]; then
  19. echo "Usage: ./userdb-utils del user@domain.tld"
  20. exit 1
  21. fi
  22. TODAY=$(date +%Y%m%d)
  23. FILE=/tmp/userdbcreate$TODAY
  24. EMAIL=$2
  25. USER=$(echo $EMAIL | cut -d@ -f1)
  26. DOMAIN=$(echo $EMAIL | cut -d@ -f2)
  27. DB=/etc/courier/userdb/$DOMAIN
  28. sed -e /^$EMAIL/d $DB > $FILE
  29. rm $DB
  30. mv $FILE $DB
  31. makeuserdb
  32. ;;
  33. list)
  34. authenumerate
  35. ;;
  36. *)
  37. echo "Usage: ./userdb-utils {add|del|list} [user@domain.tld]"
  38. exit 1
  39. esac
  40. exit 0

Enregistrez et quittez. Maintenant rendons notre script exécutable et disponible dans notre banque de script :

  1. bebeserv:/etc/courier# chmod 700 userdb-utils
  2. bebeserv:/etc/courier# ln -s userdb-utils /usr/local/bin/

Ok, créons deux utilisateurs pour voir comment ceci fonctionne :

  1. bebeserv:/etc/courier# ./userdb-utils add test@bebenet.local
  2. Password :
  3. [...]
  4. bebeserv:/etc/courier# ./userdb-utils add test2@bebenet.local
  5. Password :
  6. [...]
  7. bebeserv:/etc/courier# ./userdb-utils list
  8. [...]
  9. bebeserv:/etc/courier# ./userdb-utils del test2@bebenet.local
  10. bebeserv:/etc/courier# ./userdb-utils list
  11. [...]

C'est terminé. Il reste à mettre à jour « iptables »

  1. bebeserv:/etc/courier# nano /etc/network/iptables

Rajouter ces lignes :

  1. iptables -t filter -A INPUT -i eth0 -p tcp --dport 25 -d $MYIP -j ACCEPT
  2. iptables -t filter -A INPUT -i eth0 -p tcp --dport 993 -d $MYIP -j ACCEPT
  3.  
  4. iptables -t filter -A OUTPUT -o eth0 -p tcp --dport 25 -s $MYIP -j ACCEPT
  5. iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 25 -s $MYIP -j ACCEPT
  6. iptables -t filter -A OUTPUT -o eth0 -p tcp --dport 993 -s $MYIP -j ACCEPT
  7. iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 993 -s $MYIP -j ACCEPT

Enregistrez et quittez :

Redémarrons les serveurs :

  1. bebeserv:/var/mail# /etc/init.d/iptables-conf restart
  2. bebeserv:/var/mail# /etc/init.d/postfix start
  3. bebeserv:/var/mail# /etc/init.d/courier-authdaemon start
  4. bebeserv:/var/mail# /etc/init.d/courier-imap-ssl start
  5. bebeserv:/var/mail# /etc/init.d/courier-imap start

Et voilà ! Nos utilisateurs doivent se loguer forcément en IMAP et en SMTP le tout couvert du SSL.

Prochain chapitre on ajoute un antivirus et un antispam !

  1. bebeserv:/var/mail# exit
  2. logout
  3. ALBAN@bebeserv:~$