ติดตั้ง ClamAV ป้องกันไวรัสบน VPS Linux
ClamAV เป็น antivirus ฟรีและเปิดซอร์สที่ได้รับความนิยมสูงสำหรับ Linux servers โปรแกรมนี้ออกแบบมาเพื่อตรวจจับไวรัส trojan malware และอื่นๆ ด้วย signature database ที่อัพเดทอยู่เสมอ เหมาะสำหรับ VPS ที่ต้องการการป้องกันด้านความปลอดภัยระดับพื้นฐานแบบ lightweight โดยไม่ใช้ resources มากนัก
ความต้องการพื้นฐาน
ก่อนติดตั้ง ClamAV ให้แน่ใจว่ามี:
- VPS Linux (CentOS, Ubuntu, Debian รองรับ)
- พื้นที่ว่าง minimum 500MB สำหรับ virus database
- สิทธิ์เข้า shell ระดับ root หรือใช้ sudo
- apt-get, yum หรือ package manager ของระบบที่ใช้
ขั้นตอนติดตั้ง ClamAV
เชื่อมต่อ SSH เข้า VPS แล้วเรียกใช้คำสั่งต่อไปนี้ตามระบบปฏิบัติการของคุณ:
สำหรับ Ubuntu/Debian:
sudo apt-get update
sudo apt-get install -y clamav clamav-daemon clamav-freshclam
สำหรับ CentOS/RHEL:
sudo yum install -y epel-release
sudo yum install -y clamav clamav-daemon clamav-update
หลังติดตั้งเสร็จ ให้อัพเดท virus signature database:
sudo freshclam
คำสั่งนี้จะดาวน์โหลด virus definitions ล่าสุด ซึ่งจำเป็นต่อการตรวจจับ malware ให้มีประสิทธิภาพ
การค่าเครื่อง ClamAV
ไฟล์การตั้งค่า ClamAV หลักอยู่ใน /etc/clamav/clamd.conf เปิดไฟล์แล้วปรับค่าเหล่านี้:
sudo nano /etc/clamav/clamd.conf
ค้นหาและแก้ไขบรรทัดต่อไปนี้:
LogFile /var/log/clamav/clamd.log
LogFileUnlock yes
MaxThreads 4
ScanMail yes
ScanArchive yes
ArchiveMaxRecursion 10
ประมาณหรือเพิ่มเติมขึ้นอยู่กับกำลัง CPU ของ VPS ถ้ามี 2 cores ให้ตั้ง MaxThreads เป็น 2 ถ้ามี 4 cores ก็ตั้ง 4 ตามนั้น
การรัน Manual Scan
ก่อนตั้ง cron jobs อัตโนมัติ ให้ทดสอบสแกนด้วยตนเองก่อน:
clamscan -r /var/www/html
คำสั่งนี้จะสแกนไฟล์ทั้งหมดในโฟลเดอร์ /var/www/html (หรือโฟลเดอร์เว็บไซต์ของคุณ) ในโหมด recursive (ลึกถึงโฟลเดอร์ย่อย)
เพื่อให้ scan เร็วขึ้นและข้อมูลอัปเดต ใช้ daemon mode:
sudo systemctl start clamav-daemon
sudo systemctl enable clamav-daemon
clamdscan -r /var/www/html
Clamdscan ใช้ daemon ที่ทำงานอยู่แล้ว ทำให้สแกนเร็วกว่า clamscan ประมาณ 3-5 เท่า
ตั้งค่า Cron Scan อัตโนมัติ
เพื่อให้ VPS สแกนไฟล์อัตโนมัติทุกวัน ให้สร้าง cron job:
sudo crontab -e
เพิ่มบรรทัดต่อไปนี้ (สแกนทุกวันเวลา 2:00 AM):
0 2 * * * clamscan -r -i /var/www/html 2>&1 | mail -s "ClamAV Scan Report" [email protected]
Flag -i หมายถึง "infected only" ซึ่งจะรายงานเฉพาะไฟล์ที่พบปัญหา จะป้องกันการส่งเมล report ยาวเกิน
ถ้าต้องการตรวจจับทั้งหมดรวมถึงไฟล์ที่ปลอดภัย นำออก flag -i:
0 2 * * * clamscan -r /var/www/html 2>&1 | mail -s "ClamAV Full Scan" [email protected]
สำหรับ CentOS ให้สร้างไฟล์ cron script แทน:
sudo nano /etc/cron.daily/clamav-scan
เพิ่มเนื้อหาต่อไปนี้:
#!/bin/bash
LOGDIR="/var/log/clamav"
LOG="$LOGDIR/daily-scan-$(date +\%Y\%m\%d).log"
mkdir -p $LOGDIR
clamscan -r -i /var/www/html > $LOG 2>&1
if [ -s $LOG ]; then
mail -s "ClamAV Alert - Infected Files Found" [email protected] < $LOG
fi
บันทึกไฟล์แล้วทำให้ executable:
sudo chmod +x /etc/cron.daily/clamav-scan
การแจ้งเตือนผ่าน Email
เพื่อให้ได้รับการแจ้งเตือนทันทีเมื่อพบ malware ให้สร้าง script advanced:
sudo nano /usr/local/bin/clamav-notify.sh
เพิ่มสคริปต์นี้:
#!/bin/bash
SCAN_DIR="/var/www/html"
EMAIL="[email protected]"
HOSTNAME=$(hostname)
DATE=$(date '+%Y-%m-%d %H:%M:%S')
LOG_FILE="/tmp/clamav-scan-$$.log"
# Run scan
clamscan -r $SCAN_DIR > $LOG_FILE 2>&1
# Check if infected files found
if grep -q "Infected files:" $LOG_FILE; then
INFECTED=$(grep "Infected files:" $LOG_FILE)
SUMMARY=$(tail -5 $LOG_FILE)
{
echo "ALERT: Malware detected on $HOSTNAME"
echo "Time: $DATE"
echo "Scan Directory: $SCAN_DIR"
echo ""
echo "$INFECTED"
echo ""
echo "Summary:"
echo "$SUMMARY"
} | mail -s "CRITICAL: Malware Found on $HOSTNAME" $EMAIL
fi
rm -f $LOG_FILE
ทำให้ script executable:
sudo chmod +x /usr/local/bin/clamav-notify.sh
เพิ่มใน crontab:
0 */6 * * * /usr/local/bin/clamav-notify.sh
script นี้จะสแกนทุก 6 ชั่วโมงและส่ง email alert ถ้าพบไวรัส
Integration กับ FTP Server
เพื่อตรวจสอบไฟล์ FTP อัพโหลดใหม่ ให้เพิ่มสคริปต์ใน FTP upload handler:
sudo nano /usr/local/bin/ftp-scan.sh
#!/bin/bash
UPLOAD_DIR=$1
EMAIL="[email protected]"
clamscan -r "$UPLOAD_DIR" 2>&1 | tee /tmp/ftp-scan.log
if grep -q "Infected files:" /tmp/ftp-scan.log; then
INFECTED=$(grep "Infected" /tmp/ftp-scan.log | head -5)
{
echo "FTP Upload Scan Alert"
echo "Directory: $UPLOAD_DIR"
echo ""
echo "$INFECTED"
} | mail -s "Malware in FTP Upload" $EMAIL
# Optional: Remove infected file
# find "$UPLOAD_DIR" -type f -name "*.php" -o -name "*.exe" | xargs clamscan | grep FOUND | cut -d: -f1 | xargs rm -f
exit 1
fi
exit 0
ทำให้ executable:
sudo chmod +x /usr/local/bin/ftp-scan.sh
สำหรับ ProFTPD เพิ่มใน /etc/proftpd/proftpd.conf:
ScriptEngine on
ScriptLog /var/log/proftpd/script.log
ExecOnExit CDUP /usr/local/bin/ftp-scan.sh %p
ตรวจสอบว่า ClamAV ทำงานถูกต้อง
ใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่า ClamAV ติดตั้งและทำงานอยู่:
# ตรวจสอบเวอร์ชัน
clamscan --version
# ตรวจสอบ daemon status
sudo systemctl status clamav-daemon
# ตรวจสอบ freshclam status
sudo systemctl status clamav-freshclam
# ดูจำนวน virus signatures
clamscan --version | grep -i "virus"
# ทดสอบกับไฟล์ test EICAR (ไฟล์ทดสอบปลอดภัยเสมือนเป็นไวรัส)
echo "X5O!P%@AP[4\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*" > /tmp/eicar.txt
clamscan /tmp/eicar.txt
แก้ปัญหาที่พบบ่อย
Error: "Can't create temporary directory"
สาเหตุ: โฟลเดอร์ temp ของ clamav ไม่มีสิทธิ์เขียนข้อมูล
วิธีแก้:
sudo mkdir -p /var/tmp/clamav
sudo chown clamav:clamav /var/tmp/clamav
sudo chmod 755 /var/tmp/clamav
Error: "Socket file missing" เมื่อใช้ clamdscan
สาเหตุ: daemon ไม่ได้รันหรือ socket ไฟล์ถูกลบ
วิธีแก้:
sudo rm -f /var/run/clamav/clamd.ctl
sudo systemctl restart clamav-daemon
sleep 2
clamdscan -r /var/www/html
Error: "freshclam: Connection timeout" หรือ "Can't connect to ClamAV"
สาเหตุ: firewall บล็อก port หรือ network ไม่เสถียร
วิธีแก้:
# ตรวจสอบ network connectivity
ping -c 3 8.8.8.8
# ลองทีหลังอีกครั้ง
sudo systemctl restart clamav-freshclam
sleep 5
sudo freshclam
# ถ้ายังติด ให้แก้ mirror server
sudo nano /etc/clamav/freshclam.conf
# ค้นหา DatabaseMirror และเปลี่ยนเป็น:
# DatabaseMirror clamav.net
# DatabaseMirror database.clamav.net
Scan ช้ามากหรือใช้ CPU 100%
สาเหตุ: MaxThreads ตั้งสูงเกินไป หรือ scan directory มีไฟล์ขนาดใหญ่มากมาย
วิธีแก้:
# ลดจำนวน threads
sudo nano /etc/clamav/clamd.conf
# เปลี่ยน MaxThreads เป็น 2 (สำหรับ CPU 2 cores)
# สแกนเฉพาะไฟล์ที่สำคัญเท่านั้น
clamscan -r --exclude-dir='^/sys' --exclude-dir='^/proc' /var/www/html
# restart daemon
sudo systemctl restart clamav-daemon
คำถามที่พบบ่อย
ClamAV ใช้เนื้อที่ว่างเท่าไหร่?
Virus database เบื้องต้นประมาณ 100-150MB และเพิ่มขึ้นเรื่อยๆ (อัพเดททุกวัน) Log files สามารถใช้เนื้อที่ได้ 1-2GB ต่อเดือนหากสแกนบ่อยครั้ง ควรตั้ง log rotation เพื่อเก็บเฉพาะ 7-14 วันล่าสุดเท่านั้น
ควรสแกนบ่อยแค่ไหน?
สำหรับเว็บไซต์ที่มีการอัพโหลดรูป/ไฟล์บ่อยๆ ควรสแกนทุกวัน (หรือทุก 12 ชั่วโมง) สำหรับเว็บไซต์ static ที่ไม่มีการเปลี่ยนแปลง สแกน 1-2 ครั้งต่อสัปดาห์ก็พอ ส่วน FTP uploads ควรสแกนทันทีเมื่ออัพโหลด (real-time) เพื่อขัดขวาง malware ตั้งแต่ต้น
ClamAV สามารถลบไฟล์ infected อัตโนมัติได้หรือ?
ได้ ใช้ flag --remove ในคำสั่ง clamscan ตัวอย่าง: clamscan -r --remove /var/www/html อย่างไรก็ตาม ขอแนะนำให้ quarantine (ย้ายไฟล์เข้า folder แยก) แทนการลบ เพื่อศึกษาและ manual review ก่อนลบ ใช้ flag --move=/var/quarantine แทนนั้น