ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

สแกนไวรัสและมัลแวร์บน Linux Server ด้วย ClamAV
Home สแกนไวรัสและมัลแวร์บน Linux Server ด้วย ClamAV

สแกนไวรัสและมัลแวร์บน Linux Server ด้วย ClamAV

แม้ Linux จะถูกโจมตีด้วยไวรัสแบบที่ระบาดบน Windows น้อยกว่ามาก แต่เซิร์ฟเวอร์ที่ให้ผู้ใช้อัปโหลดไฟล์ หรือทำหน้าที่เป็นเมลเซิร์ฟเวอร์ ก็เป็นทางผ่านของไฟล์อันตรายไปยังเครื่องปลายทางได้ และเว็บที่ถูกแฮกมักถูกฝัง Web Shell ซึ่ง ClamAV ตรวจจับได้

คู่มือนี้ติดตั้ง ClamAV ตั้งการสแกนตามเวลา และตั้งการสแกนแบบทันทีเฉพาะโฟลเดอร์ที่รับไฟล์จากภายนอก ซึ่งเป็นการตั้งค่าที่สมดุลระหว่างความปลอดภัยกับภาระของเครื่อง

สิ่งที่ต้องเตรียม

  • Linux Server และสิทธิ์ sudo
  • หน่วยความจำว่างอย่างน้อย 1.5 GB เพราะ clamd โหลดฐานข้อมูลไวรัสไว้ในหน่วยความจำ
# Ubuntu / Debian
sudo apt install -y clamav clamav-daemon clamav-freshclam

# AlmaLinux / Rocky Linux
sudo dnf install -y epel-release
sudo dnf install -y clamav clamd clamav-update

ขั้นตอนที่ 1: อัปเดตฐานข้อมูลไวรัส

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

ต้องหยุดเซอร์วิสก่อนรัน freshclam ด้วยมือ ไม่เช่นนั้นจะชนกันเพราะทั้งคู่ล็อกไฟล์ฐานข้อมูลเดียวกัน

ตรวจว่าฐานข้อมูลใหม่จริง

sudo ls -lh /var/lib/clamav/
clamscan --version

ฐานข้อมูลที่เก่าเกินหนึ่งสัปดาห์แทบไม่มีประโยชน์ ตรวจว่าเซอร์วิสอัปเดตทำงานอยู่ด้วย sudo systemctl status clamav-freshclam

ขั้นตอนที่ 2: ทดสอบว่าตรวจจับได้

ใช้ไฟล์ทดสอบมาตรฐาน EICAR ซึ่งไม่ใช่ไวรัสจริงแต่โปรแกรมป้องกันไวรัสทุกตัวตกลงกันว่าจะตรวจจับ

cd /tmp
curl -sO https://secure.eicar.org/eicar.com.txt
clamscan eicar.com.txt

ควรเห็นผลลัพธ์ eicar.com.txt: Win.Test.EICAR_HDB-1 FOUND จากนั้นลบไฟล์ทดสอบทิ้ง

rm -f /tmp/eicar.com.txt

ขั้นตอนที่ 3: สแกนด้วยมือ

# สแกนโฟลเดอร์เดียว แสดงเฉพาะที่พบ
clamscan -r -i /var/www

# สแกนทั้งเครื่อง ข้ามระบบไฟล์เสมือน
sudo clamscan -r -i / \
  --exclude-dir='^/sys' --exclude-dir='^/proc' \
  --exclude-dir='^/dev' --exclude-dir='^/var/lib/clamav'

# จำกัดขนาดไฟล์ที่สแกนเพื่อความเร็ว
clamscan -r -i --max-filesize=50M --max-scansize=200M /var/www

ตัวเลือก -i คือแสดงเฉพาะไฟล์ที่ติดเชื้อ ทำให้ผลอ่านง่ายมาก และ -r คือสแกนลงไปในโฟลเดอร์ย่อย

ขั้นตอนที่ 4: ใช้ clamd เพื่อให้สแกนเร็วขึ้น

clamscan โหลดฐานข้อมูลใหม่ทุกครั้งที่รัน ซึ่งใช้เวลาหลายสิบวินาที ส่วน clamdscan ส่งงานให้เซอร์วิสที่โหลดฐานข้อมูลค้างไว้แล้ว จึงเร็วกว่ามาก

sudo systemctl enable --now clamav-daemon
sudo systemctl status clamav-daemon --no-pager

clamdscan --fdpass -i /var/www

ตัวเลือก --fdpass จำเป็นเมื่อ clamd รันด้วยผู้ใช้ที่ไม่มีสิทธิ์อ่านไฟล์นั้นโดยตรง

ขั้นตอนที่ 5: ตั้งสแกนตามเวลา

sudo nano /usr/local/bin/clamav-scan.sh
#!/bin/bash
set -uo pipefail

