Hướng dẫn cài đặt và cấu hình ClamAV trên Ubuntu Server: Tự động cập nhật database và quét mã độc định kỳ

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

2 giờ sáng, chuông PagerDuty réo liên tục. CPU con web server WordPress vọt lên 100%, outbound traffic chạm ngưỡng 250 Mbps. Kẻ tấn công vừa drop thành công một con webshell vào thư mục wp-content/uploads để kéo miner Monero về chạy ngầm. Trong tình huống này, ClamAV là giải pháp mã nguồn mở tiện nhất: sẵn có trên repo Ubuntu, không tốn phí bản quyền và có thể quét ra file nhiễm ngay lập tức.

Quick start: Cài đặt và quét dọn trong 5 phút

Nếu server đang có dấu hiệu giật lag bất thường và cần bóc tách file lạ ngay, bạn mở terminal và gõ lần lượt:

# 1. Cập nhật repo và cài gói ClamAV
sudo apt update
sudo apt install -y clamav clamav-daemon

# 2. Dừng service freshclam để tránh lỗi xung đột tiến trình
sudo systemctl stop clamav-freshclam

# 3. Kéo bản chữ ký virus mới nhất từ Cisco Talos
sudo freshclam

# 4. Kích hoạt lại tiến trình auto-update chữ ký
sudo systemctl start clamav-freshclam
sudo systemctl enable clamav-freshclam

# 5. Quét đệ quy thư mục web, chỉ hiển thị file dính mã độc
sudo clamscan -r -i /var/www/html

Ở lệnh trên, cờ -r (recursive) sẽ rà sâu vào mọi thư mục con. Cờ -i (infected) giúp lọc bớt hàng trăm nghìn dòng log sạch, chỉ in ra màn hình đúng file bị cắm backdoor hoặc trojan.

Hiểu bản chất từng thành phần trong ClamAV

Sau khi dập xong đám cháy, bạn nên hiểu rõ cách ClamAV vận hành. Điều này giúp bạn tránh gặp sự cố crash server vì thiếu RAM hay nghẽn I/O đĩa cứng.

1. So sánh clamscan và clamdscan

Hai lệnh này dùng trong hai tình huống hoàn toàn khác nhau:

  • clamscan (CLI độc lập): Mỗi lần chạy, nó mất khoảng 20-30 giây chỉ để đọc toàn bộ cơ sở dữ liệu mẫu virus từ đĩa cứng rồi nhồi vào RAM. Quét xong, tiến trình tự hủy và giải phóng bộ nhớ. Lệnh này tiện khi cần kiểm tra đột xuất, nhưng ngốn I/O và CPU nếu chạy tần suất dày.
  • clamdscan (Client/Server qua Socket): Hoạt động phụ thuộc vào clamav-daemon. Daemon này luôn ngậm sẵn database trên RAM. Khi chạy clamdscan, lệnh chỉ gửi đường dẫn file qua socket nội bộ (/run/clamav/clamd.ctl) để daemon xử lý. Tốc độ quét nhanh gấp 5 đến 10 lần so với clamscan.

2. Freshclam: Cơ chế cập nhật chữ ký

Cơ sở dữ liệu mẫu độc hại của ClamAV do Cisco Talos duy trì hàng giờ. File cấu hình nằm tại /etc/clamav/freshclam.conf. Mặc định, daemon clamav-freshclam kiểm tra bản cập nhật mới 24 lần một ngày (mỗi tiếng một lần) qua cổng HTTPS.

3. Khắc phục lỗi: “freshclam is locked by another process”

Vừa cài đặt xong mà gõ ngay sudo freshclam, gần như chắc chắn bạn sẽ gặp thông báo:

ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem database update failed.

Nguyên nhân rất đơn giản: Ngay khi apt cài xong, Ubuntu đã tự động kích hoạt service clamav-freshclam dưới nền. Service này chiếm quyền ghi độc quyền file log và database. Để cập nhật thủ công, bạn chỉ cần tạm dừng service trước:

sudo systemctl stop clamav-freshclam
sudo freshclam
sudo systemctl start clamav-freshclam

Thiết lập tự động quét và gửi cảnh báo qua Cronjob

Cách ly file tự động là bước bắt buộc để ngăn mã độc lây lan thêm trong khi bạn chưa kịp can thiệp.

1. Khởi tạo thư mục cách ly (Quarantine)

