SMTP/IMAP - Configuration de Postfix/Dovecot
On part du principe qu'une base Unix saine est installée et que le réseau est configuré correctement.
Dans les exemples suivants, on utilisera la commande apk sur un compte root. Pour adapter celles-ci à une installation Debian/Ubuntu, il suffit de remplacer : apk add par apt-get install et d'ajouter sudo au début de chaque commande si le compte root est désactivé.
Voici rapidement une liste des pré-requis :
- Une base Gnu/Linux, avec gestionnaire de paquets ( apt, apk...)
- Ouverture des ports SMTP, IMAP et IMAPS ( 25, 143 et 993 )
- Savoir utiliser la ligne de commande et vi/nano
Serveur SMTP : Postfix
Postfix
Installation
Installation de postfix :
$ apk add postfix
Configuration
Préparation du système
- Ajout d'un utilisateur pour le serveur :
$ adduser vmail
- Récupération de ses UIDs et GIDs ( de la forme 100x:100x ) :
$ grep vmail /etc/passwd
- Ajout de l'utilisateur au groupe postdrop :
$ addgroup vmail postdrop
- Création des répertoires manquants:
$ mkdir /var/spool/mail/vhosts -p
- Changement des permissions sur le dossier:
$ chown vmail:vmail /var/spool/mail/vhosts
Édition du fichier /etc/postfix/main.cf
Ces reglages sont normalement actifs par defaut. Certains d'entre eux sont à décommenter.
soft_bounce = yes queue_directory = /var/spool/postfix command_directory
= /usr/sbin daemon_directory = /usr/lib/postfix data_directory =
/var/lib/postfix mail_owner = postfix myhostname = mail.domaine.com
mydomain = domaine.com myorigin = $myhostname
unknown_local_recipient_reject_code = 550 mynetworks_style = host
relayhost = in_flow_delay = 1s alias_maps = hash:/etc/aliases
home_mailbox = Maildir/ mail_spool_directory = /var/spool/mail
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
debug_peer_level = 2 debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq setgid_group = postdrop html_directory = no
manpage_directory = /usr/share/man sample_directory = /etc/postfix
readme_directory = /usr/share/doc/postfix/readme
Les réglages suivants sont ajoutés à la configuration:
#Definition des domaines virtuels
local_transport = virtual
virtual_mailbox_domains = domaine.tld
virtual_mailbox_base = /var/spool/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
Configuration alternative pour utiliser des uids dynamiques (plus d'une bal)
Si cette ligne est decommentee, penser a créer le fichier:
/etc/postfix/virtual_uids
virtual_uid_maps = hash:/etc/postfix/virtual_uids
virtual_uid_maps = static:1006 virtual_gid_maps = static:1006
virtual_alias_maps = hash:/etc/postfix/valias
Quotas limites de taille
message_size_limit = 10240000 ## 10 Mo par défaut
virtual_mailbox_limit= 10240000 ## 10 Mo par défaut
Réglages de sécurité
smtpd_helo_required = yes disable_vrfy_command = yes
smtpd_recipient_restrictions =
reject_unauth_pipelining,
permit_sasl_authenticated,
permit_mynetworks,
reject_invalid_hostname, reject_non_fqdn_hostname,
reject_non_fqdn_sender, reject_non_fqdn_recipient,
reject_unknown_sender_domain, reject_unknown_recipient_domain,
reject_unauth_destination,
## Reglages a decommenter une fois gross configuré
##check_policy_service inet:127.0.0.1:5525,
## optionnel
##check_client_access regexp:/etc/postfix/blacklist_clients,
permit
## ce travail est fait par grossd, on commente donc.
##reject_rbl_client zen.spamhaus.org,
##reject_rbl_client bl.spamcop.net,
permit
smtpd_data_restrictions = reject_unauth_pipelining, permit
Reglages a decommenter une fois clamsmtp configuré
content_filter = scan:[127.0.0.1]:10025
Édition du fichier /etc/postfix/valias
blah.blah@exemple.net utilisateur1@exemple.net
toc.toc@exemple.net utilisateur1@exemple.net machin@exemple.net
utilisateur2@exemple.net
Édition du fichier /etc/postfix/blacklist_clients
Ce fichier contient une liste d'expressions regexp pour lister les clients auxquels on souhaite refuser l'accès.
- Rejeter un nom de domaine complet
/^example.com$/ REJECT UCE black-listed
- Rejeter un nom de domaine et tous ses sous domaines
/example.com$/ REJECT UCE black-listed
- Rejeter un block d'IPs ou une IP
/^192.168/ REJECT UCE black-listed /^192.168/.1/ REJECT UCE black-listed /^192.168/.1/.1$/ REJECT UCE black-listed
Édition du fichier /etc/postfix/vmailbox
utilisateur1@exemple.net exemple.net/utilisateur1/
utilisateur2@exemple.net exemple.net/utilisateur2/ @exemple.net
example.net/attrapetout ## tous les messages qui ne correspondent pas aux regles ci-dessus
Édition du fichier /etc/postfix/virtual_uids ( optionnel )
Cette étape est indispensable si vous avez dé-commenté la ligne virtual_uid_maps dans le fichier main.cf.
100x et 100y représentent les UIDs des utilisateurs possédant une boite aux lettres.
utilisateur@domaine.com 100x @domaine.com 100y
Création des bases de données Postfix
Une fois ces opérations effectuées, il faut compiler la base de données de postfix :
$ postmap /etc/postfix/vmailbox $ postmap /etc/postfix/valias
$ postmap /etc/postfix/virtual_uids
Cette dernière manipulation est à refaire à chaque modification d'un des fichiers vmailbox, valias ou virtual_uids.
Tester
Démarrer postfix et démarrage auto
- DĂ©marrage
$ /etc/init.d/postfix start
- Ajout au démarrage du système :
$ rc-update add postfix
Session Telnet et Netstat
Pour tester la connexion Ă votre serveur, vous pouvez vous connecter au serveur avec telnet:
$ telnet localhost 143
ou encore, vérifier qu'un serveur écoute bien sur le port 143 (smtp):
$ netstat -l | grep smtp
Trouver les problèmes
Si ça ne marche pas, vous pourrez sans doute trouver des indices en observant vos fichiers log :
$ tail -f /var/log/messages
SĂ©curiser son serveur SMTP
anti-virus Clamav
-
Installation de clamav :
apk add clamav
Mises Ă jour automatique avec cron :
-
Ajout de cron au démarrage :
$ rc-update add cron
Ajout de la règle pour la maj :
$ echo "00 04 * * * /usr/local/bin/freshclam --quiet" >> /etc/crontabs/root
-
Démarrage de clamav et ajout au démarrage :
$ /etc/init.d/clamd start && rc-update add clamd
Clamsmtp
- Installation de clamsmtp :
$ apk add clamsmtp
- Éditer le fichier /etc/clamsmtpd.conf :
OutAddress: 127.0.0.1:10026
Listen: 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd.sock
TempDirectory: /tmp
Action: drop
Quarantine: on
User: clamav
- Ajout des règles clamsmtp à au fichier /etc/postfix/master.cf
## AV scan filter (used by content_filter)
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
-o smtp_enforce_tls=no
## For injecting mail back into postfix from the filter
127.0.0.1:10026 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
- Démarrage de clamsmtp et ajout au démarrage :
$ /etc/init.d/clamsmtpd start && rc-update add clamsmtpd
Une fois que vous êtes sûr de vos réglages, désactivez la ligne content_filter dans le fichier /etc/postfix/main.cf puis relancer postfix :
$ /etc/init.d/postfix reload
Gross
- Installation de gross :
$ apk add gross
- Édition du fichier /etc/grossd.conf :
protocol = postfix
## Sous Debian Wheezy avec Gross 1.0.2, le fichier d'état pose problème.
## il faut alors créer ce fichier en lançant la commande suivante : sudo -u gross grossd -C
## [ http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=614790 ](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=614790)
statefile = /var/db/grossd.state
check = dnsbl
check = rhsbl
dnsbl = zen.spamhaus.org
dnsbl = list.dsbl.org
dnsbl = bl.spamcop.net
dnsbl = combined.njabl.org
dnsbl = cbl.abuseat.org
dnsbl = dnsbl.sorbs.net
rhsbl = rhsbl.sorbs.net
- Lancer gross et ajout au démarrage :
$ /etc/init.d/grossd start && rc-update add grossd
Il faut maintenant dé-commenter la ligne check_policy_service dans le fichier /etc/postfix/main.cf et relancer postfix :
$ /etc/init.d/postfix reload
SaneSecurity & MSRBL
-
Installation :
$ apk add curl rsync
-
Création du script dans /etc/postfix/scripts :
$ mkdir /etc/postfix/scripts $ nano /etc/postfix/scripts/up_clam_ex.sh $ chmod +x /etc/postfix/scripts/up_clam_ex.sh
Copier le contenu du script dans le fichier ainsi créé : up_clam_ex.sh
-
Ajout du script Ă cron ( tous les jours Ă 4h18 du matin ):
$ echo "18 04 * * * /etc/postfix/scripts/up_clam_ex.sh &> /dev/nul" >> /etc/crontabs/root
Serveur IMAP : Dovecot
Installation
$ apk add dovecot
Préparation
- Création des fichiers log :
$ touch /var/log/dovecot-info.log && touch /var/log/dovecot.log $ chown vmail:vmail /var/log/dovecot*.log
- Création du fichier /etc/dovecot/conf.d/10-auth.conf :
$ nano /etc/dovecot/conf.d/10-auth.conf
!include auth-passwdfile.conf.ext
- le fichier suivant sert a securiser le serveur smtp
!include auth-postfix.conf.ext
- Création du fichier auth-passwdfile.conf.ext :
$ nano /etc/dovecot/conf.d/auth-passwdfile.conf.ext
passdb {
driver = passwd-file args = scheme=cram-md5 /etc/dovecot/md5
} userdb {
args = username_format=%u /etc/dovecot/users driver = passwd-file
}
* Création du fichier *auth-postfix.conf.ext*:
$ nano /etc/dovecot/conf.d/auth-postfix.conf.ext
passdb {
driver = passwd-file args = scheme=plain username_format=%u /etc/postfix/users
} service auth {
unix_listener /var/spool/postfix/private/auth { group = postfix mode = 0660 user = postfix }
} userdb {
driver = passwd-file args = username_format=%u /etc/postfix/users
}
##### Création des certificats de sécurité pour le SSL
* Configurer le fichier * /etc/dovecot/dovecot-openssl.cnf * avec les informations du serveur :
$ nano /etc/dovecot/dovecot-openssl.cnf
* Créer le script [ mkcert.sh ](mkcert.sh) dans le dossier * /etc/dovecot/ * :
$ nano /etc/dovecot/mkcert.sh
1. changement du bit d'execution
$ chown +x /etc/dovecot/mkcert.sh
1. lancement
$ /etc/dovecot/mkcert.sh
##### Mise en place des utilisateurs
* Édition du fichier * /etc/dovecot/users * :
utilisateur1::UID:GID::/home/utilisateur1 utilisateur2::UID:GID::/home/utilisateur2
##### Mise en place des mots de passe
* génération du mdp :
$ doveadm pw
Copier le hash md5 résultant et l'ajouter au fichier
**/etc/dovecot/md5**.
Exemple pour le mdp **test123** :
$ Enter new password: $ Retype new password:
8314fef5923bb513c7e8be9e663501bbc56ce1012aae68e4c68852be5ab8da76
* Édition du fichier * /etc/dovecot/md5 * :
utilisateur1:8314fef5923bb513c7e8be9e663501bbc56ce1012aae68e4c68852be5ab8da76 utilisateur2:e02d374fde0dc75a17a557039a3a5338c7743304777dccd376f332bee68d2cf6
##### Mise en place de la connexion sécurisée pour le serveur SMTP
* Création d'un utilisateur pour envoyer des mails :
1. Choisissez un nom qui n'existe pas sur le systeme pour remplacer
'utilisateur'
2. -H : ne pas creer de repertoire home -s : shell de l'utilisateur
$ adduser -H -s /bin/false 'utilisateur'
Entrez un mot de passe quand on vous le demande. Ce sont ce login et mot
de passe qui seront utilisés pour vous connecter au serveur SMTP depuis
votre client.
* Récupération des infos de l'utilisateur créé :
$ cat /etc/passwd | grep 'utilisateur'
donne une ligne du type suivant, Ă copier/coller dans le fichier
**/etc/postfix/users** :
'utilisateur':x:100x:100x:Linux
User,,,:/home/'utilisateur':/bin/sh
* Création du fichier * /etc/postfix/users * :
$ nano /etc/postfix/users
1. Substituer le mot de passe au *x* :
'utilisateur':'mot_de_passe':100x:100x:Linux
User,,,:/home/'utilisateur':/bin/sh
* Relancer le serveur dovecot et postfix :
/etc/init.d/dovecot restart && /etc/init.d/postfix restart
### Test du serveur SMTP
**Faire d'abord les Ă©tapes suivantes pour finir la configuration du
serveur IMAP**
* Connection avec telnet :
**Les commandes précédées d'un *>* sont à entrer par
l'utilisateur.**
truc@machin:~$ telnet serveur.exemple.com 25 Trying 0.0.0.0... Connected to 0.0.0.0. Escape character is '^]'. 220 serveur.exemple.com ESMTP Postfix (2.8.3)
EHLO serveur.exemple.com 250-serveur.exemple.com 250-PIPELINING 250-SIZE 10240000 250-ETRN 250-AUTH PLAIN LOGIN CRAM-MD5 250-AUTH=PLAIN LOGIN CRAM-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN AUTH PLAIN AHRlc3QAdGVzdHBhc3M= 235 2.7.0 Authentication successful QUIT 221 2.0.0 Bye Connection closed by foreign host.
La ligne *AUTH PLAIN AHRlc3QAdGVzdHBhc3M=* contient les noms
d'utilisateur et le mot de passe en base 64. Pour faire la conversion :
echo -ne '000utilisateur000mot_de_passe' | openssl base64
Copier le résultat à la suite de la commande *AUTH PLAIN*.
### Configuration
* Édition du fichier * /etc/dovecot/dovecot.conf * :
protocols = imap pop3 listen = base_dir = /var/run/dovecot/ login_greeting = IMAP ready. !include conf.d/.conf
1. SSL
ssl = yes ssl_cert = </etc/ssl/certs/dovecot.pem ssl_key = </etc/ssl/private/dovecot.pem ssl = required ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL verbose_ssl = yes
mail_location = maildir:/var/spool/mail/vhosts/%d/%n
mail_privileged_group = vmail mail_access_groups = vmail
logging
log_path = /var/log/dovecot.log info_log_path = /var/log/dovecot-info.log
auth_mechanisms = plain login cram-md5
Plaintext login ( set to no for tests )
disable_plaintext_auth = yes
### Lancement et ajout au démarrage
$ /etc/init.d/dovecot start && rc-update add dovecot
### Tester
openssl s_client -connect localhost:993
doit retourner :
CONNECTED(00000003) ......... New, TLSvX/SSLvX, Cipher is BLAH-BLAH Server public key is X bit Secure Renegotiation IS supported Compression: zlib compression Expansion: zlib compression ......... +OK IMAP ready.