Amavis MySQL

De Wiki NCad
Révision de 12 février 2014 à 02:30 par Cacheln (discuter | contributions) (Prérequis)

Aller à : navigation, rechercher

.:[ Serveur de Messagerie ]:.

Installation >> Postfix avec MySQL

Anti-Spam SpamAssassin | Anti-Virus Clamav


Plateforme de filtrage Amavis >> Amavis avec MySQL


Ajouter un Disclaimer


Configurer Thundirbird | Configurer Roundcube


Commandes messagerie | DNSBL | MX Backup
Amavis Logo.gif

Prérequis

Il est nécessaire de disposer d'un serveur de mails basé sur Postfix fonctionnel. Il est également nécessaire d'avoir installé le service Amavis ainsi que ClamAV et SpamAssassin. une base de données de type MySQL est également requise.

ICON Information.png

Amavis peut s'interfacer avec d'autre solutions logicielles mais elle ne seront pas abordées ici.

Amavis dispose d'un module qui permet de l'interfacer avec une base de données comme MySQL. On retrouve les fonctions suivantes :

  • liste blanche/noire;
  • priorisation des émetteurs;
  • activation/désactivation des filtres;
  • archivage des mails en quarantaine;
  • archivage des métadonnées des mails traités par Amavis.
ICON boxWarning.png

Dans cet article le serveur mysql et le serveur mail sont hébergés sur deux machines différentes. Si ce n'est pas le cas de votre configuration, pensez à changer la valeur du hosts.

Le serveur de mail Postfix gère la messagerie pour le domaine mail.glx et a comme adresse IP 10.0.0.44. Sur ce serveur est configuré le compte mail cacheln@mail.glx.

Le serveur de base de données MySQL est hébergé sur une autre machine qui a pour adresse IP 10.0.0.47. La base de données utilisée est postfix dont l'utilisateur postfix avec le mot de passe motdepassebasemysqlpourpostfix détient les permissions nécessaires pour agir sur la base.

Installation des tables

Création des tables

ICON Light.png
La documentation complète ainsi que la structure des tables sont décrites dans les fichiers /usr/share/doc/amavisd-new/README.sql.gz et /usr/share/doc/amavisd-new/README.sql-mysql.gz.

