LINUXMAKER, OpenSource, Tutorials

Der clamav-daemon lauscht nicht auf TCP-Ports

ClamAV (Clam AntiVirus) ist ein unter der GNU General Public License stehender Virenschutz-Scanner und zusätzlichem Phishing-Filter. Das Programm als Milter unter dem Mailserver Postfix zusammen mit der SPAM-Filtersoftware Rspamd eingebundene werden. Dadurch werden vor allem eingehende und wahlweise auch ausgehende eMails durch ClamAV auf Viren gescannt.
Bei Debian Linux kam es seit dem Upgrade von Debian 11 "Bullseye" auf Version 12 "Bookworm" zu Problemen beim Versand und Empfang von Dateianhängen zu der Fehlermeldung "4.7.1 Tempfail - internal scan engine error." vor allem im Logfile. Je nachdem wie Rspamd konfiguriert ist, wurden auch die Sendenden mit der gleichen Meldung informiert.

Das Stoppen von Service und Socket

systemctl stop clamav-daemon.service  
systemctl stop clamav-daemon.socket

mit manuellem Starten des clamd-Service

clamd --foreground=true

dem Eintrag in der Systemd-Unit-Datei in der Stelle des Parameters ExecStart, hatte die positive Folge, dass clamd sehr wohl auf Port 3310 und an Localhost laschen konnte. Mit dem Resultat, dass die Dateianhänge bei Empfang oder Versand wieder gescannt wurden.
 

Problem-Analyse

Das Problem liegt also irgendwo in dem Bereich von Systemd und Clamd ab Version 0.99.2. Da es in Bullseye im clamav-daemon-Paket nur ein Unit-File für den clamav-daemon.service gab, enhält Bookworm zusätzlich zu dem Service Unit-File ein Unit-File für den clamav-daemon.socket. Entsprechend der Manpage zu Systemd wird automatisch ein Serviceprozess von allen gleich benannten Sockets automatisch übergeben. Nachdem es in Bullseye das Unit-File für den clamav-daemon.socket fehlte, wurden dem clamd keine Sockets von Systemd übergeben, egal was in der Konfigurationsdatei angegeben wurde.

Derzeitige Lösung unter Debian Bookworm

Momentan wird das Problem gelöst, indem ein Drop-In für das Unit-File des clamav-daemon.socket erstellt wird:

/etc/systemd/system/clamav-daemon.socket.d/tcp-socket.conf
-
[Socket]
ListenStream=3310
-

Die genaue Syntax ist in der Manpage zu finden. Zusätzlich wäre es empfehlenswert alle Socket-Konfigurationen in der clamd.conf zu entfernen, damit es keine Verwiirung geben kann.

Jetzt kann der Daemon ordnungsgemäß gestartet werden, nachdem zuvor Systemd Änderungen an den Konfigurationsdateien bekann gemacht wurde:

systemctl daemon-reload
systemctl start clamav-daemon.service
systemctl status clamav-daemon.socket

clamav-daemon.socket - Socket for Clam AntiVirus userspace daemon
    Loaded: loaded (/lib/systemd/system/clamav-daemon.socket; enabled´enabled ´
   Drop-In: /etc/systemd/system/clamav-daemon.socket.d
            └─tcp-socket.conf
    Active: active (running)´ since Tue 2024-07-02 09:32:05 CEST; 1s ago ´
  Triggers: clamav-daemon.service
      Docs: man:clamd(8)
            man:clamd.conf(5)
            https://docs.clamav.net/
    Listen: /run/clamav/clamd.ctl (Stream)
            [::]:3310 (Stream)
     Tasks: 0 (limit: 4643)
    Memory: 4.0K
       CPU: 1ms
    CGroup: /system.slice/clamav-daemon.socket

Jul 02 09:32:05 mx systemd[1]: Starting clamav-daemon.socket - Socket for Clam AntiVirus userspace daemon...
Jul 02 09:32:05 mx systemd[1]: Listening on clamav-daemon.socket - Socket for Clam AntiVirus userspace daemon.
 

Deutlich zu erkennen ist unter dem "Drop in" die angehängte Datei, die soeben hinzugefügt wurde. Damit zeigt

# ss -l -n | grep -i 3310
tcp   LISTEN 0      4096                          *:3310                   *:*

die Existenz des clamd unter Port 3310 an den Netzwerkinterfaces an.

Es ist zu erwarten, das Debian diese Lösung bei seinem nächsten Release mit einbaut, so dass bei einem Dist-Upgrade diese Lösung rückgängig gemacht werden müsste, sollte es wieder zur Einstellung des Scanvorgangs kommen.