Amavis + spamassassin

Bonjour,

je rencontre un problème étrange dans la configuration d’amavis en conjonction avec spamassassin.

Les headers des messages etant identifiés comme SPAM ne sont pas modifiés avec les flags X-SPAM et compagnies …

Configuration :
Amavisd -> amavisd-new-2.5.2 (20070627)
Spamassassin -> SpamAssassin version 3.2.3
Perl -> v5.8.6

Lorsque j’envoi la chaine test GTUBE (XJSC4JDBQADN1.NSBN32IDNENGTUBE-STANDARD-ANTI-UBE-TEST-EMAILC.34X), mon message est bien detecté comme spam avec comme score 1000.002

[5801] dbg: check: is spam? score=1000.002 required=5
[5801] dbg: check: tests=GTUBE,HTML_MESSAGE,UNPARSEABLE_RELAY

Le problème est que le destinataire de ce message recoit bien le mail mais le sujet n’est pas modifié et les X-SPAM flags ne sont pas ajouté dans le header …

Voici les parties concernees dans la config de mon amavisd-new


$sa_tag_level_deflt  = -9999;  # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 5;  # add 'spam detected' headers at that level
$sa_kill_level_deflt = 100;  # triggers spam evasive actions (e.g. blocks mail)
$sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent
# $sa_quarantine_cutoff_level = 25; # spam level beyond which quarantine is off
$penpals_bonus_score = 8;    # (no effect without a @storage_sql_dsn database)
$penpals_threshold_high = $sa_kill_level_deflt;  # don't waste time on hi spam

$sa_spam_subject_tag = '***SPAM_SCORE_*** ';
$sa_spam_modifies_subj = 1;
$sa_spam_report_header = 1;

$notify_method  = 'smtp:[127.0.0.1]:10025';
$forward_method = 'smtp:[127.0.0.1]:10025';  # set to undef with milter!

# $final_virus_destiny      = D_DISCARD;
# $final_banned_destiny     = D_BOUNCE;
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;

Je recois aussi le mail en quarantaine (normal car la variable $sa_kill_level_deflt = 100;) mais avec les X-SPAM flag mais sans modification du sujet du mail.

J’espère que vous pourrez m’aider car là je tourne en rond depusi ce matin :frowning:

lance amavis en mode debug vers un fichier texte
/etc/init.d/amavis debug 2>debug.txt
ensuite tu envois ta chaîne test
tu consultes ensuite ton debug.txt voir ce qu’il indique concernant le $sa_spam_subject_tag

C’est fait. Aucune allusion à la modification du sujet dans les logs :frowning:

On voit bien que le message mis en quarantaine à ses headers de modifier mais pas son sujet.

On voit bien que le message lib-vré au destinataire à ses headers modifiés mais qui n’apparaissent pas dans le message recu :frowning:

Voici les logs amavis avec la partie importante à partir de “header: X-Spam-Flag”

A noter cette commande dont je ne connait pas le rôle : "headers CLUSTERING: NEW CLUSTER "
Edité le 27/11/2007 à 13:25

essaye avec cette règle dans amavisd.conf (oublie pas de relancer amavis après édition)
$final_spam_destiny = D_BOUNCE;

pour le bidule cluster j’ai la même chose dans mes logs donc ça doit être normal

En passant le paramètre $final_spam_destiny à D_BOUNCE

L’expediteur du message recoit un DSN (delivery sender notification) comme quoi son message est considéré comme SPAM.

le destinataire ne recoit rien.

Le mail est mis en quarantaine.

Le comportement est normal. Rien à dire.

Le problème est que le header du mail envoyé au destinataire n’est pas modifié alors que celui mis en quanrantaine l’est …

Ca commence à me gonfler ce bordel

Ca y’est j’ai trouvé d’où vient le problème mais je n’ai aps encore la solution.

Amavis reecrit les entetes des mail qu’il considère comme SPAM pour des messages dont le serveur mail s’occupe des destinataires, pour des messsages locaux pour faire simple.

J’ai detecté cette ligne dans les logs :

headers CLUSTERING: NEW CLUSTER <informatique@exemple.com>: score=1001.459, tag=1, tag2=1, local=0, bl=, s=, mangle=

On voit bien que local=0 et non à 1

En modifiant le parametre “$mydomain =toto.com” dans le fichier de conf d’amavis par le domaine de l’adresse du destinataire “$mydomain =exemple.com” cela fonctionne, les headers sont ecrit et le sujet modifié.

