[Tuto] Postfix, Dovecot, Rainloop, Amavis, SpamAssassin et Clamav

Ce tutoriel va vous montrer comment mettre en place un serveur de mail qui va vous permettre d’envoyer et recevoir des mails en IPv4 et IPv6, un webmail moderne, un anti-spam et un anti-virus. Toutes les réalisations ont été réalisés sous Debian 7 Wheezy. Avant de vous lancer sachez qu’il est necessaire d’être a l’aise avec les systèmes Linux et avoir certaines compétences pour comprendre ce tutoriel.

Pré-requis :
– Des bonnes connaissances sur les systèmes GNU/Linux 🙂
– Un nom de domaine avec un serveur DNS (Vous pouvez suivre ce tutoriel
– Nginx et PHP (Vous pouvez suivre ce tutoriel)
– MySQL

Dans ce tutoriel, nous allons utiliser les caractéristiques suivantes (à adapter selon votre configuration) :
– Nom de domaine principal : domain.tld
– Nom d’hôte : hostname
– FQDN : hostname.domain.tld
– MX : mail.domain.tld

1 – Installation de postfix
2 – Création de la base de donnée
3 – Installation et configuration de PostfixAdmin
4 – Configuration de Postfix
5 – Installation et configuration de Dovecot
6 – Installation et configuration de DKIMProxy
7 – Installation d’OpenDMARC
8 – Ajouter un enregistrement SPF et DMARC
9 – Installation et configuration de Rainloop
10 – Installation et configuration de SpamAssassin
11 – Installation et configuration d’Amavis et Clamav

$ sudo -s
password :
# 

Modifier le nom d’host de votre serveur :

# vim /etc/hostname

hostname.domain.tld
# vim /etc/hosts

127.0.0.1       localhost.localdomain localhost
IP DU SERVEUR   hostname.domain.tld hostname

Redémarrez le serveur pour prendre en compte le changement de nom d’hôte.

Ensuite il faut associer le FQDN avec l’adresse IP de votre serveur. Pour cela, vous devez mettre à jour le fichier de zone de votre domaine depuis le site de votre registrar ou sinon directement avec BIND si votre serveur fait office de serveur DNS.
Le plus important dans cette partie, c’est de faire pointer le FQDN ET le MX vers l’adresse IP de votre serveur. L’enregistrement MX permet de déterminer vers quel serveur un email doit être acheminé, si quelqu’un vous envoie un message depuis Gmail par exemple, les serveurs de Google vont automatiquement interroger cette entrée pour savoir où transmettre le message. Donc si cette entrée est pas ou mal définie, vous ne recevrez jamais d’emails.

A la fin du tutoriel, les enregistrements DNS de votre domaine devront ressembler à ceci :

@                  IN       A            IPV4
@                  IN       AAAA         IPV6

hostname           IN       A            IPV4
hostname           IN       AAAA         IPV6

mail               IN       A            IPV4
mail               IN       AAAA         IPV6

postfixadmin       IN       CNAME        HOSTNAME
rainloop           IN       CNAME        HOSTNAME

@                  IN       MX 10        mail.domain.tld.

; Les enregistrements suivants sont facultatifs :

smtp               IN       CNAME        HOSTNAME
imap               IN       CNAME        HOSTNAME

Rechargez la configuration de BIND en redémarrant le service (ne pas oublier de modifier la valeur du serial pour indiquer que le fichier de zone a été mis à jour !!) :

# service bind9 restart

Attendez quelques minutes que les DNS se propagent, vous pouvez suivre l’avancement avec ce site par exemple : https://www.whatsmydns.net/ :
Et pour finir modifiez le reverse depuis l’interface de votre hébergeur ou de vore FAI en : hostname.domain.tld :

.

1 – Installation de postfix

On commence par installer Postfix avec le support de mysql. Les domaines, comptes utilisateurs et alias seront ainsi gérés directement au sein d’une base de données, que vous pourrez administrer grâce à vos outils habituels, comme phpMyAdmin par exemple.

# aptitude install postfix postfix-mysql postfix-policyd-spf-python

Lors de l’installation de Postfix, vous devez choisir le type du serveur de messagerie, choisissez “Site Internet” pour utiliser SMTP
Ensuite une autre fenêtre apparaît et vous demande le nom du système de mail, entrez alors le FQDN de votre serveur.

.

2 – Création de la base de donnée

# mysql -u root -p

mysql> CREATE database postfix;
mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'MOT DE PASSE';
mysql> GRANT USAGE ON *.* TO 'postfix'@'localhost';
mysql> GRANT ALL PRIVILEGES ON postfix.* TO 'postfix'@'localhost';
mysql> exit

Vous pouvez aussi passer par phpMyAdmin en créant un nouvel utilisateur nommé postfix qui a tous les privilèges sur la bdd postfix.

.

3 – Installation et configuration de PostfixAdmin

PostfixAdmin est une interface web qui permet de gérer simplement vos domaines, vos adresses virtuelles ainsi que vos alias. Dès que vous aurez besoin d’une nouvelle adresse email, c’est par cette interface qu’il faudra passer.

Il faut dans un premier temps télécharger l’archive la plus récente et la décompresser sur le serveur :

# cd /var/www

# wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.92/postfixadmin-2.92.tar.gz
# tar -xzf postfixadmin-2.92.tar.gz
# mv postfixadmin-2.92 postfixadmin
# rm -rf postfixadmin-2.92.tar.gz
# chown -R www-data:www-data postfixadmin

# aptitude install php7.0-imap

Editez le fichier de configuration et modifiez les paramètres suivants :

# vim /var/www/postfixadmin/config.inc.php

$CONF['configured'] = true;
$CONF['default_language'] = 'fr';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'MOT DE PASSE';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = 'admin@domain.tld';
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['fetchmail'] = 'NO';

Nous allons créer un certificat SSL/TLS auto-signé. Si vous avez un certificat signé, vous pouvez l’utiliser sans problème. Pour avoir un certificat chez Gandi, j’ai réalisé un tutoriel à ce sujet.

# mkdir /etc/nginx/certs/
# cd /etc/nginx/certs/

# openssl genrsa -out postfixadmin.key 4096
# openssl req -new -key postfixadmin.key -out postfixadmin.csr
# openssl x509 -req -days 365 -in postfixadmin.csr -signkey postfixadmin.key -out postfixadmin.crt
# openssl dhparam -out dhparam.pem 4096

Ajouter un nouveau virtual host Nginx (à adapter selon votre configuration) :

# vim /etc/nginx/conf.d/postfixadmin.conf

server {
  listen 80;
  listen [::]:80;
  server_name postfixadmin.domain.tld;
  # Obliger la connexion en https
  return 301 https://$server_name$request_uri;
  }

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name postfixadmin.domain.tld;

  # Fichier de log
  access_log /var/log/nginx/postfixadmin-access.log;
  error_log /var/log/nginx/postfixadmin-error.log;

  # Parametres pour SSL/TLS
  ssl_certificate /etc/nginx/certs/postfixadmin.crt;
  ssl_certificate_key /etc/nginx/certs/postfixadmin.key;
  ssl_dhparam /etc/nginx/certs/dhparam.pem;
  ssl_ciphers 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS';
  ssl_protocols TLSv1.1 TLSv1.2;
  ssl_session_cache shared:SSL:10m;
  ssl_prefer_server_ciphers on;

  # Ajout de header liés à la sécurité
  add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; prel
  add_header X-Content-Type-Options nosniff;
  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Robots-Tag none;
  add_header Alternate-Protocol 443:npn-spdy/3;

  # Répertoire dans lequel est installé Owncloud
  root /var/www/postfixadmin/;

  # Forcer l'encodage en UTF8
  charset utf-8;

  # Taille de fichier maximum  que l'on peut téléverser/uploader
  client_max_body_size 10G;
  fastcgi_buffers 64 4K;

  # Désactivation de la compression pour éviter la suppression du header ETag
  gzip off;

  # Page index du site
  index index.php;

  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }

  location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
    deny all;
  }

  location / {
    try_files $uri $uri/ /index.php;
  }

  location ~ \.php(?:$|/) {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param HTTPS on;
    fastcgi_param modHeadersAvailable true;
    fastcgi_pass php-handler;
  }

  # Optionnel : positionne un header EXPIRES long sur les ressources statiques
  location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
    expires 30d;
    # Optionnel : ne pas logger l'accès aux ressources statiques
    access_log off;
  }
}