Không nên dùng cờ --remove để xóa file ngay vì có thể dính false positive (nhận diện nhầm file code sạch). Bạn hãy chuyển file nghi ngờ sang một thư mục cô lập được phân quyền chặt chẽ:

sudo mkdir -p /var/quarantine
sudo chmod 700 /var/quarantine

2. Viết bash script tự động hóa

Tạo file script thực thi tại /usr/local/bin/clamav-auto-scan.sh:

sudo nano /usr/local/bin/clamav-auto-scan.sh

Khai báo nội dung script như sau (yêu cầu máy chủ đã cấu hình gói mailutils hoặc lệnh gửi mail):

#!/bin/bash

SCAN_TARGET="/var/www /home /tmp"
LOG_FILE="/var/log/clamav/daily-scan.log"
QUARANTINE_DIR="/var/quarantine"
DATE=$(date +"%Y-%m-%d %H:%M:%S")

echo "=== Quét ClamAV bắt đầu lúc: $DATE ===" >> "$LOG_FILE"

# Quét đệ quy, đẩy file nhiễm vào khu cách ly và bỏ qua virtual filesystem
clamscan -r -i \
    --move="$QUARANTINE_DIR" \
    --exclude-dir="^/sys" \
    --exclude-dir="^/proc" \
    --exclude-dir="^/dev" \
    --log="$LOG_FILE" \
    $SCAN_TARGET

INFECTED_COUNT=$(grep "Infected files:" "$LOG_FILE" | tail -n 1 | awk '{print $3}')

if [ "$INFECTED_COUNT" -gt 0 ]; then
    echo "[CẢNH BÁO] Phát hiện $INFECTED_COUNT file mã độc! Kiểm tra ngay tại $QUARANTINE_DIR" | mail -s "[ALERT] Virus detected on $(hostname)" [email protected]
fi

Gán quyền chạy cho script vừa tạo:

sudo chmod +x /usr/local/bin/clamav-auto-scan.sh

3. Lập lịch Cronjob chạy đêm

Mở crontab của quyền root bằng lệnh sudo crontab -e, sau đó dán lịch quét vào lúc 03:00 sáng:

0 3 * * * /usr/local/bin/clamav-auto-scan.sh > /dev/null 2>&1

Kinh nghiệm tối ưu tài nguyên trên Production

Chạy phần mềm diệt virus trên server Linux cần tính toán cẩn thận để tránh ảnh hưởng đến các service web đang phục vụ khách hàng.

1. Ghim mức ưu tiên thấp bằng nice và ionice

Quét các file nén .zip hoặc thư mục chứa hàng triệu file nhỏ (như cache framework) sẽ đẩy CPU lên 100% và nghẽn disk I/O. Hãy hạ độ ưu tiên của tiến trình scan xuống thấp nhất:

nice -n 19 ionice -c 3 clamscan -r -i /var/www

Cấu hình này yêu cầu hệ điều hành ưu tiên CPU cho Nginx/PHP-FPM trước. Đồng thời, ổ cứng chỉ cấp băng thông cho ClamAV khi server đang ở trạng thái rảnh rỗi (Idle – -c 3).

2. Bài toán cân đối RAM cho clamav-daemon

Cơ sở dữ liệu mẫu nhận diện của ClamAV hiện chứa hơn 8.5 triệu chữ ký virus. Khi load vào bộ nhớ, clamd chiếm thực tế từ 1.1GB đến 1.4GB RAM. Nếu VPS chỉ có 1GB hoặc 2GB RAM, hệ điều hành sẽ kích hoạt OOM Killer để hạ sát MySQL nhằm cứu vãn bộ nhớ.

Đối với server dưới 2GB RAM:

  • Tắt hẳn clamav-daemon (sudo systemctl disable --now clamav-daemon).
  • Tạo swap file tối thiểu 2GB để chống sốc bộ nhớ.
  • Chỉ chạy lệnh clamscan độc lập qua cronjob vào khung giờ thấp điểm (2h – 4h sáng).

3. Luôn loại trừ các thư mục ảo

Nếu quét toàn bộ ổ đĩa từ thư mục gốc (/), bạn bắt buộc phải thêm cờ loại trừ --exclude-dir="^/proc", --exclude-dir="^/sys" và --exclude-dir="^/dev". Các thư mục này chứa file ảo do kernel tạo ra trên RAM. Quét vào đây sẽ khiến ClamAV rơi vào vòng lặp vô tận, gây nghẽn I/O và dễ làm treo cứng server.

Share: