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
| Modus | Java | .NET | Beschreibung |
|---|---|---|---|
| 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
- Java
- .NET (C#)
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>
dotnet add package Fitko.FitConnect.VirusScanning
Registrierung erfolgt per DI-Extension, zusätzlich zu AddFitConnect():
using Fitko.FitConnect.VirusScanning.DependencyInjection;
var services = new ServiceCollection()
.AddSingleton<IConfiguration>(configuration)
.AddFitConnect()
.AddFitConnectVirusScanning()
.BuildServiceProvider();
ClamAV-Daemon anbinden (empfohlen für Produktion)
- Java
- .NET (C#)
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".
{
"FitConnect": { /* ... */ },
"VirusScanning": {
"Mode": "ClamAVDaemon",
"DaemonOptions": {
"Host": "localhost",
"Port": 3310,
"TimeoutSeconds": 30
},
"FailOnScanError": true,
"MaxFileSizeBytes": 524288000
}
}
Sobald das Modul registriert ist, wird automatisch beim Versand und Empfang gescannt – keine weitere Code-Änderung nötig.
Andere Modi
ClamAV-Process anbinden
- Java
- .NET (C#)
VirusScannerConfig config = VirusScannerConfig.processOnly("/usr/bin/clamscan");
VirusScanService scanner = VirusScannerFactory.createScanner(
VirusScannerMode.CLAMAV_PROCESS, config);
{
"VirusScanning": {
"Mode": "ClamAVProcess",
"ProcessOptions": {
"ExecutablePath": "/usr/bin/clamscan",
"TimeoutSeconds": 60
}
}
}
ICAP-Server anbinden
ICAP ermöglicht die Verwendung professioneller Security-Appliances wie Symantec Protection Engine, McAfee Web Gateway, C-ICAP oder benutzerdefinierten ICAP-Servern.
- Java
- .NET (C#)
VirusScannerConfig config = VirusScannerConfig.icapOnly(
"icap-server.internal", 1344);
VirusScanService scanner = VirusScannerFactory.createScanner(
VirusScannerMode.ICAP, config);
{
"VirusScanning": {
"Mode": "Icap",
"IcapOptions": {
"Host": "icap-server.internal",
"Port": 1344,
"ServiceName": "avscan"
}
}
}
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:
- Java
- .NET (C#)
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());
}
using Fitko.FitConnect.Core.Abstractions.VirusScanning;
var scanner = services.GetRequiredService<IVirusScannerService>();
var result = await scanner.ScanAsync(stream, fileName: "upload.pdf");
if (result.Status == VirusScanStatus.Infected)
{
_logger.LogWarning("Malware: {Signature}", result.Signature);
}
Verhalten bei Funden
- 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 dannfalse. Es gibt kein automatisches Reject; Ihr Fachverfahren ruft nach eigener Prüfung explizitreject(received, received.report().asProblems())bzw.RejectSubmission(received, received.Report.AsProblems().ToList())auf.
Konfigurationsoptionen
| Option | Default | Wirkung |
|---|---|---|
FailOnScanError | true | Wirft Exception, wenn der Scanner nicht antwortet |
MaxFileSizeBytes | 500 MB | Größer dimensionierte Dateien werden übersprungen oder abgewiesen |
QuarantineDirectory (nur .NET) | null | Wenn 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:
freshclamregelmäßig laufen lassen, sonst werden neue Bedrohungen nicht erkannt. - Große Dateien:
MaxFileSizeBytesmuss 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. denNoOpVirusScanner(Java), damit Tests nicht von einem laufenden Scanner abhängen.