Configuration de php-fpm

# vim /etc/php/7.0/fpm/pool.d/www.conf

Remplacer : listen = /var/run/php7.0-fpm.sock
par : listen = 127.0.0.1:9000
# service nginx restart
# service php7.0-fpm restart

Lancez l’assistant d’installation de PostfixAdmin à l’adresse suivante et suivez les indications :
http://postfixadmin.domain.tld/setup.php

Le script créé toutes les tables nécessaires au bon fonctionnement de Postfix. En bas de la page générez le hash du mot de passe d’installation et créez un compte administrateur (exemple : admin@domain.tld). C’est à partir de ce compte que vous allez gérer toutes vos adresses emails. Attention: admin@“domain.tld n’est qu’un compte administrateur, l’adresse email n’existe pas. Si vous voulez la créer, il faudra passer par postfixadmin, comme on va le voir par la suite.

Il ne vous reste plus qu’à mettre le hash généré par l’assistant dans le fichier config.inc.php :

# vim /var/www/postfixadmin/config.inc.php

$CONF['setup_password'] = 'HASH';

Vous pouvez maintenant vous connecter via le formulaire de connexion :

On va commencer par ajouter un nouveau domaine, dans notre exemple il s’agit de domain.tld :

Et une adresse email, par exemple admin@domain.tld et contact@domain.tld :

Voila, vous avez ajouté votre première adresse email, maintenant on va passer aux choses sérieuses

.

4 – Configuration de Postfix

Maintenant nous allons devoir configurer Postfix pour qu’il prenne en charge correctement les connexions SMTP et l’envoie des messages sur le réseau pour chaque utilisateur créé via PostfixAdmin.
Faites une sauvegarde du fichier de conf de Postfix :

# cp /etc/postfix/main.cf /etc/postfix/main.cf.bak

Ce fichier de configuration est assez complexe, on va voir ensemble comment le configurer correctement.

# vim /etc/postfix/main.cf

# Ces règles concerne les adresses de destination,
# On autorise la connexion des clients authentifier
# On refuseles adresses de destinations invalides (non FQDN)
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_recipient,
        reject_unauth_destination,
        reject_unknown_recipient_domain,
        reject_rbl_client zen.spamhaus.org

# Règles sur l'échange HELO qui survient avant la connexion
# reject_invalid_helo_hostname : Refuser les échanges HELO invalides
# reject_non_fqdn_helo_hostname : Refuser les noms d'hôte invalides (non FQDN)
# reject_unknown_helo_hostname : Refuser les noms d'hôte qui n'ont pas de champ DNS A ou MX dans leurs DNS. 
smtpd_helo_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_invalid_helo_hostname,
        reject_non_fqdn_helo_hostname,
        # reject_unknown_helo_hostname

# Règles de connexion des clients
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié
# reject_plaintext_session : Refuser les connexions non sécurisées
# reject_unauth_pipelining : Refuser les défauts lors de la connexion
smtpd_client_restrictions =
        permit_mynetworks,
        permit_inet_interfaces,
        permit_sasl_authenticated,
        # reject_plaintext_session,
        # reject_unauth_pipelining

# Règles sur les expéditeurs
# reject_non_fqdn_sender : Refuser les expéditeurs invalides (non FQDN)
# reject_unknown_sender_domain : Refuser les expéditeurs qui n'ont pas de champ DNS A ou MX dans leurs DNS. 
smtpd_sender_restrictions =
        reject_non_fqdn_sender,
        reject_unknown_sender_domain

# Parametres TLS des mails sortant et entrant
# On refuse les connexions SSLv2 et SSLv3
# Smtp OUTGOING (Sortant)
smtp_tls_loglevel = 1
smtp_tls_note_starttls_offer = yes
smtp_tls_security_level = may
smtp_tls_mandatory_ciphers = high
smtp_tls_CAfile = /etc/ssl/certs/ca.cert.pem
smtp_tls_protocols = !SSLv2, !SSLv3, TLSv1, TLSv1.1, TLSv1.2
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, TLSv1, TLSv1.1, TLSv1.2
smtp_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA

# Smtpd INCOMING (Entrant)
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = yes
smtpd_tls_ask_ccert = yes
smtpd_tls_security_level = may
smtpd_tls_received_header = yes
smtpd_tls_mandatory_ciphers = high
smtpd_tls_protocols = !SSLv2, !SSLv3, TLSv1, TLSv1.1, TLSv1.2
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, TLSv1, TLSv1.1, TLSv1.2
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA

# Emplacement des certificats
smtpd_tls_CAfile = $smtp_tls_CAfile
smtpd_tls_cert_file = /etc/ssl/certs/mailserver.crt
smtpd_tls_key_file = /etc/ssl/private/mailserver.key
smtpd_tls_dh1024_param_file = $config_directory/dh2048.pem
smtpd_tls_dh512_param_file = $config_directory/dh512.pem

tls_preempt_cipherlist = yes
tls_random_source = dev:/dev/urandom
tls_medium_cipherlist = AES128+EECDH:AES128+EDH

smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
lmtp_tls_session_cache_database = btree:${data_directory}/lmtp_scache

# Paramètres de connexion SASL
# C'est ici que l'on déclare Dovecot comme une passerelle pour authentifier les utilisateurs.
# Postfix peut s'appuyer sur Dovecot pour identifier les connexions SMTP.
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_authenticated_header = yes

broken_sasl_auth_clients = yes

virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000
virtual_mailbox_base = /var/mail

virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

virtual_transport = lmtp:unix:private/dovecot-lmtp

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
delay_warning_time = 4h
mailbox_command = procmail -a "$EXTENSION"
recipient_delimiter = +
disable_vrfy_command = yes
message_size_limit = 502400000
mailbox_size_limit = 1024000000
smtp_bind_address6 = IPV6

inet_interfaces = all
inet_protocols = ipv4, ipv6

myhostname = hostname.domain.tld
myorigin = hostname.domain.tld
mydestination = localhost localhost.$mydomain
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
relayhost =

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# Ici on va indiquer à Postfix comment s'interfacer avec OpenDMARC, Amavis <-> Clamav-Spamassassion-DKIM-Proxy
milter_protocol = 6
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:8892
non_smtpd_milters = inet:127.0.0.1:8892
content_filter = smtp-amavis:[127.0.0.1]:10025

mime_header_checks = regexp:/etc/postfix/header_checks
header_checks = regexp:/etc/postfix/header_checks

receive_override_options = no_address_mappings

Si vous n’avez pas de certificat SSL/TLS, exécutez les commandes suivantes pour en générer un (attention il s’agira d’un certificat auto-signé par votre propre autorité de certification) :

# cd /etc/ssl/

# openssl genrsa -out CAroot.key 4096
# openssl req -x509 -new -nodes -days 1460 -key CAroot.key -out CAroot.crt

Country Name (2 letter code) [AU]: FR
State or Province Name (full name) [Some-State]: France
Locality Name (eg, city) []: Votre Ville
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Mon Autorité De Certification
Organizational Unit Name (eg, section) []: IT
Common Name (e.g. server FQDN or YOUR name) []: *.domain.tld

# openssl genrsa -out mailserver.key 4096
# openssl req -new -key mailserver.key -out mailserver.csr

Country Name (2 letter code) [AU]: FR
State or Province Name (full name) [Some-State]: France
Locality Name (eg, city) []: Votre Ville
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Mon serveur de mail
Organizational Unit Name (eg, section) []: IT
Common Name (e.g. server FQDN or YOUR name) []: mail.domain.tld

# openssl x509 -req -days 1460 -in mailserver.csr -CA CAroot.crt -CAkey CAroot.key -CAcreateserial -out mailserver.crt

# chmod 444 CAroot.crt
# chmod 444 mailserver.crt
# chmod 400 mailserver.key

# mv CAroot.crt certs/
# mv mailserver.crt certs/
# mv mailserver.key private/

# openssl dhparam -out /etc/postfix/dh2048.pem 2048
# openssl dhparam -out /etc/postfix/dh512.pem 512

C’est terminé pour le fichier de configuration principale, je vous l’accorde il y a pas mal de paramètres à prendre en compte mais dans le cas d’un serveur SMTP c’est pas étonnant.

Configuration de Postfix pour MySQL

On peut maintenant créer les 3 trois fichiers de configuration qui vont permettrent à Postfix d’intéragir avec MySQL :

# vim /etc/postfix/mysql-virtual-mailbox-domains.cf