Les règles de filtrage

  • La table policy contient les règles de filtrage pour le spam et les virus (score, activation des divers filtres, tag des messages, avertir l'émetteur en cas d’échec, ...).
CREATE TABLE policy (
  id  int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
                                    -- 'id' this is the _only_ required field
  policy_name      varchar(32),     -- non utilisé par amavisd-new, à titre de commentaire

  virus_lover          char(1) default NULL,     -- Y/N / Ignorer l'analyse des virus
  spam_lover           char(1) default NULL,     -- Y/N / Ignorer l'analyse des spams
  banned_files_lover   char(1) default NULL,     -- Y/N / Ignorer l'analyse des pièces jointes
  bad_header_lover     char(1) default NULL,     -- Y/N / Ignorer l'analyse des en-têtes mails

  bypass_virus_checks  char(1) default NULL,     -- Y/N / Désactivation anti-virus
  bypass_spam_checks   char(1) default NULL,     -- Y/N / Désactivation anti-spam
  bypass_banned_checks char(1) default NULL,     -- Y/N / Désactivation contrôle pièce jointe
  bypass_header_checks char(1) default NULL,     -- Y/N / Désactivation contrôle en-tête mail

  spam_modifies_subj   char(1) default NULL,     -- Y/N / Modification de l'objet pour les spams

  virus_quarantine_to      varchar(64) default NULL,
  spam_quarantine_to       varchar(64) default NULL,
  banned_quarantine_to     varchar(64) default NULL,
  bad_header_quarantine_to varchar(64) default NULL,
  clean_quarantine_to      varchar(64) default NULL,
  other_quarantine_to      varchar(64) default NULL,

  spam_tag_level  float default NULL, -- Score à partir duquel l'analyse Spam est tagué dans l'en-tête mail
  spam_tag2_level float default NULL, -- Score à partir duquel le mail est tagué comme Spam
  spam_kill_level float default NULL, -- Score à partir duquel le mail est supprimé
                                      -- C.f. reject/drop, quarantine, ...
                                     -- (fonction du paramètre final_spam_destiny)
  spam_dsn_cutoff_level        float default NULL, -- Score à partir duquel l'expéditeur n'est pas prévenu
                                                   -- que son mail est traité comme du spam
  spam_quarantine_cutoff_level float default NULL, -- Score à partir duquel le mail est effacé sans mise en quarantaine

  addr_extension_virus      varchar(64) default NULL,
  addr_extension_spam       varchar(64) default NULL,
  addr_extension_banned     varchar(64) default NULL,
  addr_extension_bad_header varchar(64) default NULL,

  warnvirusrecip      char(1)     default NULL, -- Y/N / Avertir le destinataire en cas de mail traité comme virus
  warnbannedrecip     char(1)     default NULL, -- Y/N / Avertir le destinataire en cas de PJ bannie
  warnbadhrecip       char(1)     default NULL, -- Y/N / Avertir le destinataire en cas de mail traité comme mal formé
  newvirus_admin      varchar(64) default NULL,
  virus_admin         varchar(64) default NULL,
  banned_admin        varchar(64) default NULL,
  bad_header_admin    varchar(64) default NULL,
  spam_admin          varchar(64) default NULL,
  spam_subject_tag    varchar(64) default NULL,
  spam_subject_tag2   varchar(64) default NULL,
  message_size_limit  integer     default NULL, -- Taille maximale en bytes du mail, 0 pour désactiver
  banned_rulenames    varchar(64) default NULL  -- Liste des types de fichiers bannis séparés par une virgule
);
  • Nous allons définir quatre profil dans cette table. Le premier permettra de proposer tous les services de filtrage d'Amavis (Tous), le second uniquement l'analyse Anti-Virus (Anti-Virus), le troisième se sera uniquement l'analyse Anti-Spam (Anti-Spam) et dans le dernier profil il n'y aura aucunes analyses (Rien).
INSERT INTO `policy` (`id`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`) VALUES
(NULL, 'Tous', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'Y', NULL, NULL, NULL, NULL, NULL, NULL, 3, 5, 5, NULL, NULL, NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '*** SPAM *** ', NULL, NULL),
(NULL, 'Anti-Virus', 'N', 'N', 'N', 'N', 'N', 'Y', 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(NULL, 'Anti-Spam', 'N', 'N', 'N', 'N', 'Y', 'N', 'Y', 'N', 'Y', NULL, NULL, NULL, NULL, NULL, NULL, 3, 5, 5, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '*** SPAM *** ', NULL, NULL),
(NULL, 'Rien', 'N', 'N', 'N', 'N', 'Y', 'Y', 'Y', 'Y', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

Les utilisateurs

  • La table user contient la liste des utilisateurs ayant une boîte mail locale (Postfix). Elle sera consulter pour vérifier les préférences de l'utilisateur recevant un courriel - si elle existe.
CREATE TABLE users (
  id         int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,  -- unique id
  priority   integer      NOT NULL DEFAULT '7',  -- 0 étant la plus faible priorité.
  policy_id  integer unsigned NOT NULL DEFAULT '1',  -- N° de la règle policy (id) appliquée
  email      varbinary(255) NOT NULL UNIQUE,
  fullname   varchar(255) DEFAULT NULL,    -- Non utilisé par amavisd-new
  local      char(1)      -- Y/N  (optionnel)
);
  • Dans notre exemple, nous disposons sur Postfix de la boîte mail cacheln@mail.glx. Nous allons lui créer un enregistrement dans cette table :
INSERT INTO `users` (`id`, `priority`, `policy_id`, `email`, `fullname`, `local`) VALUES (NULL, 7, 1, 'cacheln@mail.glx', 'Nicolas Cachelou', NULL);
ICON Light.png
Nous avons affecté la policy_id numéro 1 pour que la boîte dispose d'une analyse complète de tous les mails qu'elle reçoit.

Les priorités

  • La table mailaddr contient les adresses ou domaines pour lesquels on souhaite définir une de priorité de traitement. Elle pourra également être appelée si l'on souhaite appliquer à ces adresses des règles de listage (c.f table wblist).
CREATE TABLE mailaddr (
  id         int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  priority   integer      NOT NULL DEFAULT '7',  -- 0 est la plus faible priorité
  email      varbinary(255) NOT NULL UNIQUE
);
ICON Light.png
Le contenu de cette table sera étudié dans la section [[]]

Les listes

  • La table wblist permet de blacklister ou whitelister une adresse émetteur (ou un domaine entier) définie dans la table mailaddr et appliqué pour le destinataire locale définit dans la table (users).
CREATE TABLE wblist (
  rid        integer unsigned NOT NULL,  -- destinataire: users.id
  sid        integer unsigned NOT NULL,  -- émetteur: mailaddr.id
  wb         varchar(10)  NOT NULL,  -- W ou Y / B ou N / espace=neutre / score
  PRIMARY KEY (rid,sid)
);
ICON Light.png
Le contenu de cette table sera étudié dans la section [[]]

Configuration de Amavis

  • Pour activer le module Sql dans Amavis, il faut insérer les deux lignes suivantes dans le fichier /etc/amavis/conf.d/50-user:
 @lookup_sql_dsn = ( ['DBI:mysql:database=postfix;host=10.0.0.47;port=3306', 'postfix', 'motdepassebasemysqlpourpostfix']);
  • On redémarrer le service Amavis pour appliquer la configuration :
ICON Terminal.png

service amavis restart

Validation

  • Pour voir si le module Sql est activé, il suffit de regarder dans les logs mails (/var/log/mail.log) après l'initialisation de Amavis. On y remarquera les lignes suivantes :
Feb 11 12:32:07 alice amavis[2802]: SQL base code        loaded
Feb 11 12:32:07 alice amavis[2802]: SQL::Log code        loaded
Feb 11 12:32:07 alice amavis[2802]: SQL::Quarantine      NOT loaded

Fonctions & Comportements

Listes noires

Définition de l'émetteur

  • Nous souhaitons blacklister le domaine ncad.me. Tous les messages en provenance de ce nom de domaine seront tagués comme spam. Tous d'abord, nous allons déclarer le domaine dans la table mailaddr :
INSERT INTO `courriel`.`mailaddr` (
 `id` ,
 `priority` ,
 `email`
)
VALUES (
 NULL , '7', '@ncad.me'
);

Définition de la règle

  • Nous insérons donc l'enregistrement ayant pour id la valeur 1, comme priority nous indiquons 7 (valeur par défaut) et comme email nous renseignons le domaine ncad.me. Maintenant, nous allons associé ce domaine à une liste noir qui s'appliquera en réception sur la boîte mail de l'utilisateur cacheln@mail.glx.
INSERT INTO `courriel`.`wblist` (
 `rid` ,
 `sid` ,
 `wb`
)
VALUES (
 '1', '1', 'B'
);
  • Dans l'enregistrement ci-dessus, la valeur rid renferme l'id du compte mail local pour qui s'applique la règle. Il s'agit du compte mail cacheln@mail.glx ayant pour id la valeur 1 qui est déclarée dans la table user. La seconde valeur sid concerne l'id du domaine concerné par la règle et qui est déclaré dans la table mailaddr. Dans notre cas c'est le domaine ncad.me ayant pour id la valeur 1. Enfin le champ wb renseigne sur la nature de la liste : W pour liste blanche et B pour liste noire.

Validation

  • On Procède à l'envoi d'un mail depuis l'adresse nicolas.cachelou@ncad.me et à destination de cacheln@mail.glx. Voici ce qu'on observe dans /var/log/mail.log :
Feb 11 13:30:08 alice postfix/smtpd[2852]: connect from geocoucou.net.ncad.fr[10.0.0.49]
Feb 11 13:30:08 alice postfix/smtpd[2852]: 2FAA0462125: client=geocoucou.net.ncad.fr[10.0.0.49]
Feb 11 13:30:08 alice postfix/cleanup[2855]: 2FAA0462125: message-id=<e003a875ad1f6bf934b72d2148324d5d@ncad.me>
Feb 11 13:30:08 alice postfix/qmgr[2140]: 2FAA0462125: from=<nicolas.cachelou@ncad.me>, size=1568, nrcpt=1 (queue active)
Feb 11 13:30:08 alice postfix/smtpd[2852]: disconnect from geocoucou.net.ncad.fr[10.0.0.49]
Feb 11 13:30:08 alice postfix/smtpd[2847]: 6EA6B4621A8: client=localhost[127.0.0.1]
Feb 11 13:30:08 alice postfix/cleanup[2855]: 6EA6B4621A8: message-id=<e003a875ad1f6bf934b72d2148324d5d@ncad.me>
Feb 11 13:30:08 alice postfix/qmgr[2140]: 6EA6B4621A8: from=<nicolas.cachelou@ncad.me>, size=2244, nrcpt=1 (queue active)
Feb 11 13:30:08 alice postfix/smtpd[2847]: disconnect from localhost[127.0.0.1]
Feb 11 13:30:08 alice amavis[2804]: (02804-02) Passed SPAM, [10.0.0.49] [109.190.9.125] <nicolas.cachelou@ncad.me> ->
  <cacheln@mail.glx>, quarantine: g/spam-gtarVQ0QDt4C.gz, Message-ID: <e003a875ad1f6bf934b72d2148324d5d@ncad.me>, mail_id:
  gtarVQ0QDt4C, Hits: -, size: 1568, queued_as: 6EA6B4621A8, 284 ms
Feb 11 13:30:08 alice postfix/virtual[2863]: 6EA6B4621A8: to=<cacheln@mail.glx>, relay=virtual, delay=0.09,
  delays=0.04/0.01/0/0.04, dsn=2.0.0, status=sent (delivered to maildir)
Feb 11 13:30:08 alice postfix/qmgr[2140]: 6EA6B4621A8: removed
Feb 11 13:30:08 alice postfix/smtp[2856]: 2FAA0462125: to=<cacheln@mail.glx>, relay=127.0.0.1[127.0.0.1]:10024, delay=0.36,
  delays=0.03/0/0.01/0.32, dsn=2.0.0, status=sent (250 2.0.0 from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as
  6EA6B4621A8)
Feb 11 13:30:08 alice postfix/qmgr[2140]: 2FAA0462125: removed
  • Le message est bien identifié comme du spam suite au blacklistage. On remarque qu'aucun score n'apparaît, Amavis n'a pas consulté SpamAssassin, il a automatiquement tagué le message comme spam.

Listes blanches

Définition de l'émetteur

  • Nous souhaitons whitelister le domaine ncad.me. Tous les messages en provenance de ce nom de domaine seront ignorés par les analyses spam et anti-virus. Tous d'abord, nous allons déclarer le domaine dans la table mailaddr :
INSERT INTO `courriel`.`mailaddr` (
 `id` ,
 `priority` ,
 `email`
)
VALUES (
 NULL , '7', '@ncad.me'
);

Définition de la règle

  • Nous insérons donc l'enregistrement ayant pour id la valeur 1, comme priority nous indiquons 7 (valeur par défaut) et comme email nous renseignons le domaine ncad.me. Maintenant, nous allons associé ce domaine à une liste noir qui s'appliquera en réception sur la boîte mail de l'utilisateur cacheln@mail.glx.
INSERT INTO `courriel`.`wblist` (
 `rid` ,
 `sid` ,
 `wb`
)
VALUES (
 '1', '1', 'B'
);
  • Dans l'enregistrement ci-dessus, la valeur rid renferme l'id du compte mail local pour qui s'applique la règle. Il s'agit du compte mail cacheln@mail.glx ayant pour id la valeur 1 qui est déclarée dans la table user. La seconde valeur sid concerne l'id du domaine concerné par la règle et qui est déclaré dans la table mailaddr. Dans notre cas c'est le domaine ncad.me ayant pour id la valeur 1. Enfin le champ wb renseigne sur la nature de la liste : W pour liste blanche et B pour liste noire.

Validation

  • Pour tester le comportement de Amavis, on va répéter le test qui a été appliqué ICI. On va envoyé un mail de nicolas.cachelou@ncad.me vers cacheln@mail.glx qui doit normalement être détecté comme spam. Pour cela, dans le corps du message on insèrera la ligne suivante :
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
  • Vérifions les logs enregistrés dans /var/log/mail.log :
Feb 11 13:52:59 alice postfix/smtpd[2892]: connect from geocoucou.net.ncad.fr[10.0.0.49]
Feb 11 13:52:59 alice postfix/smtpd[2892]: EF5B7462125: client=geocoucou.net.ncad.fr[10.0.0.49]
Feb 11 13:53:00 alice postfix/cleanup[2897]: EF5B7462125: message-id=<765d57b3f3561b4a8a7aaaade291cb55@ncad.me>
Feb 11 13:53:00 alice postfix/qmgr[2140]: EF5B7462125: from=<nicolas.cachelou@ncad.me>, size=1696, nrcpt=1 (queue active)
Feb 11 13:53:00 alice postfix/smtpd[2892]: disconnect from geocoucou.net.ncad.fr[10.0.0.49]
Feb 11 13:53:00 alice postfix/smtpd[2901]: connect from localhost[127.0.0.1]
Feb 11 13:53:00 alice postfix/smtpd[2901]: 3DA0746219B: client=localhost[127.0.0.1]
Feb 11 13:53:00 alice postfix/cleanup[2897]: 3DA0746219B: message-id=<765d57b3f3561b4a8a7aaaade291cb55@ncad.me>
Feb 11 13:53:00 alice postfix/qmgr[2140]: 3DA0746219B: from=<nicolas.cachelou@ncad.me>, size=2110, nrcpt=1 (queue active)
Feb 11 13:53:00 alice postfix/smtpd[2901]: disconnect from localhost[127.0.0.1]
Feb 11 13:53:00 alice amavis[2805]: (02805-02) Passed CLEAN, [10.0.0.49] [109.190.9.125] <nicolas.cachelou@ncad.me> ->
  <cacheln@mail.glx>, Message-ID: <765d57b3f3561b4a8a7aaaade291cb55@ncad.me>, mail_id: sAO9urled0rX, Hits: -, size: 1696,
  queued_as: 3DA0746219B, 282 ms
Feb 11 13:53:00 alice postfix/virtual[2903]: 3DA0746219B: to=<cacheln@mail.glx>, relay=virtual, delay=0.14,
  delays=0.06/0.03/0/0.06, dsn=2.0.0, status=sent (delivered to maildir)
Feb 11 13:53:00 alice postfix/qmgr[2140]: 3DA0746219B: removed
Feb 11 13:53:00 alice postfix/smtp[2898]: EF5B7462125: to=<cacheln@mail.glx>, relay=127.0.0.1[127.0.0.1]:10024, delay=0.45,
  delays=0.06/0.01/0.01/0.37, dsn=2.0.0, status=sent (250 2.0.0 from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as
  3DA0746219B)
Feb 11 13:53:00 alice postfix/qmgr[2140]: EF5B7462125: removed
  • Le message n'a pas été scanné, aucun score (Hits) n'apparaît. Il est déclaré automatiquement comme sain (Passed CLEAN) alors qu'il aurait du être identifié comme spam.

Règles de filtrage

Tag des SPAM

Notifications en cas de virus

Enregistrer les métadonnées des mails traités

  • /etc/amavis/conf.d/50-user :
 @storage_sql_dsn = @lookup_sql_dsn;

maddr msgrcpt msgs

Enregistrer les mails en quarantaines

  • /etc/amavis/conf.d/50-user :
@storage_sql_dsn = @lookup_sql_dsn;
$virus_quarantine_method = 'sql:';
$spam_quarantine_method = 'sql:';
$banned_files_quarantine_method = 'sql:';
$bad_header_quarantine_method = 'sql:';

quarantine