Zum Hauptinhalt springen

Virenscanner anbinden

TL;DR – Virenscanner-Modul einbinden, einen Scanner-Modus (ClamAV-Daemon / -Process / ICAP) konfigurieren – das SDK scannt Anhänge dann automatisch beim Versand und beim Empfang. Bei Funden: Versand-Abbruch bzw. ein Befund im Prüfbericht. Für Produktivumgebungen empfohlen.

Verfügbare Scanner-Modi​

ModusJava.NETBeschreibung
ClamAV Daemon (TCP)✅✅TCP-Verbindung zu einem laufenden ClamAV-Daemon
ClamAV Process✅✅Spawnt clamscan als Subprozess
ICAP✅✅Beliebiger ICAP-Server (z. B. C-ICAP, Symantec, McAfee)
No-Op (Tests)✅✅Deaktivierter Scanner für Tests

ClamAV installieren​

# Ubuntu/Debian
sudo apt-get install clamav clamav-daemon
sudo systemctl start clamav-daemon

# macOS
brew install clamav
clamd

Modul einbinden​

Bereits im sdk-client enthalten

Das Modul virus-scanner ist eine feste Abhängigkeit von sdk-client. Wer sdk-client bereits eingebunden hat, braucht keine weitere Maven-Dependency.

Die explizite Abhängigkeit ist nur nötig, wenn Sie virus-scanner standalone oder core bzw. rest-clients direkt (ohne sdk-client) verwenden:

<dependency>
<groupId>dev.fitko.fitconnect</groupId>
<artifactId>virus-scanner</artifactId>
<version>4.0.0-rc.1</version>
</dependency>

ClamAV-Daemon anbinden (empfohlen für Produktion)​

import dev.fitko.fitconnect.virusscanner.api.VirusScanService;
import dev.fitko.fitconnect.virusscanner.api.VirusScannerMode;
import dev.fitko.fitconnect.virusscanner.config.VirusScannerConfig;
import dev.fitko.fitconnect.virusscanner.impl.VirusScannerFactory;

VirusScannerConfig config = VirusScannerConfig.daemonOnly("clamav.example.com", 3310);
VirusScanService scanner = VirusScannerFactory.createScanner(
VirusScannerMode.CLAMAV_DAEMON, config);

VirusScanResult result = scanner.scanBytes(data);
if (result.isInfected()) {
log.warn("Malware detected: {}", result.getSignature());
}

Damit das SDK Anhänge, Fach- und Metadaten automatisch beim Senden und Empfangen scannt, hängen Sie den Scanner in die SdkSettings — per YAML oder per Builder:

sdkSettings:
virusScannerConfig:
mode: "CLAMAV_DAEMON" # CLAMAV_DAEMON | CLAMAV_PROCESS | ICAP | NO_OP
quarantineDirectory: "/var/quarantine/fit-connect" # optional
clamAVDeamonConfig:
host: "clamav.example.com"
port: 3310
FitConnectSdk sdk = FitConnectSdk.fromConfigBuilder()
.credentials("client-id", "client-secret")
.environment(FitConnectEnvironment.TEST)
.settings(SdkSettings.builder()
.virusScannerConfig(VirusScannerConfig.daemonOnly("clamav.example.com", 3310))
.build())
.build();

Für die anderen Modi entsprechend clamAVProcessConfig.executablePath / VirusScannerConfig.processOnly(…) und icapScannerConfig.{host,port} / VirusScannerConfig.icapOnly(…). Ein nicht erreichbarer Scanner erzeugt eine Warnung im Prüfbericht, kein stilles „unauffällig".

Andere Modi​

ClamAV-Process anbinden
VirusScannerConfig config = VirusScannerConfig.processOnly("/usr/bin/clamscan");
VirusScanService scanner = VirusScannerFactory.createScanner(
VirusScannerMode.CLAMAV_PROCESS, config);
ICAP-Server anbinden

ICAP ermöglicht die Verwendung professioneller Security-Appliances wie Symantec Protection Engine, McAfee Web Gateway, C-ICAP oder benutzerdefinierten ICAP-Servern.

VirusScannerConfig config = VirusScannerConfig.icapOnly(
"icap-server.internal", 1344);
VirusScanService scanner = VirusScannerFactory.createScanner(
VirusScannerMode.ICAP, config);
No-Op für Tests

Setzen Sie für Unit-Tests Mode: "NoOp" (.NET) bzw. den NoOpVirusScanner (Java), damit Tests nicht von einem laufenden Scanner abhängen.

Direktes Scannen​

Sie können den Scanner auch unabhängig von der SDK-Pipeline benutzen:

VirusScanResult bytesResult = scanner.scanBytes(data);
VirusScanResult fileResult = scanner.scanFile(Path.of("/tmp/upload.pdf"));
VirusScanResult streamRes = scanner.scanStream(inputStream);

if (bytesResult.isInfected()) {
log.warn("Malware detected: {}", bytesResult.getSignature());
}

Verhalten bei Funden​

Wird Malware erkannt …
  • Beim Senden wird der Versand mit einer SDK-Exception abgebrochen.
  • Beim Empfang landet ein MalwareDetected-Fund im Prüfbericht der empfangenen Nachricht — acceptable() / Acceptable() liefert dann false. Es gibt kein automatisches Reject; Ihr Fachverfahren ruft nach eigener Prüfung explizit reject(received, received.report().asProblems()) bzw. RejectSubmission(received, received.Report.AsProblems().ToList()) auf.
Konfigurationsoptionen
OptionDefaultWirkung
FailOnScanErrortrueWirft Exception, wenn der Scanner nicht antwortet
MaxFileSizeBytes500 MBGrößer dimensionierte Dateien werden übersprungen oder abgewiesen
QuarantineDirectory (nur .NET)nullWenn gesetzt, werden infizierte Files dorthin verschoben
Häufige Stolperfallen
  • Port 3310 blockiert: Der ClamAV-Daemon hört per Default auf 3310. Firewall oder Container-Networking-Einstellungen prüfen.
  • Veraltete Signaturen: freshclam regelmäßig laufen lassen, sonst werden neue Bedrohungen nicht erkannt.
  • Große Dateien: MaxFileSizeBytes muss zur Chunking-Konfiguration passen, sonst werden Anhänge bei der Prüfung übersprungen.
  • Test-Profile: Setzen Sie für Unit-Tests Mode: "NoOp" (.NET) bzw. den NoOpVirusScanner (Java), damit Tests nicht von einem laufenden Scanner abhängen.