Mon problème est de comprendre desormais ce parametre car je ne vais pas m’amuser à lister tous les domaines dont mon serveur de mail à la charge dans le parametre @local_domains_maps

Pourrais tu me faire passer ton fichier de conf nottament au niveau de ce parametre et ausis celui “@local_domains_maps” et “@mynetworks

merci
Edité le 14/09/2007 à 12:42

je te file mon main.cf

biff = no
myhostname = serveur.mon.domaine.fr
mydomain = mon.domaine.fr
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost
relayhost =
mynetworks = 127.0.0.0/8
inet_interfaces = all
recipient_delimiter = +
append_dot_mydomain = no

virtual_uid_maps = static:5000
virtual_gid_maps = static: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=dovecot
dovecot_destination_recipient_limit=1
smtpd_tls_cert_file=/etc/postfix/smtpd.cert
smtpd_tls_key_file=/etc/postfix/smtpd.key
home_mailbox = Maildir/
local_transport = local
smtpd_banner = $mydomain SMTP
smtpd_use_tls = yes
smtpd_sasl_auth_enable = yes
#broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_helo_required = yes
disable_vrfy_command = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
reject_unknown_recipient_domain
reject_unknown_sender_domain
reject_unknown_helo_hostname
reject_unknown_client_hostname
reject_unverified_recipient
reject_unverified_sender
reject_non_fqdn_recipient
reject_non_fqdn_sender
reject_non_fqdn_helo_hostname
reject_invalid_helo_hostname
reject_rbl_client list.dsbl.org
reject_rbl_client zen.spamhaus.org
reject_rbl_client l1.spews.dnsbl.sorbs.net
reject_rbl_client combined.njabl.org
reject_rbl_client bl.spamcop.net
reject_rhsbl_sender dsn.rfc-ignorant.org
reject_rhsbl_sender bogusmx.rfc-ignorant.org
reject_rhsbl_sender rhsbl.sorbs.net
reject_rhsbl_client dsn.rfc-ignorant.org
reject_rhsbl_client bogusmx.rfc-ignorant.org
reject_rhsbl_client rhsbl.sorbs.net

content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings


et là c’est mon 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”).

==========================================================================

service type private unpriv chroot wakeup maxproc command + args

(yes) (yes) (yes) (never) (100)

==========================================================================

smtp inet n - - - - smtpd
#submission inet n - - - - smtpd

-o smtpd_enforce_tls=yes

-o smtpd_sasl_auth_enable=yes

-o smtpd_client_restrictions=permit_sasl_authenticated,reject

#smtps inet n - - - - smtpd

-o smtpd_tls_wrappermode=yes

-o smtpd_sasl_auth_enable=yes

-o smtpd_client_restrictions=permit_sasl_authenticated,reject

#628 inet n - - - - qmqpd
pickup fifo n - - 60 1 pickup
cleanup unix n - - - 0 cleanup
qmgr fifo n - n 300 1 qmgr
#qmgr fifo 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
smtp unix - - - - - smtp

When relaying mail as backup MX, disable fallback_relay to avoid MX loops

relay unix - - - - - smtp
-o fallback_relay=

-o smtp_helo_timeout=5 -o smtp_connect_timeout=5

showq unix n - - - - showq
error 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}

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}

dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20

127.0.0.1:10025 inet n - - - - 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 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


[quote="jaddeom"]

Le problème est que le header du mail envoyé au destinataire n’est pas modifié alors que celui mis en quanrantaine l’est …
[/quote]

ce que je comprend pas c’est que si le mail est mis en quarantaine pourquoi le destinataire le reçoit tout de même


[quote="jaddeom"]

On voit bien que local=0 et non à 1
merci
[/quote]

dans mon debug local =0 aussi

Et bien la quarantaine serait bpur garder une copie d’un message detecté comme SPAM pour pouvoir faire apprendre le filtre bayesien de spamassassin.

Peut être as tu une autre solution pour ca ?

En ce qui concerne la variable local=0, je ne sais pas c’est étrange …

J’ai trouvé la solution pour mon problème, j’intérroge via amavis ma base de données d’utilisateur mail.

Merci à toi :wink:

j’ai pas encore trop regardé la question de l’apprentissage mais faut peut-être pas trop automatiser les mails qui vont être pris en compte au risque de fausser l’apprentissage avec des faux positifs!
Y’es des mails aussi qui peuvent être considérés comme des pourriels par certains utilisateurs et pas par d’autres comme par exemple les newsletter de divers sites!
Le mieux c’est peut-être que chaque utilisateur renvoie les spams aux admin qui vont les soumettre ensuite ou pas à l’apprentissage! Tu peux définir des utilisateurs de confiance qui peuvent eux aussi soumettre des spams à l’apprentissage en créant une boîte au lettre spécifique où ces utilisateurs vont déposer les spams. Avec un script tu récupères les mails dans ces boite pour les soumettre à l’apprentissage!

Enfin ce ne sont que des idées parce que je répète c’est pas encore un truc que j’ai fait!

Oui effectivementil y a le probleme des faux positif mais on peut après mettre en quarantaine que des messages dont le score dépasse une certaine valeur.

Il suffit de parametrer cette valeur assez haut pour eviter les faux positifs.

Après les spam mentionnés par les utilisateurs je n’en tiendrais pas compte car comme tu le dis certains peuvent indiquer une newsletter comme spam puis il y surtout l’erreur humaine :wink:

Bonjour jaddeom,

j’ai exactement le même problème que toi, pourrais tu poster ta solution :

Merci d’avance, je galere depuis un moment
Edité le 22/11/2007 à 13:07

Salut,

Lis les README concernant Mysql fournit avec les sources Amavis. Ils expliquent bien les notions de base à connaître.

Ensuite, comme indiqué, j’ai configuré Amavis pour qu’il interroge ma base de données utilisateurs. Dans cette base de données tu peux stocker le fait que l’utilisateur soit local (et donc permettre la modification du header).

Voici la section de ma configuration qui y fait allusion



# ----------------------------
# ACCES MYSQL
# ----------------------------

# Dans ce cas la, dsn = data source name et non delivery sender notification
# Base pour les requetes de type lookup soit SELECT
# Je vais devoir rechercher sur la base amavis (pour obtenir la policy de l'utilisateur) ainsi que sur la base
# postfix pour savoir si l'utilisateur est un utiliateur local.
# L'utilisateur amavis doit donc avoir le droit SELECT sur la base postfix.
@lookup_sql_dsn = ( [ 'DBI:mysql:database=amavis;host=localhost', 'amavis', 'password' ] );

# Permet de specifier une base differentes pour les requetes de stockage (create, update, insert ...)
@storage_sql_dsn = ( [ 'DBI:mysql:database=amavis;host=localhost', 'amavis', 'password' ] );

# Indique que l'adresse mail d'une base de donnees qui est retournee sans @ correspond a un domaine et non
# a un utilisateur local. Par defaut = 0
$sql_lookups_no_at_means_domain  = 1;

# Requete SQL pour verifier si le domain de l'adresse du destinataire est liste dans notre base. Et donc le 
# cas echeant est un domaine local.

# Requete qui permet d'interroger la base postfix pour savoir si le domaine du destinataire est un domaine local.
# SI OUI, alors l'entete du message peut etre modifie. Si NON, l'entete n'est pas modifie.
# Je m'assure que le domaine soit local en ajoutant " "Y" AS local " dans la requete SQL meme si sans cela, les domaines sont quand meme cosideres comme locaux.
# Via cette requete select, amavis recherche la valeur d'autres variables dans la base amavis. Par exemple si la personne a activee le filtre
# anti spam etc ... Ces autres variables sont stockees dans la table policy de la base amavis. Il va donc y avoir une recherche sur 2 base diferentes (postfix et amavis)
# Certaines valeures comme savoir si le filtre anti-spam est active doivent etre recuperee dans la requete select. Je dois donc donner le droit select sur la base postfix
# a l'utilisateur amavis
# si l'adresse du destinataire est informatique@exemple alors %k = informatique@test.exemple.com, test.exemple.com, .test.exemple.com, .exemple.com, .com, .
# Ceci explique la condition de la requete select qui est de type IN
# Si aucune policy n'est trouvee alors c'est la policy par defaut qui est appliquee
$sql_select_policy =
   'SELECT *'.
    ' FROM (SELECT *, "Y" AS local'. 
        ' FROM postfix.mailbox WHERE username IN (%k) AND (active=1) ) AS user'.
   ' LEFT JOIN policy ON policy_id=policy.id';

# Si on utilise une base MySQL et que le champ time_iso de la table msgs est au format timestamp
# alors il faut activer cette variable. Ce qui est notre cas.
$timestamp_fmt_mysql = 1;

# ----------------------------
# FIN ACCES MYSQL
# ----------------------------