wiki/HowtoAmavis.md

310 lines
9 KiB
Markdown

---
categories: mail
title: Howto Amavis
...
* Documentation : <https://www.ijs.si/software/amavisd/#doc>
[Amavis](https://www.ijs.si/software/amavisd/) est un logiciel qui permet de filtrer les emails pour détecter des virus, des spams ou pièces jointes interdites. Il s'interface avec un serveur [SMTP](HowtoSMTP) comme [Postfix](HowtoPostfix) et permet d'utiliser des logiciels externes comme ClamAV ou SpamAssassin.
## Installation
~~~
# apt install amavisd-new arc arj zoo pax bzip2 cabextract rpm lzop clamav-daemon
$ /usr/sbin/amavisd-new -V
amavisd-new-2.10.1 (20141025)
# systemctl status amavis
● amavis.service - LSB: Starts amavisd-new mailfilter
Loaded: loaded (/etc/init.d/amavis; generated; vendor preset: enabled)
Docs: man:systemd-sysv-generator(8)
Tasks: 2 (limit: 4915)
CGroup: /system.slice/amavis.service
├─16616 /usr/sbin/amavisd-new (master)
└─18060 /usr/sbin/amavisd-new (ch16-avail)
~~~
## Configuration
Fichiers de configuration :
~~~
/etc/amavis/
├── conf.d
│ ├── 01-debian
│ ├── 05-domain_id
│ ├── 05-node_id
│ ├── 15-av_scanners
│ ├── 15-content_filter_mode
│ ├── 20-debian_defaults
│ ├── 25-amavis_helpers
│ ├── 30-template_localization
│ └── 50-user
├── en_US
│ ├── charset
│ ├── template-auto-response.txt
│ ├── [...]
│ └── template-virus-sender.txt
└── README.l10n
~~~
La configuration se trouve dans les fichiers du répertoire `/etc/amavis/conf.d/` et nous utilisons le fichier `/etc/amavis/conf.d/49-evolinux-defaults` pour notre configuration de base :
~~~
# expediteur des notifications
$mailfrom_notify_admin = "postmaster\@$mydomain";
$mailfrom_notify_recip = "postmaster\@$mydomain";
$mailfrom_notify_spamadmin = "postmaster\@$mydomain";
# Liste des domaines considérés comme locaux
#@local_domains_acl = qw(.);
@local_domains_acl = (".example.net","example.com");
# On customise la ligne ajoutée dans les entêtes
$X_HEADER_LINE = "by Amavis at $mydomain";
# Notifications de fichiers bannis / virus
$virus_admin = "postmaster\@$mydomain";
# Ne pas recevoir des notifications pour les mails UNCHECKED
#delete $admin_maps_by_ccat{&CC_UNCHECKED};
# Que faire avec les messages détectés
$final_virus_destiny = D_DISCARD;
$final_banned_destiny = D_BOUNCE;
$final_spam_destiny = D_BOUNCE;
$final_bad_header_destiny = D_PASS;
# Pour recevoir des bounces (mails originals) des fichiers bloqués / virus
#$banned_quarantine_to = "banned\@$mydomain";
#$virus_quarantine_to = "virus\@$mydomain";
# Note tueuse
$sa_tag2_level_deflt = 6.31;
# Pour un comportement "normal" de SA
$sa_tag_level_deflt = -1999;
$sa_kill_level_deflt = 1999;
$sa_dsn_cutoff_level = -99;
$sa_spam_subject_tag = '[SPAM] ';
# log
$log_level = 2;
# En fonction besoin/ressources, on ajuste le nbre de process
$max_servers = 5;
~~~
> *Note* : attention, vous ne devez pas mettre de `.` dans votre nom de fichier de configuration, sinon il ne sera pas lu par Amavis (qui détecte les fichiers de configuration grâce à la commande `run-parts --list /etc/amavis/conf.d/`)
### Configuration avec Postfix
Pour activer Amavis avec [Postfix](HowtoPostfix), on ajoutera dans le fichier `/etc/postfix/master.cf` :
~~~
smtp-amavis unix - - y - 2 lmtp
-o lmtp_data_done_timeout=1200
-o lmtp_send_xforward_command=yes
127.0.0.1:10025 inet n - y - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-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 mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-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
pre-cleanup unix n - n - 0 cleanup
-o virtual_alias_maps=
-o canonical_maps=
-o sender_canonical_maps=
-o recipient_canonical_maps=
-o masquerade_domains=
-o always_bcc=
-o sender_bcc_maps=
-o recipient_bcc_maps=
~~~
Pour éviter les doublons, il est conseillé d'ajouter l'option `-o cleanup_service_name=pre-cleanup`
aux services _smtp_, _cleanup_, _submission_ et _smtps_.
Et enfin, pour activer Amavis, on ajoute dans le fichier `/etc/postfix/main.cf` :
~~~
content_filter = smtp-amavis:[127.0.0.1]:10024
~~~
### Fichiers bannis
On peut bannir des fichiers en fonction de leur extension ou de leur type.
On ajustera la direction `$banned_filename_re` si besoin, voici son comportement par défaut :
~~~
$banned_filename_re = new_RE(
qr'\.[^./]*\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)\.?$'i,
qr'\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?$'i,
qr'^application/x-msdownload$'i,
qr'^application/x-msdos-program$'i,
qr'^application/hta$'i,
qr'.\.(exe|vbs|pif|scr|bat|cmd|com|cpl)$'i,
qr'^\.(exe-ms)$',
);
~~~
## Filtres externes
### ClamAV
L'usage principal d'Amavis est de lancer un antivirus, notamment [ClamAV](https://www.clamav.net/) qui est libre et gratuit.
~~~
# apt install clamav-daemon
# adduser clamav amavis
# adduser amavis clamav
~~~
Il faut aussi modifier ce paramètre via `/etc/clamav/clamd.conf` :
~~~
AllowSupplementaryGroups true
~~~
Et enfin on active l'antivirus dans la configuration Amavis via la ligne :
~~~
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
~~~
### SpamAssassin
On peut aussi lancer [SpamAssassin](HowtoSpamAssassin) avec Amavis.
~~~
# apt install spamassassin spamc
~~~
Puis on active SpamAssassin dans la configuration Amavis via la ligne :
~~~
@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
~~~
## Administration
### Notifications
Le comportement des notifications par défaut est de :
* si un virus est détecté, mise en quarantaine sans notification à part pour `$virus_admin` (`D_DISCARD`)
* si un spam est détecté (`$sa_kill_level_deflt`), génère un mail de rejet à l'expéditeur si sa note est en dessous de `$sa_dsn_cutoff_level` (`D_BOUNCE`)
* si un fichier banni est détecté, génère un mail de rejet à l'expéditeur (`D_BOUNCE`)
> *Note* : Si le domaine de l'expéditeur est dans `@local_domains_acl`, alors l'expéditeur est toujours notifié !
On peut modifier ce comportement avec les directives :
~~~
$final_virus_destiny = D_DISCARD;
$final_banned_destiny = D_BOUNCE;
$final_spam_destiny = D_BOUNCE;
$final_bad_header_destiny = D_PASS;
~~~
On conseille de modifier `$sa_dsn_cutoff_level` afin de ne générer aucun rejet pour un spam (où l'expéditeur est souvent usurpé).
### Ressortir un mail de quarantaine
Lorsqu'un mail est mis en quarantaine, Amavis logue un message du type :
~~~
amavis[31262]: (31262-05) Blocked BANNED [...] quarantine: 5/banned-5VspXCi2iNIn, [...]
~~~
Pour le ressortir de la quarantaine et le renvoyer au destinataire :
~~~
# amavisd-release 5/banned-5VspXCi2iNIn
~~~
### Renvoyer les emails bloqués vers une adresse email
Tous les emails bloqués (virus, fichiers bannis, etc.) peuvent être renvoyés sur une adresse.
Pour cela, on configure le paramètre suivant :
~~~
$banned_quarantine_to = "quarantaine\@example.com";
~~~
### Whitelister une adresse email
On peut mettre en liste blanche des adresses email via la directive :
~~~
@whitelist_sender_maps = ( new_RE(
qr'jdoe@example.com$'i,
));
~~~
## Intégration avec LDAP
Amavis a besoin d'avoir son propre schéma LDAP : <https://amavis.org/LDAP.schema.txt>
Il faut intégrer ce schéma à votre annuaire LDAP puis configurer Amavis :
~~~
$enable_ldap = 1;
$default_ldap = {
hostname => '127.0.0.1', tls => 0,
base => 'cn=%d,ou=people,dc=example,dc=com', scope => 'sub',
query_filter => '(&(mailacceptinggeneralid=%m)(accountActive=TRUE))'
};
~~~
Évidemment, vous devez adapter la configuration à votre annuaire LDAP, notamment `query_filter`.
Vous pouvez ensuite ajouter la classe `amavisAccount` à vos objets et utiliser les différents attributs (`amavisBypassVirusChecks`, `amavisBypassSpamChecks`, `amavisSpamTagLevel`, etc.).
## Monitoring
### Nagios
Nous utilisons ce petit script Perl [check_amavis.pl](https://github.com/glensc/monitoring-plugin-check_amavis) :
~~~
$ /usr/local/lib/nagios/plugins/check_amavis --server 127.0.0.1 --from monitoring@example.com --to postmaster@localhost --port 10024
~~~
## FAQ
### Erreur "Can't connect to UNIX socket"
Si vous obtenez cette erreur, il est possible que la socket d'Amavis soit
située dans `/var/run/` à la place de `/var/lib/`. Dans ce cas il suffit de
modifier la socket dans la configuration d'Amavis :
~~~
$unix_socketname = "/var/lib/amavis/amavisd.sock";
~~~