«บน 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 ที่พบไม่ใช่จุดจบของการสอบสวนแต่เป็นจุดเริ่ม ไฟล์ในไดเรกทอรีอัปโหลดแปลว่ามีคนเขียนที่นั่นได้ และการลบไฟล์ไม่ได้ขจัดความสามารถนั้น

  1. อย่าลบมันทันที — เก็บสำเนาไว้และจดเวลาที่ไฟล์ถูกแก้ไข
  2. ใช้เวลานั้นค้นในล็อกของเว็บเซิร์ฟเวอร์ว่าคำขอใดวางมันไว้ตรงนั้น นั่นคือช่องโหว่
  3. หาเพื่อนบ้าน: ประตูหลังแทบไม่เคยถูกทิ้งไว้เพียงชุดเดียว
  4. ตรวจว่าในช่วงเวลาเดียวกันมีอะไรบนดิสก์เปลี่ยนไปอีก และมีงาน cron และคีย์ SSH ใหม่ปรากฏขึ้นหรือไม่

เรื่องผลบวกลวงขอพูดแยก ไลบรารีเทมเพลตและ JavaScript ที่ถูกย่อบางครั้งตรงกับลายเซ็น จึงเป็นเหตุให้ใช้การกักกันแทนการลบ และเป็นเหตุให้แนะนำว่าอย่าเอาชุดลายเซ็นของบุคคลที่สามทุกชุดที่หาได้มาแปะ: ความเชื่อถือในรายงานที่ครึ่งหนึ่งเป็นเสียงรบกวนจะหมดไปภายในหนึ่งสัปดาห์ และผู้คนก็เลิกอ่านมัน

คุณค่าในทางปฏิบัติของตัวสแกนอยู่ที่ผลลัพธ์ของมันสะดุดตา: การสแกนครั้งล่าสุดรันเมื่อไร ฐานข้อมูลเก่าแค่ไหน พบอะไรบ้าง นั่นคือบรรทัดเดียว แต่การไม่มีมันเปลี่ยนแอนติไวรัสที่ติดตั้งแล้วให้กลายเป็นแค่เครื่องหมายถูกในช่อง บรรทัดนั้นหน้าตาเป็นอย่างไรดูได้ที่หน้าเดโมด้านล่าง