TARGETS="/var/www /home /tmp /var/tmp"
QUARANTINE=/var/quarantine
LOG=/var/log/clamav/scan-$(date +%F).log

mkdir -p "$QUARANTINE"
chmod 700 "$QUARANTINE"

clamdscan --fdpass --multiscan -i \
  --move="$QUARANTINE" \
  --log="$LOG" $TARGETS

STATUS=$?
if [ "$STATUS" -eq 1 ]; then
  mail -s "ClamAV พบไฟล์ต้องสงสัยบน $(hostname)" [email protected] < "$LOG"
fi
exit 0
sudo mkdir -p /var/log/clamav
sudo chmod +x /usr/local/bin/clamav-scan.sh

สร้าง systemd Timer ให้รันทุกคืน

sudo nano /etc/systemd/system/clamav-scan.service
[Unit]
Description=สแกนไวรัสตามรอบ

[Service]
Type=oneshot
ExecStart=/usr/local/bin/clamav-scan.sh
Nice=19
IOSchedulingClass=idle
sudo nano /etc/systemd/system/clamav-scan.timer
[Unit]
Description=สแกนไวรัสทุกคืนตีสอง

[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=1800
Persistent=true

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now clamav-scan.timer
systemctl list-timers | grep clamav

บรรทัด Nice=19 และ IOSchedulingClass=idle ทำให้การสแกนใช้ทรัพยากรเฉพาะตอนที่เครื่องว่าง ไม่แย่งงานจริง

ขั้นตอนที่ 6: สแกนทันทีเมื่อมีไฟล์อัปโหลด

เหมาะกับโฟลเดอร์ที่รับไฟล์จากผู้ใช้ อย่าเปิดกับทั้งเครื่องเพราะจะกินทรัพยากรมาก

sudo nano /etc/clamav/clamd.conf
ScanOnAccess true
OnAccessMountPath /var/www/example.com/public/uploads
OnAccessPrevention true
OnAccessExcludeUname clamav
sudo systemctl restart clamav-daemon
sudo journalctl -u clamav-daemon -n 30 --no-pager

ต้องมีโมดูล fanotify ในเคอร์เนล ซึ่งมีในเคอร์เนลรุ่นใหม่ทุกตัว หากไม่ทำงานให้ตรวจข้อความใน Log ของเซอร์วิส

ขั้นตอนที่ 7: จัดการไฟล์ที่ตรวจพบ

sudo ls -lh /var/quarantine/
sudo clamscan --infected --no-summary /var/quarantine/

อย่าลบทันที ให้ตรวจก่อนว่าเป็นผลบวกลวงหรือไม่ โดยเฉพาะไฟล์ในโฟลเดอร์ของเว็บที่อาจเป็นไฟล์จริงของระบบ หากเป็นเว็บที่ถูกแฮก ให้ทำตามขั้นตอนกู้คืนอย่างครบถ้วน ไม่ใช่แค่ลบไฟล์ที่พบ เพราะช่องทางที่ผู้โจมตีเข้ามายังอยู่

ปัญหาที่พบบ่อย

clamav-daemon เริ่มไม่ขึ้น

สาเหตุอันดับหนึ่งคือหน่วยความจำไม่พอ ฐานข้อมูลไวรัสใช้ราว 1.2 GB ตรวจด้วย free -h และดู Log ด้วย sudo journalctl -u clamav-daemon -n 50 หากเครื่องเล็กมาก ให้ใช้ clamscan ตามเวลาแทนการรัน daemon ค้างไว้

freshclam ล้มเหลว ขึ้น WARNING: Can't query

มักเป็นการถูกจำกัดจำนวนครั้งจากฝั่งผู้ให้บริการฐานข้อมูล รอสักครู่แล้วลองใหม่ และตรวจว่าไม่ได้ตั้งให้อัปเดตถี่เกินไปใน /etc/clamav/freshclam.conf

สแกนแล้วเครื่องช้ามาก

ใช้ Nice และ IOSchedulingClass=idle ตามขั้นตอนที่ 5 จำกัดขนาดไฟล์ที่สแกน และเลี่ยงการสแกนโฟลเดอร์ข้อมูลขนาดใหญ่ที่ไม่ได้รับไฟล์จากภายนอก เช่น โฟลเดอร์ข้อมูลของฐานข้อมูล

แจ้งว่าพบแต่เป็นไฟล์ปกติของระบบ

ส่งไฟล์ให้ผู้พัฒนาตรวจสอบเพื่อถอดออกจากฐานข้อมูล และระหว่างนั้นเพิ่มเข้ารายการยกเว้นด้วย ExcludePath ใน clamd.conf ระบุให้แคบที่สุดเท่าที่ทำได้

หากสงสัยว่าเซิร์ฟเวอร์ถูกบุกรุก ติดต่อทีมงาน THAI DATA CLOUD ทันทีที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security