Mit clamd + OpenSSH Virenscans auslagern

Mit ClamAV steht ein quelloffener (FLOSS) Virenscanner für die meisten Betriebssysteme zur Verfügung (z.B. Windows, MacOS, Linux-Distributionen, *BSD, etc.). Viele Anwendungen starten jedoch für jeden Scanvorgang einen einzelnen Prozess, sodass immer wieder erneut die kompletten Virendefinitionen geladen werden müssen - ist diese ca. 400 - 600 MiB groß. Zusätzlich dazu kommen möglicher noch Drittanbieter-Datenbanken, wie sie etwa auch diese Webseite anbietet. Bei automatischen, parallelen Scanvorgängen kann es vorkommen, dass die Datenbank mehrfach im RAM liegt und so unnötig viele Resourcen beansprucht werden, bis schließlich kein Arbeitsspeicher mehr verfügbar ist. Dafür gibt es den ClamAV-Daemon clamd der die Datenbank konstant geladen hält, somit das erneute, langwierige Einlesen vermeidet und gleichzeitig das mehrfache Vorhandensein der Definitionen im Arbeitsspeicher vermeidet.

Um den Daemon zu benutzen, kann dieser über eine Netzwerkschnittstelle angesprochen werden. Der Befehl clamdscan anstelle nutzt diesen Daemon, im Gegensatz des normalerweise genutzte clamscan.

Die Netzwerkschnittstelle ermöglicht auch die Verwendung eines gesonderten Servers, welcher nur für die Untersuchung von Dateien zuständig ist.

Inhalt

Installation von clamd

Unter Debian/Ubuntu können clamd und clamdscan wie folgt installiert werden:

apt install clamav-daemon
apt install clamdscan

Die Konfigurationsdatei hat den Pfad /etc/clamav/clamd.conf.

Einfacher Remote-Scan

In einem einfachen Szenario soll ein Server (server.domain.tld) im Netzwerk eine Scanschnittstelle bereitstellen, welche aus dem Netzwerk (z.B. von client.domain.tld) genutzt wird.

Die folgende Konfiguration (/etc/clamav/clamd.conf) ist, sowohl auf dem Server, als auch auf dem Client, minimal:

TcpAddr server.domain.tld
TcpPort 3310

Auf dem Server wird der Dienst gestartet:

service clamav-daemon start

Neuer Systemd-Befehl: systemctl start clamav-daemon

Der Client kann nun mit clamdscan Dateien untersuchen (hier der Ordner /var/www/html):

clamdscan /var/www/html --stream

Der Parameter --stream kann weggelassen werden, wenn der Server, auf dem clamd selber läuft überprüft wird. Dabei wird der Scan erheblich beschleunigt.

Optimierung und Fehlerbehebung

Sollte clamdscan mit dem Fehler lstat() failed: No such file or directory. ERROR abbrechen, fehlt das Argument --stream. Ohne dieses wird das lokale Dateisystem des Servers, von dem clamd bereitgestellt wird, überprüft.

clamdscan /var/www/html --stream

Zur Beschleunigung des Scans kann das Argument --multiscan bzw. -m verwendet werden, bei der mehrere Dateien gleichzeitig überprüft werden:

clamdscan /var/www/html --stream --multiscan

Die maximale Dateigröße kann in der Konfigurationsdatei mit der Option StreamMaxLength GRÖSSE festgelegt werden. Zu beachten ist, dass die benötigte Netzwerkbandbreite steigt und eine kurzfristig höhere Belastung auf dem Scan-Server entsteht.

Sicherer Remote-Scan über SSH

clamd überträgt Daten nicht verschlüsselt, sodass ein Angreifer möglicherweise private Daten abhören kann. Außerdem reicht ein einfacher SHUTDOWN-Befehl um den Dienst zu beenden (einen Patch den SHUTDOWN-Befehlt zu entfernen befindet sich im Anhang). Daher bietet sich die Absicherung über SSH an: Daten werden sicher verschlüsselt und der Zugriff ist nur nach vorheriger Authentifizierung möglich.

Dazu wird die Konfiguration entsprechend angepasst:

TcpAddr 127.0.0.1
TcpPort 3310

Damit ist der Dienst nicht mehr aus dem Netzwerk erreichbar. Über SSH wird der Port weitergeleitet:

ssh -nNT -L 3310:127.0.0.1:3310 nutzer@server.domain.tld

Einfache Verbindung mit Schlüsseln

SSH unterstützt neben der Anmeldung mit Passwort Public-Key-Authentifizierung, sodass eine automatische Anmeldung möglich ist.

Auf dem Client wird, wenn nicht bereits vorhanden, ein Schlüsselpaar erzeugt. Damit kein Passwort beim (automatischen) Anmeldevorgang eingegeben werden muss, wird der private Schlüssel in diesem Fall nicht verschlüsselt.

ssh-keygen -b 4096 -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:...
The key's randomart image is: ...

Anstelle von rsa ist bei modernen System ed25519 sinnvoll.

Auf dem Server wird aus Sicherheitsgründen ein zusätzlicher Nutzer angelegt:

adduser --disabled-password --shell /usr/sbin/nologin --system clamav-ssh

Der öffentliche Schlüssel wird nun in die .ssh/authorized_keys-Datei des neu angelgten Nutzers auf dem Server kopiert. Eine SSH-Verbindung sollte nun möglich sein, allerdings sofort wieder beendet werden:

ssh clamav-ssh@server.domain.tld
This account is currently not available.

Ein Portweiterleitung erfolgt nun mit dem folgendem Befehl:

ssh -nNT -L 3310:127.0.0.1:3310 clamav-ssh@server.domain.tld

Nun kann in einer anderen Sitzung clamdscan eingesetzt werden. Nicht zu vergessen ist der Parameter --stream, damit auch wirklich Daten über das Netzwerk übetragenwerden:

clamdscan --stream /var/www/html

Weblinks

Hilfeseiten (manpages):

Anhang

Patch zur Deaktivierung des SHUTDOWN-Befehls in clamd:

--- a/clamd/session.c
+++ b/clamd/session.c
@@ -562,11 +562,13 @@ int execute_or_dispatch_command(client_conn_t *conn, enum commands cmd, const ch
     }
 
     switch (cmd) {
+    /* disable SHUTDOWN *
        case COMMAND_SHUTDOWN:
            pthread_mutex_lock(&exit_mutex);
            progexit = 1;
            pthread_mutex_unlock(&exit_mutex);
            return 1;
+       */
        case COMMAND_RELOAD:
            pthread_mutex_lock(&reload_mutex);
            reload = 1;

clamd-patch.diff