ClamAV modifikationsfrei in QMail einbinden

BoMbY

Registered User
Hallo,

also das Plesk Power Panel bietet die Möglichkeit eigene Mail Handler einzubinden, ohne Qmail selbst zu verändern - was natürlich für spätere Updates ideal ist.

Das ganze hier ist momentan nicht viel mehr als ein Proof of Concept, aber vielleicht lässt sich ja etwas daraus machen.

Mein Perl-Script (siehe Anhang) macht Momentan nichts weiter, als eine komplette Mail an den ClamAV-Daemon zu übergeben, und einen Reject (kein Bounce, wenn es 'before-queue' registriert wird) auszulösen, wenn eine Virussignatur gefunden wurde. Dies lässt sich für eine Domain, einen Benutzer oder Global aktivieren. Es wird derzeit der deprecated Befehl 'STREAM' von clamd benutzt, da ich die aktuelle Version mit dem neuen Befehl 'INSTREAM' noch nicht testen konnte. Entsprechende Einträge im Mail-/Syslog sollten geschrieben werden.

-----------------

Für die Zukunft/ToDo:

- Es wäre auch möglich die Mail entsprechend zu verändern, zum Beispiel Header hinzuzufügen, dazu muss nur der Standard-Output entsprechend angepasst werden.
- Alternativ könnte man die Mails zum Beispiel in einem Verzeichnis ablegen, und dem Benutzer eine komplett andere Statusmail zusenden (wie Dr.Web es glaube ich zur Zeit macht).
- Derzeit scheint es übrigens nicht möglich zu sein, eine eigene Meldung als Reject-Message zurückzugeben, weswegen Qmail dem Sender immer mit dem Default antwortet.
- Wenn der installierte ClamAV-Daemon INSTREAM unterstützt, sollte dieses benutzt werden (ClamAV-Version checken).
- ClamAV-Konfiguration sollte automatisch ausgelesen werden.
- Individuelle konfigurierbare Optionen zur Mailbehandlung.
- Theoretisch sollte es auch Möglich sein, einen eigenen Virenscanner in die PPP-Oberfläche zu integrieren (Pluggable Antivirus Filters), aber da stehe ich Momentan noch total auf dem Schlauch.

Vielleicht hat ja sonst noch jemand noch ein paar nette Ideen oder Hinweise?

-----------------

Eine Doku zu den Mail Handlern usw. kann man bei Parallels finden: http://download1.parallels.com/Plesk/PPP9/Doc/en-US/plesk-9.2-unix-mod-api/
Clamd-Doku: http://www.clamav.net/doc/latest/html/node26.html

-----------------

Zur Installation:

Das Script 'qclamd.pl' muss mit Ausführberechtigung für QMail versehen werden, also zum Beispiel (r-xr-xr-x/555). Außerdem muss natürlich ClamAV installiert sein. Je nach System muss die Zeile 'my $clamd_socket = '/var/run/clamav/clamd.ctl';' entsprechend angepasst werden, da das Script die Konfiguration von ClamAV derzeit nicht auslesen kann.

Man kann dann das Script soweit auf Funktionalität mittels des weiteren Scripts 'qclamd_test.pl' testen, welches eine Datei als Parameter erwartet, welche dann mittels 'qclamd.pl' an ClamAV übergeben und gechecked wird. Dabei sollte keine Fehlermeldung (ERROR) ausgegeben werden, sondern ein Status (PASS oder REJECT) und bei sauberen Dateien zusätzlich der Quelltext der Nachricht.

Einbinden kann man das Script als Mail Handler dann per Kommandozeile zum Beispiel wie folgt:

für eine Mailadresse:
Code:
/usr/local/psa/admin/bin/mailmng --add-handler --handler-name=qclamd --handler-type=recipient --handler-type-name=user@domain.com --executable=/path/to/qclamd.pl --context='single' --hook=before-queue --priority=90

oder Global für alle:
Code:
/usr/local/psa/admin/bin/mailmng --add-handler --handler-name=qclamd --handler-type=global --executable=/path/to/qclamd.pl --context='global' --hook=before-queue --priority=90

Die Priorität von 90 sollte dazu führen, dass das PPP greylisting (05) und spf (10) vorher ausgeführt werden.

----------

Getestet derzeit nur mit PPP 9.2.3 unter Ubuntu 8.04 (Hardy) und mit ClamAV 0.94.2.
 

Attachments

Last edited by a moderator:
Hi,

habe dein Script mal installiert. Der Ansatz ist schon mal sehr gut.
Funktionierte nicht auf anhieb. (Debian Etch, Plesk 9.3.0).

Fehlermeldung:
PHP:
qclamd.pl[2735]: Error: Cannot connect to unix socket '/var/run/clamav/clamd.ctl': Permission denied at /opt/psa/handlers/info/90-qclamd-CLOx4e/executable line 55

Der Clamav Daemon läuft bei mir unter clamav.clamav.

Habe die Standard clamd.conf.

Den User habe ich nun in der clamd.conf auf qmailq gesetzt.
/var/run/clamav und /var/log/clamav auf qmailq.qmail.
clamd.ctl läuft auf qmaild.nofiles