hosts = 127.0.0.1
user = postfix
password = MOT DE PASSE
dbname = postfix

query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 0 and active = 1
# vim /etc/postfix/mysql-virtual-mailbox-maps.cf

hosts = 127.0.0.1
user = postfix
password = MOT DE PASSE
dbname = postfix

query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
# vim /etc/postfix/mysql-virtual-alias-maps.cf

hosts = 127.0.0.1
user = postfix
password = MOT DE PASSE
dbname = postfix

query = SELECT goto FROM alias WHERE address='%s' AND active = 1

Ensuite, il faut modifier le fichier /etc/postfix/master.cf et il faudra l’adapter pour avoir le contenu suivant :

# vim /etc/postfix/master.cf

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master" or
# on-line: http://www.postfix.org/master.5.html).
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
#smtp      inet  n       -       -       -       1       postscreen
#smtpd     pass  -       -       -       -       -       smtpd
#dnsblog   unix  -       -       -       -       0       dnsblog
#tlsproxy  unix  -       -       -       -       0       tlsproxy

############
### SMTP ###
############
smtp      inet  n       -       -       -       -       smtpd
  -o smtpd_proxy_filter=127.0.0.1:12025
  -o strict_rfc821_envelopes=yes
  -o smtpd_proxy_options=speed_adjust

##################
### SUBMISSION ###
##################
submission inet n       -       -       -       -       smtpd
  -o smtpd_proxy_filter=127.0.0.1:12027
  -o syslog_name=postfix/submission
  -o smtpd_tls_dh1024_param_file=${config_directory}/dh2048.pem
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_proxy_options=speed_adjust
  -o smtpd_enforce_tls=yes
  -o smtpd_tls_security_level=encrypt
  -o tls_preempt_cipherlist=yes

##############
### AMAVIS ###
##############
smtp-amavis     unix    -       -       n       -       2       smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o smtp_tls_note_starttls_offer=no

127.0.0.1:10025 inet    n       -       n       -       -       smtpd
  -o content_filter=
  -o smtpd_delay_reject=no
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=reject_unauth_pipelining
  -o smtpd_end_of_data_restrictions=
  -o smtpd_restriction_classes=
  -o mynetworks=127.0.0.0/8
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_client_connection_count_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters
  -o local_header_rewrite_clients=
  -o smtpd_milters=
  -o local_recipient_maps=
  -o relay_recipient_maps=

#############
### SMTPS ###
#############
#smtps     inet  n       -       -       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

##############
### AUTRES ###
##############
#628       inet  n       -       -       -       -       qmqpd
pickup    unix  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
#qmgr     unix  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
#
# ====================================================================
#
# Recent Cyrus versions can use the existing "lmtp" master.cf entry.
#
# Specify in cyrus.conf:
#   lmtp    cmd="lmtpd -a" listen="localhost:lmtp" proto=tcp4
#
# Specify in main.cf one or more of the following:
#  mailbox_transport = lmtp:inet:localhost
#  virtual_transport = lmtp:inet:localhost
#
# ====================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Also specify in main.cf: cyrus_destination_recipient_limit=1
#
#cyrus     unix  -       n       n       -       -       pipe
#  user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
#
# ====================================================================
# Old example of delivery via Cyrus.
#
#old-cyrus unix  -       n       n       -       -       pipe
#  flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
#
# ====================================================================
#
# See the Postfix UUCP_README file for configuration details.
#
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}

####################
### SPAMASSASSIN ###
####################
spamassassin unix -     n       n       -       -       pipe
  user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

###########
### SPF ###
###########
policyd-spf    unix    -    n     n    -    0    spawn
  user=nobody argv=/usr/bin/policyd-spf /etc/postfix-policyd-spf-python/policyd-spf.conf

.

5 – Installation et configuration de Dovecot

# aptitude install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved

Ajoutez la liste des protocoles activés après l’instruction “!include_try” dans le fichier /etc/dovecot/dovecot.conf. Dans notre cas, nous allons activer IMAP pour la récupération des emails via le port 993 et LMTP pour l’acheminement des emails entre Postfix et Dovecot

# vim /etc/dovecot/dovecot.conf

## Dovecot configuration file

# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp sieve 

# A space separated list of IP or host addresses where to listen in for
# connections. "*" listens in all IPv4 interfaces. "[::]" listens in all IPv6
# interfaces. Use "*, [::]" for listening both IPv4 and IPv6.
listen = *, [::]

