«บน Linux ไม่ต้องใช้แอนติไวรัส» เป็นความเห็นที่แพร่หลาย และในรูปแบบดั้งเดิมมันถูกต้อง: ไวรัสที่ติดไฟล์ระบบของ Linux แทบไม่มีอยู่ ClamAV บนเซิร์ฟเวอร์มีงานคนละอย่าง และมันถูกระบุแบบนี้: หาสิ่งที่ถูกอัปโหลดผ่านเว็บไซต์ของคุณ เหนืออื่นใดคือ web shell
เรากำลังหาอะไรกันแน่
web shell คือไฟล์ PHP เล็ก ๆ ที่ทำให้รันคำสั่งผ่านเบราว์เซอร์ได้ มันมาผ่านฟอร์มอัปโหลด ปลั๊กอินที่มีช่องโหว่ หรือรหัสผ่านผู้ดูแลที่ถูกเดาได้ แล้วไปนั่งอยู่ท่ามกลางรูปภาพในไดเรกทอรีอัปโหลดและอยู่ที่นั่นนานหลายเดือน ทั้งไฟร์วอลล์และ Fail2ban จะไม่เห็นมัน: คำขอไปยังมันดูเหมือนคำขอธรรมดาของเว็บไซต์
นอกจากนั้น ClamAV ยังพบ:
- ไฟล์อันตรายที่ผู้ใช้อัปโหลดมาและถูกส่งต่อจากเซิร์ฟเวอร์ของคุณ — จดหมายจากผู้ให้บริการมักเป็นเรื่องนี้;
- ไฟล์แนบในเมล ถ้าเซิร์ฟเวอร์จัดการเมล;
- มัลแวร์ของ Windows ในที่เก็บไฟล์ — ตัวเซิร์ฟเวอร์เองไม่เดือดร้อน แต่พนักงานที่ดาวน์โหลดไฟล์นั้นจะเดือดร้อน
เรื่องข้อจำกัดนั้นพูดตรง ๆ ตั้งแต่ต้น: ClamAV ไม่ป้องกันการถูกเจาะและไม่ตรวจพบมันด้วยตัวเอง มันตรวจพบร่องรอย ประตูหลังที่แนบท้ายไฟล์ธีมที่มีอยู่แล้วอย่างแนบเนียนจะรอดพ้นตัวสแกนลายเซ็นไปได้ — นั่นคือสิ่งที่การเฝ้าดูความสมบูรณ์ของไฟล์มีไว้เพื่อการนั้น
การติดตั้งและการตั้งค่าเดียวที่สำคัญ
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
คำสั่งที่สองสำคัญกว่าคำสั่งแรก freshclam คือบริการอัปเดตลายเซ็น และถ้ามันไม่ทำงาน ClamAV ก็กลายเป็นไร้ประโยชน์ในขณะที่ยังรายงานว่าสแกนสำเร็จต่อไป ตรวจอายุของฐานข้อมูลแบบนี้:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
ฐานข้อมูลที่เก่ากว่าหนึ่งสัปดาห์แปลว่ากลไกพัง สาเหตุที่พบบ่อยคือการเชื่อมต่อขาออกถูกบล็อก หรือ freshclam ถูกรันด้วยมือในฐานะ root หลังจากนั้นบริการก็เขียนลงไฟล์ของตัวเองไม่ได้เพราะสิทธิ์
หน่วยความจำ: เดมอนหรือการรันครั้งเดียว
มีสองวิธีใช้งาน และการเลือกควรเป็นไปอย่างมีสติ
clamd คือเดมอนที่ทำงานตลอดเวลาและเก็บฐานข้อมูลไว้ในหน่วยความจำ มันตอบเร็วแต่กินแรมราวหนึ่งกิกะไบต์ บน VPS ที่มีหนึ่งถึงสองกิกะไบต์นั่นยอมรับไม่ได้: เดมอนจะเบียดฐานข้อมูลและ PHP-FPM ออกไป และเซิร์ฟเวอร์ก็จะเริ่มคลานโดยไม่มีสาเหตุที่มองเห็น วินิจฉัยได้ด้วย free -m และจากการที่ swap ทำงาน
ทางเลือกคือ clamscan ตามตารางเวลา มันช้ากว่า (โหลดฐานข้อมูลทุกครั้งที่รัน ราวหนึ่งนาที) แต่ทำงานเฉพาะตอนสแกนเท่านั้น:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
ธง -i พิมพ์เฉพาะสิ่งที่พบ มิฉะนั้นผลลัพธ์จะยาวเป็นแสนบรรทัด
สแกนไดเรกทอรี ไม่ใช่ทั้งดิสก์
การสแกนทั้งดิสก์บนเซิร์ฟเวอร์ที่ไม่แรงใช้เวลาหลายชั่วโมงและสร้างภาระ จึงถูกจัดไว้ตอนกลางคืนแล้วก็ถูกปิดไปเลย ปฏิบัติได้จริงกว่าคือสแกนสิ่งที่เปลี่ยนแปลงจากภายนอกจริง ๆ:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
ในบรรทัดนั้นมีสามสิ่งที่สำคัญ ionice และ nice ขจัดผลกระทบต่อเว็บไซต์ ใช้ --move ไม่ใช่ --remove — ไฟล์ไปกักกันแทนที่จะถูกลบ: ผลบวกลวงเกิดขึ้นได้ และไฟล์ของลูกค้าที่ถูกลบโดยพลาดกู้คืนจากที่ไหนไม่ได้เลย และไดเรกทอรีที่สแกนคือไดเรกทอรีที่ไฟล์ถูกอัปโหลดเข้ามา ไม่ใช่รากทั้งหมด
ลายเซ็นสำหรับ web shell
ฐานข้อมูลมาตรฐานของ ClamAV อ่อนเรื่องประตูหลัง PHP — พวกมันมุ่งไปที่ทราฟฟิกเมลเป็นหลัก Linux Malware Detect (maldet) ทำได้ดีกว่าอย่างเห็นได้ชัดในเรื่องนี้: มันมีชุดลายเซ็นของตัวเองที่สร้างรอบ web shell พอดี และมันสแกนด้วยเอนจินของ ClamAV ถ้าติดตั้งไว้ การผสมผสานที่ใช้กันคือ ClamAV เป็นเอนจินและฐานข้อมูลที่อัปเดตได้ maldet เป็นแหล่งลายเซ็นเฉพาะทาง
จะทำอย่างไรกับสิ่งที่พบ
web shell ที่พบไม่ใช่จุดจบของการสอบสวนแต่เป็นจุดเริ่ม ไฟล์ในไดเรกทอรีอัปโหลดแปลว่ามีคนเขียนที่นั่นได้ และการลบไฟล์ไม่ได้ขจัดความสามารถนั้น
- อย่าลบมันทันที — เก็บสำเนาไว้และจดเวลาที่ไฟล์ถูกแก้ไข
- ใช้เวลานั้นค้นในล็อกของเว็บเซิร์ฟเวอร์ว่าคำขอใดวางมันไว้ตรงนั้น นั่นคือช่องโหว่
- หาเพื่อนบ้าน: ประตูหลังแทบไม่เคยถูกทิ้งไว้เพียงชุดเดียว
- ตรวจว่าในช่วงเวลาเดียวกันมีอะไรบนดิสก์เปลี่ยนไปอีก และมีงาน cron และคีย์ SSH ใหม่ปรากฏขึ้นหรือไม่
เรื่องผลบวกลวงขอพูดแยก ไลบรารีเทมเพลตและ JavaScript ที่ถูกย่อบางครั้งตรงกับลายเซ็น จึงเป็นเหตุให้ใช้การกักกันแทนการลบ และเป็นเหตุให้แนะนำว่าอย่าเอาชุดลายเซ็นของบุคคลที่สามทุกชุดที่หาได้มาแปะ: ความเชื่อถือในรายงานที่ครึ่งหนึ่งเป็นเสียงรบกวนจะหมดไปภายในหนึ่งสัปดาห์ และผู้คนก็เลิกอ่านมัน
คุณค่าในทางปฏิบัติของตัวสแกนอยู่ที่ผลลัพธ์ของมันสะดุดตา: การสแกนครั้งล่าสุดรันเมื่อไร ฐานข้อมูลเก่าแค่ไหน พบอะไรบ้าง นั่นคือบรรทัดเดียว แต่การไม่มีมันเปลี่ยนแอนติไวรัสที่ติดตั้งแล้วให้กลายเป็นแค่เครื่องหมายถูกในช่อง บรรทัดนั้นหน้าตาเป็นอย่างไรดูได้ที่หน้าเดโมด้านล่าง