Scheint jetzt zu funktionieren. Bekomme nun die Fehlermeldung:
PHP:
554 mail server permanently rejected message (#5.3.0)
PHP:
mail.info: qclamd.pl[6211]: Virus signature found: Eicar-Test-Signature

Das ist doch so richtig oder?
 
Hallo,

ja, genau so sollte es Momentan aussehen, wenn ein Virus erkannt wird. Die 554-Nachricht läßt sich leider wie gesagt nicht ändern zur Zeit.

Das mit der Berechtigung ist irgendwie seltsam. Eigentlich steht in der Mailhandler-Doku folgendes:

The handler will be invoked with the rights defined for its owner, regardless of those with which MTA is running. If specific rights for file system access are required, the handler should be given the SETUID bit.

Das scheint aber irgendwie nicht zu funktionieren?

Leider hab ich im Moment auch wenig Zeit, das Script zu verbessern (vielleicht komme ich Morgen mal dazu - ist ja quasi ein Feiertag hier).
 
Ich bekomme diese Meldung:
Code:
Feb 17 16:26:20 atom022 qmail-queue-handlers[25789]: call_handlers: Error during call '/opt/psa/handlers/info/90-qclamd-vLIsz8/executable' handler
Feb 17 16:26:20 atom022 qmail-queue-handlers[25789]: LOG Internal error in handler '90-qclamd-vLIsz8'. Skip handler.

Der clamd daemon läuft bei mir auf /var/run/clamav/

Gruss
Klaus
 
Hallo Klaus,

wenn ich mich richtig erinnere kommt so eine Meldung, wenn der MailHandler-User keine Berechtigung dazu hat das Script auszuführen, bzw. die Pfadangabe nicht stimmt. Kann das sein?

Gruß,
BoMbY
 
Hallo BoMbY,

Also die Pfandangaben stimmen, die Rechte sind auch gesetzt,
Clamav läuft und ist als Standart Installiert worden Config nichts geändert.

Gruss
Klaus
 
Ich habe den mailhandler mal (unverändert perl) implemetiert (unverändert GPL).

(getestet unter Plesk 10.1.1 SUSE 10.3 clamd 0.97.2 )

siehe angehängte tgz-Datei (Quelle: http://heirich.eu/drupal/clamav-plesk)

Änderungen zum proof-of- concept von BoMbY:
-bugfix im test-programm für große mails
-automatischer filemodus für große mails ( > ca. 64KByte werden als file in /tmp gespoolt, nicht im Hauptspeicher zwischengespeichert )
-optional wird ein X-Virus-Checker: header erzeugt; ggfls. mit Zeitangabe
-Benutzung von INSTREAM des clamd

PS: Ich selbst benutze kein Plesk, aber was tut man nicht alles für Freunde
 

Attachments

Hallo allerseits,

Sorry für das herausholen eines älteren Beitrags.
Gibt es hierzu schon eine Lösung bzw Weiterentwicklung und hat das jemand getestet?

Es würde mich sehr interessieren ob man diese Lösung sauber betreiben kann unter Ubuntu 8 + 10 mit Plesk 9 und 10.

Gruss
 
Wieso nicht ?

ich wüßte nicht, warum das nicht gehen sollte.

hitd-q2clamd-0.3.tgz läuft derzeit ( im Prinzip ) unverändert auf einem centos 6 Server
mit PLESK 11 unter postfix.

Die Mailhandlerumgebung sollte bei allen PLESK for Linux gleich sein und ist wohl seit zumindest PLESK 9 unverändert.

Es wurde zwar für einen SuSE-Server mit PLESK 9 entwickelt,lief aber unter der gleichen SuSE auch mit PLESK 10 ( jeweils qmail) und nach Serverupdate vor einigen Wochen (Dez.2012) habe ich es unverändert auf einem centos 6 mit postfix unter PLESK 11 mit aktuellem clamav im Einsatz.
 
Last edited by a moderator:
Hallo, erst einmal vielen Dank für Dein Script, es funktioniert soweit wunderbar. Sporadisch gibt es allerdings Probleme mit Mails.
Fehler im syslog:
Code:
Mar 21 12:12:55 XXXXXXXX hitd-q2clamd[9431]: Error: Send error during datalength to unix socket '/var/run/clamav/clamd.ctl':  at /opt/psa/handlers/info/90-hitd-q2clamd-Dnadwm/executable line 230.
Die Mails sind dann (wegen "die") einfach nur weg, was u.U. sehr übel sein kann.

Ich habe im Script nachgeschaut, es dreht sich um die Stelle, wo die Mail als Stream byteweise eingelesen wird.
Code:
Zeile 230: print $clamd chr(($byte_size >>  8 ) & 255) || die "Send error during...
Hast Du dieses Problem auch, bzw. eine Idee wie es zu beheben ist? Du schreibst doch, dass Du das seit geraumer Zeit im Einsatz... Danke im voraus für jeden Hinweis.
 
Lösung gefunden!

Durch liebevolles Debuggen habe ich jetzt die Ursache für die sporadischen "die"s beim Schreiben in den Clam-Socket gefunden.

Die korrekte Version sieht so aus:
PHP:
...
		(print $clamd chr(($byte_size >> 24 ) & 255)) || warn "Send error during datalength to unix socket '$clamd_socket': $!";
		(print $clamd chr(($byte_size >> 16 ) & 255)) || warn "Send error during datalength to unix socket '$clamd_socket': $!";
		(print $clamd chr(($byte_size >>  8 ) & 255)) || warn "Send error during datalength to unix socket '$clamd_socket': $!";
		(print $clamd chr( $byte_size         & 255)) || warn "Send error during datalength to unix socket '$clamd_socket': $!";
...

Problem im Original-Code ist
PHP:
chr(($byte_size >> 24 {bzw.16,8,} ) & 255) || die "Send ...

Wenn das Ergebnis von chr(...) z.B. 0 oder false ist - was durchaus passieren kann - , ist das Script an der Stelle beendet und die Mail ist futsch.

Könnte man die 4 oben genannten Zeilen auch so zusammenfassen?
PHP:
print $clamd reverse(pack("V",$byte_size));

Zusatzfrage: Wozu werden diese Zeichen an den Clamd übergeben? Ich verstehe das ehrlich gesagt nicht ganz.
 
Back
Top