# Most of the actual configuration gets included below. The filenames are
# first sorted by their ASCII value and parsed in that order. The 00-prefixes
# in filenames are intended to make it easier to understand the ordering.
!include conf.d/*.conf

# A config file can also tried to be included without giving an error if
# it's not found:
!include_try local.conf

On indique le chemin du conteneur local qui contiendra tous nos emails. Editez le fichier 10-mail.conf :

# vim /etc/dovecot/conf.d/10-mail.conf

# Le contenur local est organisé de cette manière :
# /var/mail/vhosts/domain.tld/utilisateur
mail_location = maildir:/var/mail/vhosts/%d/%n/mail

namespace inbox {
    inbox = yes
}

mail_uid = 5000
mail_gid = 5000

first_valid_uid = 5000
last_valid_uid = 5000

mail_privileged_group = vmail

Les emails seront stockés dans le répertoire /var/mail. On doit donc créer un répertoire correspondant à notre domaine (celui qui est présent dans la table domain).

# mkdir -p /var/mail/vhosts/domain.tld

Maintenant on ajoute un nouvel utilisateur et un nouveau groupe nommé vmail avec un UID/GID de 5000 :

# groupadd -g 5000 vmail 
# useradd -g vmail -u 5000 vmail -d /var/mail
# chown -R vmail:vmail /var/mail

Editer le fichier 10-auth.conf et modifier les lignes suivantes :

# vim /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = yes
auth_mechanisms = plain login
#!include auth-system.conf.ext # Commenter cette ligne
!include auth-sql.conf.ext     # décommenter cette ligne

Maintenant on va définir deux méthodes qui vont permettrent à Dovecot de savoir comment obtenir les utilisateurs et les mots de passe correspondants lors de la connexion. Editez le fichier auth-sql.conf.ext :

# vim /etc/dovecot/conf.d/auth-sql.conf.ext

# Le mot de passe est obtenu à partir de la base de donnée
passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

# Par contre le nom d'utilisateur est obtenu de manière statique à partir du conteneur local
# %d = domaine.tld
# %n = utilisateur
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

Ensuite editez le fichier dovecot-sql.conf.ext et modifiez les paramètres suivants :

# vim /etc/dovecot/dovecot-sql.conf.ext

# Paramètres de connexion
driver = mysql
connect = host=127.0.0.1 dbname=postfix user=postfix password=MOT DE PASSE

# Permet de définir l'algorithme de hachage.
# Pour plus d'information: http://wiki2.dovecot.org/Authentication/PasswordSchemes
# /!\ ATTENTION : ne pas oublier de modifier le paramètre $CONF['encrypt'] de PostfixAdmin
default_pass_scheme = MD5-CRYPT

# Requête de récupération du mot de passe du compte utilisateur
password_query = SELECT password FROM mailbox WHERE username = '%u'

Modifiez les permissions sur le répertoire /etc/dovecot :

# chown -R vmail:dovecot /etc/dovecot
# chmod -R o-rwx /etc/dovecot

Editer le fichier 10-master.conf avec le contenu suivant :

# vim /etc/dovecot/conf.d/10-master.conf

service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
  service_count = 0
}

service imap {
}

service lmtp {
  # On autorise Postfix à transférer les emails dans le spooler de Dovecot via LMTP
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
      mode = 0600
      user = postfix
      group = postfix
  }
}

service auth {
  # On autorise Postfix à se connecter à Dovecot via LMTP
  unix_listener /var/spool/postfix/private/auth {
      mode = 0666
      user = postfix
      group = postfix
  }
  # On indique à Dovecot les permissions du conteneur local
  unix_listener auth-userdb {
      mode = 0600
      user = vmail
      group = vmail
  }
  user = dovecot
}

service auth-worker {
  user = vmail
}

Enfin, editez le fichier 10-ssl.conf et modifiez les paramètres suivants :

# vim /etc/dovecot/conf.d/10-ssl.conf

ssl = required

ssl_cert =

Vous connaissez très certainement les filtres côté clients, tout bon client mail possède un système de filtre permettant de trier automatiquement les mails en fonction de différents critères que vous pouvez définir. Sieve c’est exactement la même chose mais côté serveur, il possède un langage de script pour définir soit même l’ensemble des règles.

# vim /etc/dovecot/conf.d/20-lmtp.conf

protocol lmtp {
  postmaster_address = postmaster@domain.tld
  mail_plugins = $mail_plugins sieve
}
# vim /etc/dovecot/conf.d/90-sieve.conf

plugin {
   sieve = ~/.dovecot.sieve
   sieve_global_path = /var/lib/dovecot/sieve/default.sieve
   sieve_dir = ~/sieve
   sieve_global_dir = /var/lib/dovecot/sieve/
}
# mkdir -p /var/lib/dovecot/sieve/
# touch /var/lib/dovecot/sieve/default.sieve &&  chown -R vmail:vmail /var/lib/dovecot/sieve/
# vim /var/lib/dovecot/sieve/default.sieve

require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
  fileinto "Spam";
}
# sievec /var/lib/dovecot/sieve/default.sieve

.

6 – Installation et configuration de DKIMProxy

DKIM est un standard permettant d’associer de manière forte une entité ou une organisation avec un domaine au sein d’un email.
On se déclare donc complètement responsable de la transmission du message sur le réseau.
DKIM fonctionne par cryptographie asymétrique, le MTA (Mail Transfer Agent, dans notre cas il s’agit de Postfix) se charge de signer numériquement tous les emails envoyés avec une clé privée contenue sur le serveur.
Le destinataire peut alors vérifier l’intégrité du corps ainsi que les en-têtes du message grâce à la clé publique fournie par le domainkey, qui est un champ TXT contenu dans les fichiers de zone de vos DNS.

# aptitude install dkimproxy
# openssl genrsa -out /etc/dkimproxy/private.key 2048
# openssl rsa -in /etc/dkimproxy/private.key -out /etc/dkimproxy/public.key -pubout -outform PEM

Nous allons commencé par configurer dkimproxy pour qu’il vérifie la signature dkim des mails entrants, puis les envoies à amavis.
Modifier /etc/dkimproxy/dkimproxy_in.conf et l’adapter comme ceci :

# vim /etc/dkimproxy/dkimproxy_in.conf

# Ecoute sur le port 12025
listen 127.0.0.1:12025

# DKIMPROXY va relayer les mails entrants vers amavis
relay 127.0.0.1:10024

Ensuite, il faut configurer dkimproxy pour qu’il signe nos mails sortant.
Modifier /etc/dkimproxy/dkimproxy_out.conf et l’adapter comme ceci :

# vim /etc/dkimproxy/dkimproxy_out.conf

# Ecoute sur le port 12027
listen 127.0.0.1:12027

# DKIMPROXY va relayer les mails sortants vers amavis
relay 127.0.0.1:10024

# Spécifier le domaine que dkimproxy va signer
domain    domain.tld

# Spécifier le type de signature à ajouter
signature dkim(c=relaxed)
signature domainkeys(c=nofws)

# Spécifier l'emplacement de la clé privée
keyfile /etc/dkimproxy/private.key

# Spécifier le selecteur, qui doit être implémenter dans les DNS
selector  mail

Il faut esuite modifier le script d’éxécution de dkimproxy afin qu’il signe correctement nos mails.
Il faut modifier la ligne suivante :

# vim /etc/init.d/dkimproxy

DKIMPROXY_OUT_ARGS="${COMMON_ARGS} --pidfile=${PIDDKIMPROXY_OUT} --min_servers=${DKIMPROXY_OUT_MIN_SERVERS} --domain=example.com --method=simple --conf_file=${DKOUT_CONF} --keyfile=/etc/dkimproxy/private.key --selector=mail --signature=dkim(a=rsa-sha256) --signature=domainkeys(a=rsa-sha1)"

Il reste plus qu’a ajouter une enregistrement TXT dans les DNS contenant votre clé public.

$ cat /etc/dkimproxy/public.key

Et mettez le dans votre fichier de zone de votre domaine, soit depuis l’interface de votre registrar, soit avec BIND :

mail._domainkey     IN         TXT        "v=DKIM1; t=s; k=rsa; p=CLE PUBLIQUE";
_domainkey          IN         TXT        "t=y; o=-;"
_adsp._domainkey    IN         TXT        "dkim=all; atps=y;"

.

7 – Installation d’OpenDMARC

DMARC est une spécification technique assez récente (2011), qui est toujours en draft par l’IETF ( https://datatracker.ietf.org/doc/rfc7489/ ), les contributeurs initiaux sont un consortium de plusieurs géants d’internet comme AOL, Yahoo, Google, Microsoft, Paypal, Facebook…etc. Cette spécification permet de réduire l’usage abusif des e-mails, tels que le spam, le phishing en ajoutant une couche supplémentaire dans le processus d’authentification des mails.

# aptitude install opendmarc

Editer le fichier de configuration opendmarc.conf avec le contenu suivant :

# vim /etc/opendmarc.conf

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   0002
Syslog                  true

AuthservID              domain.tld
TrustedAuthservIDs      domain.tld
IgnoreHosts             /etc/opendmarc/TrustedHosts

RejectFailures          false

UserID                  opendmarc:opendmarc
PidFile                 /var/run/opendmarc.pid

Nous allons maintenant créer un fichier contenant la liste des hôtes qui serons ignorés durant la validation par opendmarc

# mkdir /etc/opendmarc
# touch /etc/opendmarc/TrustedHosts &&  vim /etc/opendmarc/TrustedHosts

127.0.0.1
localhost
::1
*@domain.tld

Enfin, nous allons définir le port d’écoute d’OpenDMARC

# vim /etc/default/opendmarc

# Command-line options specified here will override the contents of
# /etc/opendmarc.conf. See opendmarc(8) for a complete list of options.
#DAEMON_OPTS=""
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
#SOCKET="local:/var/run/opendmarc/opendmarc.sock" # default
#SOCKET="inet:54321" # listen on all interfaces on port 54321
#SOCKET="inet:12345@localhost" # listen on loopback on port 12345
#SOCKET="inet:12345@192.0.2.1" # listen on 192.0.2.1 on port 12345
SOCKET="inet:8892:localhost"

.

8 – Ajouter un enregistrement SPF et DMARC

Sender Policy Framework (SPF) est une norme de vérification du nom de domaine de l’expéditeur d’un courrier électronique, normalisé dans la RFC 7208.
L’adoption de cette norme est de nature à réduire le spam.
Le mécanisme utilise DKIM et SPF et permet d’informer les autres fournisseurs de mail des actions à entreprendre lorsqu’ils reçoivent un mail provenant de notre domaine. C’est peut-être pas très clair dit comme ça, mais c’est pas compliqué, prenons un exemple :
Vous envoyez un mail à partir de votre adresse @domain.tld à un amis qui est chez Gmail. Google vas donc utiliser DMARC et demander à votre serveur ce qu’il doit faire lorsqu’il reçoit un mail appartenant à votre domaine. Votre serveur répond qu’il doit vérifier la validité de DKIM et SPF, si tout est valide le mail est envoyé au destinataire sinon il est soit mis en quarantaine (dossier spam), soit il n’est pas du tout envoyé (blocké au niveau de la couche smtp).

Ajoutez ces lignes dans le fichier de zone de votre nom de domaine :

@          IN      TXT     "v=spf1 ip4:IPv4 ip6:IPv6 ptr ?all"
@          IN      SPF     "v=spf1 ip4:IPv4 ip6:IPv6 ptr ?all"
_dmarc     IN      TXT     "v=DMARC1; p=reject; rua=mailto:postmaster@domain.tld; ruf=mailto:admin@domain.tld; fo=0; adkim=s; aspf=s; pct=100; rf=afrf; sp=reject"

.

9 – Installation et configuration de Rainloop

Rainloop est un webmail opensource développé en PHP qui se veut complet et simple d’utilisation. Il gère très bien les protocoles IMAP/SMTP et dispose d’une interface moderne (HTML5/CSS3) très érgonomique, c’est plutôt agréable. Du côté des fonctionnalités, on retrouve toutes celles d’un client mail classique, avec en plus un système de plugins.

Rainloop est très simple à mettre en place. Téléchargez le zip depuis le site officiel et décompressez-le dans le dossier /var/www/rainloop:

# wget http://repository.rainloop.net/v2/webmail/rainloop-latest.zip
# mkdir /var/www/rainloop
# unzip rainloop-latest.zip -d /var/www/rainloop
# rm -rf rainloop-latest.zip

Modifiez les permissions pour que le serveur web ait accès au répertoire /var/www/rainloop

$ cd /var/www/rainloop
# find . -type d -exec chmod 755 {} \;
# find . -type f -exec chmod 644 {} \;
# chown -R www-data:www-data .

Nous allons créer un autre certificat auto-signer pour que notre webmail soit tout de même chiffré en HTTPS

# cd /etc/nginx/certs/

# openssl genrsa -out rainloop.key 4096
# openssl req -new -key rainloop.key -out rainloop.csr
# openssl x509 -req -days 365 -in rainloop.csr -signkey rainloop.key -out rainloop.crt

Ajouter un nouveau virtual host Nginx (à adapter selon votre configuration) :

# vim /etc/nginx/conf.d/rainloop.conf

server {
  listen 80;
  listen [::]:80;
  server_name webmail.domain.tld;
  # Obliger la connexion en https
  return 301 https://$server_name$request_uri;
  }

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name webmail.domain.tld;

  # Fichier de log
  access_log /var/log/nginx/rainloop-access.log;
  error_log /var/log/nginx/rainloop-error.log;

  # Parametres pour SSL/TLS
  ssl_certificate /etc/nginx/certs/rainloop.crt;
  ssl_certificate_key /etc/nginx/certs/rainloop.key;
  ssl_dhparam /etc/nginx/certs/dhparam.pem;
  ssl_ciphers 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS';
  ssl_protocols TLSv1.1 TLSv1.2;
  ssl_session_cache shared:SSL:10m;
  ssl_prefer_server_ciphers on;

  # Ajout de header liés à la sécurité
  add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; prel
  add_header X-Content-Type-Options nosniff;
  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Robots-Tag none;
  add_header Alternate-Protocol 443:npn-spdy/3;

  # Répertoire dans lequel est installé Owncloud
  root /var/www/rainloop/;

  # Forcer l'encodage en UTF8
  charset utf-8;

  # Taille de fichier maximum  que l'on peut téléverser/uploader
  client_max_body_size 10G;
  fastcgi_buffers 64 4K;

  # Désactivation de la compression pour éviter la suppression du header ETag
  gzip off;

  # Page index du site
  index index.php;

  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }

  location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
    deny all;
  }

  location / {
    try_files $uri $uri/ /index.php;
  }

  location ~ \.php(?:$|/) {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param HTTPS on;
    fastcgi_param modHeadersAvailable true;
    fastcgi_pass php-handler;
  }

  # Optionnel : positionne un header EXPIRES long sur les ressources statiques
  location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
    expires 30d;
    # Optionnel : ne pas logger l'accès aux ressources statiques
    access_log off;
  }
}

Redémarrer Nginx pour prendre en compte le nouveau vhost :

# service nginx restart

L’installation est maintenant terminée, nous allons passer à la configuration. Connectez-vous à l’interface d’administration via cette adresse :
http://webmail.domain.tld/?admin

Par défaut les identifiants sont : admin et 12345

Une fois connecté à l’interface d’administration, vous devez ajouter un nouveau domaine. Dans le menu de gauche cliquez sur Domains puis sur + Add Domain. Une nouvelle fenêtre s’ouvre et vous demande de configurer IMAP et SMTP pour ce domaine.

Voici un exemple de configuration, adaptez selon vos besoins :

Connexion à votre boîte mail

Connectez-vous à votre boîte mail via le formulaire principal :
http://webmail.domain.tld/

Saisissez les identifiants que vous avez mis lors de la création de votre adresse email via PostfixAdmin et connectez-vous. Si tout se passe bien, vous arrivez dans votre boîte mail. Rainloop s’occupe de son côté d’aller chercher et d’organiser tous vos emails depuis le serveur avec le protocol IMAP :

.

10 – Installation et configuration de SpamAssassin

SpamAssassin est un logiciel libre permettant de filtrer les emails afin d’éradiquer au maximum le SPAM. Il fait passer un certain nombre de tests au message et en fonction du résultat de ces tests, il attribue un score qui permettra de savoir si il s’agit d’un email indésirable ou non.

On commence par installer SpamAssassin :

# aptitude install spamassassin spamc

Dans le fichier /etc/spamassassin/local.cf, décommenter la ligne suivante :

rewrite_header Subject *****SPAM*****

Les mails considérés comme du SPAM auront un sujet préfixé avec *****SPAM*****. Ils pourront ainsi être traités comme vous le souhaitez en paramétrant un filtre dans votre client mail.

Ajouter aussi à la fin du fichier local.cf:

report_safe 1

whitelist_from *@domain.tld
whitelist_from_dkim *@domain.tld

add_header all Report _REPORT_
add_header spam Flag _YESNOCAPS_
add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_
add_header all Level _STARS(*)_
add_header all Checker-Version SpamAssassin _VERSION_ (_SUBVERSION_) on _HOSTNAME_

Pour avoir un rapport détaillé dans les headers de tous les mails, comme ceci :

X-Spam-Report: 
	* -5.0 RCVD_IN_DNSWL_HI RBL: Sender listed at http://www.dnswl.org/, high
	*      trust
	*      [66.45.63.27 listed in list.dnswl.org]
	* -3.0 RCVD_IN_RP_CERTIFIED RBL: Sender in ReturnPath Certified - Contact
	*      cert-sa@returnpath.net
	*      [Return Path SenderScore Certified {formerly]
	[Bonded Sender} - http: www.senderscorecertified.com=""]
	* -2.0 RCVD_IN_RP_SAFE RBL: Sender in ReturnPath Safe - Contact
	*      safe-sa@returnpath.net
	*      [Return Path SenderScore Safe List (formerly]
	[Habeas Safelist) - http: www.senderscorecertified.com=""]
X-Spam-Status: No, score=-10.0 required=5.0 tests=RCVD_IN_DNSWL_HI,
	RCVD_IN_RP_CERTIFIED,RCVD_IN_RP_SAFE autolearn=ham
	version=3.3.2
X-Spam-Level: 
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on hostname.domain.tld

Dans le fichier /etc/default/spamassassin, modifier ces deux lignes :

ENABLED=1
CRON=1

Pour finir, ajouter au cron ces 3 lignes avec contab :

# crontab -e

# Mise à jour des règles de spamassassin
20 02 * * * /usr/bin/sa-update

# Mise à jour de la base virale clamav
15 23 * * * /usr/bin/freshclam --quiet

# Auto-apprentissage de spam assassin
30 02 * * * /usr/bin/sa-learn --ham /var/mail/vhosts/domain.tld/utilisateur/mail/cur/*
40 02 * * * /usr/bin/sa-learn --spam /var/mail/vhosts/domain.tld/utilisateur/mail/.Junk/cur/*

Spamassassin est très intelligent, il peut apprendre tout seul au fur et à mesure que vous recevez des mails, lorsque vous ajoutez manuellement un mail dans le dossier spam (ce qui veut dire qu’il ne l’avait pas détecté en tant que tel)

.

11 – Installation et configuration d’Amavis et Clamav

ClamAV est un antivirus destiné aux systèmes UNIX principalement. Il est capable de détecter en temps réel des logiciels malveillants et des virus grâce à une base de détection de plus de 3 500 000 signatures. ClamAV est généralement utilisé avec Postfix pour filtrer les emails comportant des virus, malwares…etc Amavis fera appel à
ClamAV pour les virus et à SpamAssassin pour définir si les e-mails sont des spams ou non.

Installer les paquets :

# aptitude install amavisd-new clamav clamav-daemon clamav-freshclam lha arj rar unrar nomarch lzop cabextract razor pyzor p7zip-full pax zip unzip lha zoo

Pour que ce dernier puisse accéder aux pièces jointes décompressées par Amavis, il faut le rajouter au groupe « Amavis ».

# addgroup clamav amavis
# service clamav-freshclam stop
# freshclam

# ClamAV update process started at Sat Sep 13 23:42:44 2014
# main.cvd is up to date (version: 55, sigs: 2424225, f-level: 60, builder: neo)
# daily.cvd is up to date (version: 19360, sigs: 1098967, f-level: 63, builder: dgoddard)
# bytecode.cvd is up to date (version: 242, sigs: 46, f-level: 63, builder: dgoddard)
# service clamav-freshclam start
# service clamav-daemon start
[ ok ] Starting ClamAV daemon: clamd.

Maintenant, il faut autoriser le filtrage de ClamAV et de SpamAssassin.
Il faut éditer « /etc/amavis/conf.d/15-content_filter_mode » et dé-commenter les lignes suivantes :

@bypass_virus_checks_maps = (
    \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
    \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

On peaufine certains paramètres

Analysé les pièces jointes

Dans /etc/amavis/conf.d/20-debian_defaults, je suggère d’élargir la liste des pièces jointes interdites (par extension).

# vim /etc/amavis/conf.d/20-debian_defaults

#  qr'.\.(exe|vbs|pif|scr|bat|cmd|com|cpl)

Comportement lors de détection de spam

Quelques variables importantes à positionner (écraser par rapport à la conf par défaut) :

# vim /etc/amavis/conf.d/20-debian_defaults

$sa_spam_subject_tag = '*****SPAM***** ';
$sa_tag_level_deflt  = 2.0;
$sa_tag2_level_deflt = 5.0;
$sa_kill_level_deflt = 5.0;
$sa_dsn_cutoff_level = 10;

$final_virus_destiny      = D_REJECT;
$final_banned_destiny     = D_BOUNCE;
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;

Enfin, j’avais oublié un point important, la variable « @local_domains_acl ». Elle défini la liste des domaines sur lesquels spamassassin va intervenir. Les domaines non listés ici ne sont tout simplement pas pris en compte, donc pas analysés, donc pas « flaggés »…
Je ne l’avais pas vu au début car avec un seul domaine qui est le nom de la machine etc, tout va bien avec le choix par défaut de Debian dans 05-domain_id:@local_domains_acl = ( “.$mydomain” );.
Là où ça se complique, c’est quand vous gérez plusieurs domaines, suivant comment votre bousin est défini. Par exemple avec des domaines virtuels, gérés en base de données, c’est mort (prochain article à venir sur la gestion de domaines et d’utilisateurs virtuels).
J’ai donc forcé cette variable dans le fichier /etc/amavis/conf.d/05-domain_id :

# vim /etc/amavis/conf.d/05-domain_id

@local_domains_acl = ( ".domain.tld" );

Définir une adresse mail pour être notifier lors de la détection d’un virus, spam etc..

# vim /etc/amavis/conf.d/50-user

$mailfrom_notify_admin='postmaster@domain.tld';
$mailfrom_notify_recip='postmaster@ddomain.tld';
$mailfrom_notify_spamadmin='postmaster@domain.tld';
$mailfrom_to_quarantine='postmaster@domain.tld';

Amavis est maintenant bien configurer pour filtrer les spams et les virus indésirable !

# service postfix restart
# service dovecot restart
# service dkimproxy restart
# service opendmarc restart
# service amavis restart

Amavis est maintenant bien configurer pour filtrer les spams et les virus indésirable !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *