amavisd-new: Mail nur einmal nach Viren scannen

Beim Lesen der Überschrift werden sich viele Leute nur “WTF?” denken - dürften die meisten doch davon ausgehen, daß ihre Installation von amavisd-new, wenn sie denn einen Virenscanner benutzen, selbigen auch nur einmal auf jede ankommende Mail loslässt. Normalerweise ist das auch so. Jetzt gibt es aber Situationen, in denen man die ganze Mail braucht, um sie dem Scanner vorzuwerfen, z.B. die Sanesecurity-Signaturen, was man folgendermaßen erreichen kann:

$bypass_decode_parts = 1;

Leider führt das dazu, daß einige Funktionen nicht mehr vernünftig arbeiten, unter anderem das Blocken von Attachments nach Typ oder der Bounce Killer. Also gehen viele den Weg, oben genannten Wert doch auf seinem Default zu belassen und fügen statt dessen in die Map @keep_decoded_original_maps folgende Zeile ein:

@keep_decoded_original_maps = (new_RE(
  ... stuff ...
  qr'^MAIL$',   # retain full original message for virus checking (can be slow)
  ... stuff ...
));

Damit hebt amavisd-new die komplette Mail auf - man hat also einen funktionierenden Bounce Killer, funktionierendes Attachment-Blocking und Sanesecurity-Signaturen. Dummerweise scannt der Virenscanner die Mail aber jetzt effektiv zweimal: Einmal die im Original erhaltene Mail und einmal deren einzelne Teile. Um das zu umgehen kann man ganz einfach die Definition des Virenscanners verändern:

@av_scanners = (
['ClamAV-clamd',
   \&ask_daemon, ["CONTSCAN {}/../email.txt\n", "/var/run/clamav/clamd"],
   qr/\bOK$/, qr/\bFOUND$/,
   qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);

Gerade in hochvolumigen Setups dürfte das nochmal einiges an Performance-Zugewinn bringen.

Die Sonne scheint, ich habe zwei tolle CDs mit Chopin-Nocturnes gerade auf meinen MP3-Player kopiert und werde das tolle Wetter jetzt ausnutzen, um Skaten zu gehen.