Jeder mit PLESK administrierte Server lässt sich kostenlos mit ClamScan Antivirus nachrüsten, sofern man SSH-Zugang mit Root-Rechten hat. Eingehende Mails werden dann automatisch von ClamScan nach Viren und Trojanern untersucht und ggf. aus dem Verkehr gezogen. Dieses Tutorial zeigt die einzelnen Schritte um ClamScan Antivirus unter PLESK zu integrieren.
Plesk: Postfix SMTP Server und Virenscanner
Plesk nutzt Postfix als SMTP-Server. Postfix selbst hat eine offene Architektur, die es erlaubt über TCP/IP Ports mit externen Programmen wie Virenscannern zu kommunizieren. Da ClamScan keine direkte Kommunikation per TCP/IP beherrscht, muss ein Art Proxy-Server, hier ClamSMTP dazwischen geschaltet werden.
Die folgende Grafik zeigt das Zusammenspiel der einzelnen Komponenten:
- Postfix empfängt Mails von aussen über Port 25 und gibt diese über Port 10026 an ClamSMTP weiter.
- ClamSMTP kommuniziert mit dem Virenscanner (ClamScan) über eine lokale Unix Socket und teilt mit, welche Dateien zu scannen sind.
- Wenn keine Infektion vorliegt, gibt ClamSMTP die Mail an Postfix über Port 10025 zurück.
- Ansonsten wurde die Mail von ClamScan je nach Konfiguration entweder gelöscht oder in Quarantäne verschoben.
- Postfix speichert die Mail anschliessend in der Mailbox des Users.
ClamScan und ClamSMTP installieren
Neben ClamScan und ClamSMTP wird noch ein vernünftiger Editor (hier Nano) benötigt. Mit dem folgenden Befehl werden die entsprechenden Pakete installiert:
1 |
apt-get install clamav clamsmtp nano |
In den folgenden beiden Config-Dateien ist AllowSupplementaryGroups auf true zu setzen:
- /etc/clamav/clamd.conf
- /etc/clamav/freshcalm.conf
Die Datei /etc/clamsmtpd.conf wird mit folgenden Einträgen ergänzt:
1 2 3 |
Header: X-AV-Checked: ClamAV using ClamSMTP on mail.domain.com Quarantine: off VirusAction:/usr/local/bin/clamsmtp_on_virus.sh |
mail.domain.com ist hier durch den Namen des eigenen SMTP-Servers zu ersetzen.
ClamSMTP VirusAction-Script
Nun erzeugen wir das zugehörige VirusAction-Script für ClamSMTP. Jede eingehende Mail durchläuft dieses Script. Enthält die Mail eine Bedrohung, so wird sie unmittelbar gestoppt. Der Admin und optional auch der Empfänger werden benachrichtigt:
1 |
nano /usr/local/bin/clamsmtp_on_virus.sh |
Der Inhalt des Scripts fügen wie per Copy-Paste direkt in den Editor ein. Die Variablen ADMIN und MAILFROM müssen entsprechend angepasst werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#!/bin/bash # # clamscan_on_virus 1.0.0 # # Virus handler script for ClamSMTPd # # (c)2017 Harald Schneider # ADMIN="notify@domain.com" MAILFROM="clamscan@domain.com" LOG="/var/log/virus.log" DIR="/var/spool/clamsmtp" exec 1>>$LOG exec 2>>$LOG # Add to log echo "----------------------------------------" echo FROM $SENDER echo TO $RECIPIENTS echo VIRUS $VIRUS echo "----------------------------------------" # Move to quarantine # This only works if quarantine is enabled # #if [ -n "$EMAIL" ]; then # mv "$EMAIL" "$DIR" #fi MAILTEXT=" The following threat has been deteced and eleminated: VIRUSNAME: $VIRUS SENDER IP: $REMOTE SENT FROM: $SENDER RECIPIENT: $RECIPIENTS -- ClamScan Antivirus " # Send mail to original recipient: #echo "$MAILTEXT" | mail -r $MAILFROM -s "VIRUS filtered ($SENDER)" $RECIPIENTS # Send mail to admin echo "$MAILTEXT" | mail -r $MAILFROM -s "CLAMSCAN: VIRUS filtered ($SENDER)" $ADMIN |
Nachdem wir das Script gespeichert haben, setzen wir die Zugriffsrechte mit
1 |
chmod 755 /usr/local/bin/clamsmtp_on_virus.sh |
ClamScan in Postfix integrieren
Um die Kommunikation zwischen ClamSMTP und Postfix herzustellen, müssen 2 Config-Dateien von Postfix entsprechend angepasst werden:
1 |
nano /etc/postfix/main.cf |
Nach
1 |
sender_dependent_default_transport_maps = hash:/var/spool/postfix/plesk/sdd_transport_maps |
muss diese Zeile eingefügt werden:
1 |
content_filter = scan:127.0.0.1:10026 |
Nun die 2. Datei:
1 |
nano /etc/postfix/master.cf |
Hier fügt man am Ende der Datei die folgenden Zeilen ein:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes # For injecting mail back into postfix from the filter 127.0.0.1:10025 inet n - n - 16 smtpd -o content_filter= -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks_style=host -o smtpd_authorized_xforward_hosts=127.0.0.0/8 |
Plesk: ClamScan automatisch aktualisieren
Das stündliche Aktualisieren der Virusdefinitionen von ClamScan wird über den Task-Scheduler von PLESK übernommen. Hierzu erstellen wir einen Task mit dem folgenden Kommando:
1 |
rm /var/log/clamav/freshclam.log;/usr/bin/freshclam --quiet |
ClamScan + ClamSMTP + Postfix: GO !
Über die folgenden Befehle werden die Änderungen aktiviert:
1 2 3 |
/etc/init.d/clamav-daemon start /etc/init.d/clamavsmtp start /etc/init.d/postfix restart |
Wenn wir alles richtig gemacht haben, enthalten alle ab jetzt empfangenen Mails im Header folgende Zeile:
1 |
X-AV-Checked: ClamAV using ClamSMTP on mail.domain.com |
Um ClamScan zu testen, können wir eine Mail mit der EICAR-Testdatei an einen Empfänger auf unserem Server senden. Die Datei enthält nur die EICAR Virus-Signatur, jedoch nicht den Virus selbst. Ist alles OK, kommt beim Empfänger anstatt der Testmail die Nachricht des VirusAction-Scripts an.
Läuft leider nicht.
This is the mail system at host xx.domain.de.
I’m sorry to have to inform you that your message could not
be delivered to one or more recipients. It’s attached below.
For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
Der Header der bounced Mail sowie die entsprechenden Log-Einträge dazu wären hilfreich.
Bitte beachten: Der Beitrag ist von 2017. Inzwischen hat sich Seitens Plesk sicher einiges geändert.
Hier einmal die Logs:
mail.err: Jun 3 01:56:07 server01 clamsmtpd: 100001: SERVER: couldn’t connect to: IP.IP.IP.IP:10025: Transport endpoint is not connected,
maillog: clamsmtpd: 100001: SERVER: couldn’t connect to: IP.IP.IP.IP:10025: Transport endpoint is not connected
Steht da 127.0.0.1:10025 oder eine andere IP?
Die externe, darum hab ich sie im Kommentar entfernt.
Überall wo in meinem Beitrag 127.0.0.1 steht, muss das so bleiben. Die Kommunikation findet über Localhost statt, nicht über die ext. IP. Daher bekommst du keinen Connect.
Hab das grad mal in der Grafik ergänzt, dann ist es klarer.
ah sorry, und der header
<user@domain.de>: host 127.0.0.1[127.0.0.1] said: 554 5.7.1
<user@domain.de>: Recipient address rejected: Access denied (in reply to
RCPT TO command)
Reporting-MTA: dns; server01.domain.de
X-Postfix-Queue-ID: 6057EDA
X-Postfix-Sender: rfc822; user@domain.de
Arrival-Date: Fri, 3 Jun 2022 08:37:29 +0200 (CEST)
Final-Recipient: rfc822; user@domain.de
Original-Recipient: rfc822;user@domain.de
Action: failed
Status: 5.7.1
Remote-MTA: dns; 127.0.0.1
Diagnostic-Code: smtp; 554 5.7.1 <user@domain.de>: Recipient address
rejected: Access denied
I had the same Problem, the following fixed it for me:
The entry in the /etc/postfix/master.cf should be:
scan unix – – n – 16 smtp
-o smtp_send_xforward_command=yes
# For injecting mail back into postfix from the filter
127.0.0.1:10025 inet n – n – 16 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
Furthermore the AllowSupplementaryGroups entry in /etc/clamav/clamd.conf and /etc/clamav/freshcalm.conf is deprecated and no longer needed.
I hope this information is helpful for you :)
Thank you for sharing this!