Jak zainstalować ClamAV na Linux: Kompletny przewodnik techniczny
ClamAV to wieloplatformowy silnik antywirusowy o otwartym kodzie źródłowym, utrzymywany przez Cisco Talos, który wykrywa wirusy, trojany, rootkity, złośliwe oprogramowanie i inne złośliwe zagrożenia. Działa w oparciu o model wykrywania oparty na sygnaturach, wspierany przez stale aktualizowaną bazę danych (/var/lib/clamav/) i jest de facto standardowym rozwiązaniem antywirusowym dla serwerów Linux, bram pocztowych i środowisk hostingowych.
Ten przewodnik obejmuje pełny cykl instalacji: przygotowanie systemu, instalację pakietów w głównych dystrybucjach, zarządzanie bazą wirusów za pomocą freshclam, konfigurację demona, strategie skanowania, obsługę kwarantanny, automatyzację cron oraz skanowanie w czasie rzeczywistym za pomocą clamonacc — w tym błędy produkcyjne, które większość poradników pomija.
Dlaczego ClamAV ma znaczenie na serwerach Linux
Systemy Linux nie są odporne na złośliwe oprogramowanie. Chociaż exploity atakujące Linux są mniej powszechne niż zagrożenia dla Windows, serwery obsługujące aplikacje internetowe, przekaźniki poczty lub usługi udostępniania plików są aktywnymi wektorami dystrybucji złośliwego oprogramowania — nawet gdy sam host Linux nie jest głównym celem. Skompromitowane środowisko VPS Hosting może po cichu redystrybuować zainfekowane pliki do użytkowników końcowych, powodować umieszczenie na czarnych listach przez bazy danych spamu lub służyć jako punkt zwrotny w większym łańcuchu ataku.
ClamAV rozwiązuje ten problem, zapewniając:
- Skanowanie na żądanie do zaplanowanej lub wyzwalanej analizy
- Skanowanie w trybie demona (
clamd) do kontroli o wysokiej przepustowości i niskim opóźnieniu - Integrację z bramą pocztową za pomocą
clamsmtp,amavisd-newlubMilter - Monitorowanie systemu plików w czasie rzeczywistym za pomocą
clamonacc(jądro Linuxfanotify) - Sygnatury bajtokodu do heurystycznego wykrywania wykraczającego poza statyczne dopasowywanie wzorców
Krok 1: Przygotowanie i aktualizacja systemu
Przed zainstalowaniem jakiegokolwiek pakietu zsynchronizuj indeks pakietów i zastosuj oczekujące poprawki bezpieczeństwa. Uruchamianie nieaktualnych bibliotek systemowych obok narzędzia bezpieczeństwa tworzy fałszywe poczucie ochrony.
Dla Debian/Ubuntu:
sudo apt update && sudo apt upgrade -yDla CentOS/RHEL 7:
sudo yum update -yDla Rocky Linux / AlmaLinux / RHEL 8+:
sudo dnf update -yDla Fedora:
sudo dnf update -yUpewnij się, że wersje jądra i glibc są aktualne, ponieważ clamonacc (skanowanie w czasie rzeczywistym) wymaga jądra 5.1+ dla stabilnej obsługi fanotify.
Krok 2: Instalacja ClamAV
ClamAV jest dostępny w domyślnych repozytoriach wszystkich głównych dystrybucji. Kluczową różnicą jest to, czy instalujesz tylko skaner (clamav), czy również demona działającego w tle (clamav-daemon / clamd), co jest zdecydowanie zalecane dla każdego serwera produkcyjnego.
Dla Debian/Ubuntu:
sudo apt install clamav clamav-daemon -yclamav— instalujeclamscanifreshclam
clamav-daemon — instaluje clamd, trwałego demona skanującego, który przechowuje bazę wirusów w pamięci, znacznie redukując narzut na każde skanowanie
Dla CentOS/RHEL 7 (wymaga EPEL):
sudo yum install epel-release -y
sudo yum install clamav clamav-update clamav-scanner-systemd clamd -y
Dla Rocky Linux / AlmaLinux / RHEL 8+ (wymaga EPEL):
sudo dnf install epel-release -y
sudo dnf install clamav clamav-update clamd -y
Dla Fedora:
sudo dnf install clamav clamav-update clamd -y
Lokalizacje plików binarnych po instalacji do weryfikacji:
Plik binarny
Ścieżka
Przeznaczenie
clamscan
/usr/bin/clamscan
Skaner CLI na żądanie
clamd
/usr/sbin/clamd
Demon skanujący działający w tle
freshclam
/usr/bin/freshclam
Aktualizator bazy wirusów
clamdscan
/usr/bin/clamdscan
Klient delegujący do clamd
clamonacc
/usr/sbin/clamonacc
Skaner dostępu w czasie rzeczywistym
Krok 3: Aktualizacja bazy sygnatur wirusów
Możliwości wykrywania ClamAV są całkowicie zależne od aktualności jego bazy sygnatur. Baza danych znajduje się w /var/lib/clamav/ i składa się z kilku plików: main.cvd, daily.cvd (lub .cld) i bytecode.cvd.
Zatrzymaj demona przed pierwszą aktualizacją (Debian/Ubuntu)
W systemach Debian/Ubuntu clamav-freshclam.service uruchamia się automatycznie po instalacji i blokuje katalog bazy danych. Jeśli spróbujesz uruchomić freshclam ręcznie, gdy ta usługa jest aktywna, napotkasz konflikt blokady. Najpierw ją zatrzymaj:
sudo systemctl stop clamav-freshclam
sudo freshclam
sudo systemctl start clamav-freshclam
Na CentOS/RHEL/Rocky/Alma:
sudo freshclam
Oczekiwane wyjście po pomyślnej aktualizacji:
ClamAV update process started at ...
daily.cvd updated (version: 27xxx, sigs: xxxxxxx, ...)
main.cvd is up to date
bytecode.cvd is up to date
Konfiguracja automatycznych aktualizacji bazy danych
freshclam jest kontrolowany przez /etc/clamav/freshclam.conf. Kluczowe dyrektywy do przeglądu:
sudo nano /etc/clamav/freshclam.conf
Krytyczne parametry:
Checks 24 — liczba sprawdzeń aktualizacji dziennie (domyślnie: 12 w niektórych dystrybucjach)
DatabaseMirror database.clamav.net — oficjalne lustro; nie zmieniaj, chyba że używasz prywatnego lustra
NotifyClamd /etc/clamav/clamd.conf — instruuje freshclam, aby zasygnalizował clamd po aktualizacji, dzięki czemu demon przeładowuje sygnatury bez restartu
Krok 4: Konfiguracja i uruchomienie demona ClamAV
Demon clamd przechowuje pełną bazę wirusów w RAM (zazwyczaj 500 MB–1,2 GB w zależności od wersji bazy danych). Eliminuje to wielosekundowy koszt uruchamiania clamscan, co czyni go niezbędnym w każdym środowisku wykonującym częste lub równoległe skanowania.
Debian/Ubuntu
sudo systemctl start clamav-daemon
sudo systemctl enable clamav-daemon
sudo systemctl status clamav-daemon
CentOS/RHEL 7
Na RHEL 7 jednostka usługi nosi nazwę clamd@scan, odwołując się do pliku konfiguracyjnego /etc/clamd.d/scan.conf:
sudo systemctl start clamd@scan
sudo systemctl enable clamd@scan
Rocky Linux / AlmaLinux / RHEL 8+
sudo systemctl start clamd@scan
sudo systemctl enable clamd@scan
Kluczowe parametry clamd.conf
Konfiguracja demona znajduje się w /etc/clamav/clamd.conf (Debian/Ubuntu) lub /etc/clamd.d/scan.conf (rodzina RHEL). Przejrzyj te dyrektywy:
sudo nano /etc/clamav/clamd.conf
Ważne ustawienia:
LocalSocket /run/clamav/clamd.ctl — ścieżka gniazda Unix używana przez clamdscan; upewnij się, że odpowiada konfiguracji klienta
MaxFileSize 100M — maksymalny rozmiar pliku do skanowania; zwiększ dla serwerów pocztowych obsługujących duże załączniki
MaxScanSize 400M — maksymalna ilość danych skanowanych na plik po dekompresji
StreamMaxLength 100M — istotne dla skanowania opartego na milter/strumieniu
User clamav — demon działa jako użytkownik clamav; upewnij się, że ten użytkownik ma dostęp do odczytu katalogów, które zamierzasz skanować
LogFile /var/log/clamav/clamd.log — włącz trwałe rejestrowanie dla ścieżek audytu
Krytyczna pułapka: Jeśli clamd działa jako użytkownik clamav i skanujesz /home/user/uploads/, użytkownik clamav musi mieć uprawnienia do odczytu tej ścieżki. Zapomnienie o tym skutkuje cichymi błędami skanowania — clamd będzie zgłaszać błędy „Odmowa dostępu” w swoim dzienniku zamiast zwracać werdykt czysty/zainfekowany.
Krok 5: Uruchamianie skanowań za pomocą clamscan i clamdscan
Skanowanie na żądanie za pomocą clamscan
clamscan to samodzielny skaner. Ładuje bazę danych z dysku przy każdym wywołaniu, co czyni go wolniejszym, ale niezależnym od demona.
Skanowanie określonego katalogu rekurencyjnie:
clamscan -r /path/to/directory
Skanowanie i wyświetlanie tylko zainfekowanych plików:
clamscan -r --infected /path/to/directory
Skanowanie ze szczegółowym wyjściem i zapisem wyników:
sudo clamscan -r --infected --log=/var/log/clamav/manual_scan.log /var/www/html
Przenoszenie zainfekowanych plików do katalogu kwarantanny:
sudo clamscan -r --move=/var/quarantine /path/to/directory
Automatyczne usuwanie zainfekowanych plików (używaj ostrożnie w środowisku produkcyjnym):
sudo clamscan -r --remove /path/to/directory
Skanowanie całego systemu plików (spodziewaj się znacznego czasu działania na dużych dyskach):
sudo clamscan -r --infected --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" /
Wykluczenie /sys, /proc i /dev jest obowiązkowe — skanowanie tych pseudosystemów plików powoduje fałszywe błędy i może powodować zawieszenia.
Skanowanie o wysokiej wydajności za pomocą clamdscan
Gdy clamd jest uruchomiony, używaj clamdscan zamiast clamscan. Przesyła żądania skanowania do już załadowanego demona przez gniazdo Unix, co czyni go o rzędy wielkości szybszym przy powtarzających się lub masowych skanowaniach.
clamdscan --fdpass /path/to/directory
Flaga --fdpass przekazuje deskryptor pliku bezpośrednio do clamd, omijając problemy z uprawnieniami, które pojawiają się, gdy użytkownik demona nie może bezpośrednio odczytać ścieżki docelowej.
Wielowątkowe skanowanie za pomocą clamdscan:
clamdscan --multiscan --fdpass /var/www/html
--multiscan instruuje clamd, aby skanował pliki równolegle przy użyciu puli wątków, znacznie skracając czas rzeczywisty na systemach wielordzeniowych.
clamscan vs. clamdscan: Porównanie wydajności
Atrybut
`clamscan`
`clamdscan`
Ładowanie bazy danych przy każdym skanowaniu
Tak (wolne uruchamianie)
Nie (demon przechowuje bazę danych w RAM)
Typowy czas uruchamiania
5–30 sekund
Poniżej 1 sekundy
Wymaga działającego clamd
Nie
Tak
Skanowanie równoległe
Nie
Tak (--multiscan)
Najlepszy przypadek użycia
Jednorazowe ręczne skanowania
Zautomatyzowane, częste lub masowe skanowania
Model uprawnień
Działa jako wywołujący użytkownik
Działa jako użytkownik clamav (użyj --fdpass)
Krok 6: Automatyzacja skanowania za pomocą Cron
Aby zapewnić ciągłą ochronę, zaplanuj regularne skanowania za pomocą cron. Poniższy przykład skanuje katalog główny witryny codziennie o 02:00 i rejestruje wyniki ze znacznikiem czasu.
sudo crontab -e
Dodaj następujący wpis:
0 2 * * * /usr/bin/clamdscan --multiscan --fdpass --log=/var/log/clamav/daily_scan_$(date +%Y%m%d).log /var/www/html
Cron klasy produkcyjnej z alertami e-mail o infekcji:
0 2 * * * /usr/bin/clamscan -r --infected /var/www/html 2>&1 | grep -v "^$" | mail -s "ClamAV Daily Scan Report - $(hostname)" admin@yourdomain.com
Przekazuje niepuste wyjście bezpośrednio do odbiorcy poczty, zapewniając otrzymywanie alertów tylko wtedy, gdy coś zostanie znalezione lub wystąpi błąd. Upewnij się, że mailutils lub postfix jest skonfigurowany na serwerze.
Rotacja dzienników skanowania w celu zapobiegania nieograniczonemu wzrostowi dysku:
sudo nano /etc/logrotate.d/clamav-scan
/var/log/clamav/daily_scan_*.log {
weekly
rotate 4
compress
missingok
notifempty
}
Krok 7: Skanowanie w czasie rzeczywistym z clamonacc
clamonacc to komponent skanowania dostępu ClamAV, wprowadzony jako stabilna funkcja w ClamAV 0.102. Podłącza się do podsystemu fanotify jądra Linux, aby przechwytywać zdarzenia otwierania i zamykania plików, skanując pliki przed ich dostępem.
Wymagania:
Jądro Linux 5.1 lub nowsze (dla fanotify z FAN_OPEN_EXEC_PERM)
ClamAV 0.102+
clamd musi być uruchomiony
Uprawnienia roota
Włącz skanowanie dostępu w clamd.conf
sudo nano /etc/clamav/clamd.conf
Dodaj lub odkomentuj:
OnAccessIncludePath /home
OnAccessIncludePath /var/www/html
OnAccessPrevention yes
OnAccessExcludeUname clamav
OnAccessPrevention yes — blokuje dostęp do zainfekowanych plików w czasie rzeczywistym (tryb odmowy); ustaw na no dla trybu tylko wykrywania
OnAccessExcludeUname clamav — zapobiega wywoływaniu przez clamd rekurencyjnych pętli skanowania
Uruchom clamonacc
sudo clamonacc --log=/var/log/clamav/clamonacc.log --daemonize
Aby uruchomić go jako usługę systemd, utwórz plik jednostki:
sudo nano /etc/systemd/system/clamonacc.service
[Unit]
Description=ClamAV On-Access Scanner
Requires=clamav-daemon.service
After=clamav-daemon.service
[Service]
Type=simple
ExecStart=/usr/sbin/clamonacc --log=/var/log/clamav/clamonacc.log --foreground
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now clamonacc
Znana pułapka: Na serwerach o wysokiej przepustowości (np. zajętych punktach końcowych przesyłania plików) OnAccessPrevention yes może wprowadzać mierzalne opóźnienia I/O. Przetestuj swoje obciążenie przed włączeniem trybu zapobiegania w środowisku produkcyjnym. Rozważ ograniczenie OnAccessIncludePath do jak najwęższej niezbędnej ścieżki, zamiast szerokich katalogów takich jak /.
Krok 8: Integracja ClamAV z serwerami pocztowymi
Najbardziej rozpowszechnionym produkcyjnym przypadkiem użycia ClamAV jest skanowanie bramy pocztowej. Jeśli uruchamiasz serwer pocztowy na infrastrukturze VPS Hosting lub Serwerów Dedykowanych, integracja ClamAV z MTA jest krytyczną warstwą bezpieczeństwa.
Typowe stosy integracji:
Postfix + amavisd-new + ClamAV — amavisd-new działa jako filtr treści między Postfix a ClamAV, obsługując również SpamAssassin
Postfix + clamsmtp — lekki proxy w stylu milter
Exim + ClamAV — natywna dyrektywa Exim av_scanner obsługuje clamd bezpośrednio przez gniazdo
Przykład: Integracja clamd Exim w /etc/exim4/exim4.conf:
av_scanner = clamd:/run/clamav/clamd.ctl
Ta pojedyncza dyrektywa kieruje całą zawartość wiadomości przez działającą instancję clamd przed dostarczeniem. Połącz to z odpowiednią konfiguracją Hostingu Poczty E-mail, aby zapewnić pełną ochronę infrastruktury pocztowej.
Rozwiązywanie typowych problemów z ClamAV
freshclam kończy się niepowodzeniem z komunikatem „locked by another process”
sudo systemctl stop clamav-freshclam
sudo rm -f /var/lock/clamav/freshclam.lock
sudo freshclam
sudo systemctl start clamav-freshclam
clamd nie uruchamia się: „ERROR: Can’t open/parse the config file”
Sprawdź ścieżkę pliku konfiguracyjnego i składnię:
sudo clamd --config-file=/etc/clamav/clamd.conf --debug 2>&1 | head -50
Wysokie zużycie pamięci
clamd zazwyczaj zużywa 500 MB–1,2 GB RAM przy załadowanej pełnej bazie danych. Na systemach z ograniczoną pamięcią rozważ:
Ustawienie MaxThreads 2 w clamd.conf w celu ograniczenia współbieżności
Używanie clamscan bez demona do rzadkich skanowań
Uaktualnienie do planu z wystarczającą ilością RAM — plan VPS Hosting z co najmniej 2 GB RAM to praktyczne minimum do uruchomienia clamd obok stosu webowego
Skanowanie zwraca „Access denied” dla plików
Demon clamd działa jako użytkownik clamav. Przyznaj dostęp do odczytu:
sudo setfacl -R -m u:clamav:rX /path/to/scan
Lub użyj clamdscan --fdpass do przekazywania deskryptorów plików z kontekstu wywołującego użytkownika.
Fałszywe alarmy
ClamAV czasami oznacza legalne pliki, szczególnie skompresowane archiwa lub niektóre frameworki PHP. Aby umieścić znany bezpieczny plik na białej liście według skrótu:
sigtool --md5 /path/to/legitimate/file >> /var/lib/clamav/whitelist.fp
Uruchom ponownie clamd po modyfikacji plików .fp.
ClamAV na hostingu współdzielonym vs. VPS vs. serwer dedykowany
Model wdrożenia znacząco wpływa na sposób konfiguracji ClamAV:
Środowisko
Zalecany tryb
Uwagi
Hosting Współdzielony
clamscan na żądanie przez cron
Brak dostępu roota; tryb demona niedostępny
VPS (2–4 GB RAM)
Demon clamd + cron clamdscan
Równoważenie wydajności z ograniczeniami pamięci
Serwer dedykowany
clamd + clamonacc + integracja pocztowa
Pełny zestaw funkcji; bez kompromisów zasobowych
Węzeł GPU/wysokich obliczeń
Tylko demon clamd
Unikaj narzutu I/O clamonacc na potokach danych
W środowiskach wymagających maksymalnej przepustowości i pełnej kontroli nad narzędziami bezpieczeństwa, Serwery Dedykowane zapewniają zasoby sprzętowe do jednoczesnego uruchamiania clamd, clamonacc i skanowania poczty bez rywalizacji o zasoby.
Macierz decyzji technicznych i kluczowe wnioski
Przed wdrożeniem ClamAV zweryfikuj każde z poniższych:
Wersja jądra — uruchom uname -r; potwierdź 5.1+, jeśli wymagany jest clamonaccclamd potrzebuje 1–1,5 GB; zaplanuj odpowiednio przed włączeniem demonafreshclam — potwierdź, że clamav-freshclam.service jest włączony i NotifyClamd jest ustawiony w freshclam.confclamav może odczytać wszystkie cele skanowania; używaj --fdpass z clamdscan tam, gdzie listy ACL są niepraktyczne/proc, /sys, /dev z rekurencyjnych skanowańlogrotate dla wszystkich plików dziennika ClamAV przed włączeniem codziennych zadań cronOnAccessPrevention — testuj w trybie tylko wykrywania (no) przed przełączeniem na tryb blokowania (yes) w systemach produkcyjnychamavisd-new lub natywną dyrektywę MTA av_scanner, a nie tylko przez okresowe skanowania plików/var/quarantine z odpowiednią własnością przed użyciem --move; clamscan nie utworzy go automatycznie.fp i przeglądaj dzienniki skanowania po każdej aktualizacji bazy danych pod kątem regresjiCzęsto zadawane pytania
Czy ClamAV zapewnia ochronę w czasie rzeczywistym na Linux domyślnie?
Nie. Po instalacji ClamAV działa wyłącznie w trybie na żądanie. Ochrona w czasie rzeczywistym wymaga jawnego włączenia clamonacc z dyrektywami OnAccessIncludePath i OnAccessPrevention w clamd.conf, a także jądra obsługującego fanotify (5.1+).
Jaka jest różnica między clamscan a clamdscan?
clamscan to samodzielny plik binarny, który ładuje bazę wirusów z dysku przy każdym wywołaniu, powodując opóźnienie uruchamiania 5–30 sekund. clamdscan to cienki klient, który przesyła zadania skanowania do już działającego demona clamd, który przechowuje bazę danych w RAM — co czyni go znacznie szybszym przy powtarzających się lub zautomatyzowanych skanowaniach.
Ile RAM wymaga demon ClamAV?
clamd z aktualną pełną bazą danych (main + daily + bytecode) zazwyczaj wymaga od 700 MB do 1,2 GB pamięci rezydentnej. Na systemach z mniej niż 2 GB całkowitej pamięci RAM uruchomienie demona obok serwera WWW lub bazy danych może powodować presję pamięci. Używaj clamscan bez demona na instancjach z ograniczoną pamięcią.
Czy ClamAV może skanować skompresowane archiwa i załączniki e-mail?
Tak. ClamAV natywnie rozpakowuje i skanuje ZIP, RAR, 7z, TAR, GZIP, BZIP2, CAB i wiele innych formatów archiwów, a także dokumenty OLE2 (Microsoft Office), pliki PDF i pliki wykonywalne ELF/PE. Dyrektywy MaxScanSize i MaxFileSize w clamd.conf kontrolują głębokość i limity rozmiaru dla skanowania archiwów.
Dlaczego freshclam zgłasza „locked by another process” bezpośrednio po instalacji?
Na Debian/Ubuntu usługa systemd clamav-freshclam uruchamia się automatycznie po instalacji pakietu i utrzymuje wyłączną blokadę na katalogu bazy danych. Ręczne uruchomienie freshclam podczas aktywności tej usługi powoduje konflikt blokady. Zatrzymaj usługę za pomocą sudo systemctl stop clamav-freshclam, uruchom ręczną aktualizację, a następnie uruchom ponownie usługę.
