«Di Linux tidak perlu antivirus» adalah pendapat yang tersebar luas, dan dalam bentuk aslinya ia benar: virus yang menginfeksi berkas sistem Linux nyaris tidak ada. ClamAV di server punya tugas lain, dan tugas itu dirumuskan begini: temukan apa yang diunggah lewat situs Anda. Terutama web shell.

Apa persisnya yang kita cari

Web shell adalah berkas PHP kecil yang memungkinkan menjalankan perintah lewat peramban. Ia datang lewat formulir unggah, lewat plugin yang rentan atau lewat kata sandi administrator yang berhasil ditebak, lalu duduk di antara gambar-gambar di direktori unggahan dan hidup di sana berbulan-bulan. Baik firewall maupun Fail2ban tidak akan melihatnya: permintaan kepadanya terlihat seperti permintaan biasa ke situs.

Selain itu ClamAV juga menemukan:

  • berkas berbahaya yang diunggah pengguna dan disajikan lebih lanjut dari server Anda — surat dari penyedia biasanya soal ini;
  • lampiran surat, kalau server menangani surat;
  • malware Windows di penyimpanan berkas — servernya sendiri tidak peduli, tetapi karyawan yang mengunduh berkas itu akan menderita.

Soal batasannya langsung saja: ClamAV tidak mencegah pembobolan dan tidak mendeteksinya sendiri. Ia mendeteksi jejak. Sebuah pintu belakang halus yang ditambahkan di ujung berkas tema yang sudah ada akan lolos dari pemindai tanda tangan — untuk itulah ada pemantauan integritas berkas.

Pemasangan dan satu-satunya pengaturan yang berarti

sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam

Perintah kedua lebih penting daripada yang pertama. freshclam adalah layanan pembaruan tanda tangan, dan kalau ia tidak berjalan maka ClamAV menjadi tak berguna sambil tetap melaporkan pemindaian yang berhasil. Periksa umur basis datanya begini:

sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam

Basis data yang lebih tua dari sepekan berarti mekanismenya rusak. Penyebab yang sering adalah koneksi keluar yang diblokir, atau freshclam yang dijalankan dengan tangan sebagai root, setelah itu layanannya tidak bisa menulis ke berkasnya sendiri karena hak akses.

Memori: daemon atau jalan sekali

Ada dua cara memakainya, dan pilihannya harus disadari.

clamd adalah daemon yang berjalan terus dan menyimpan basis data di memori. Ia menjawab cepat tetapi memakan sekitar satu gigabita RAM. Pada VPS dengan satu dua gigabita itu tidak dapat diterima: daemon akan mendesak keluar basis data dan PHP-FPM, dan server mulai merangkak tanpa sebab yang terlihat. Didiagnosis dengan free -m dan dari swap yang aktif.

Alternatifnya adalah clamscan terjadwal. Ia lebih lambat (memuat basis data setiap kali berjalan, sekitar semenit) tetapi hanya bekerja selama pemindaian:

sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www

Bendera -i hanya mencetak apa yang ditemukan; kalau tidak, keluarannya mencapai ratusan ribu baris.

Pindai direktori, bukan disk

Pemindaian seluruh disk pada server yang lemah memakan berjam-jam dan menciptakan beban, karena itu ia dijadwalkan malam hari lalu dimatikan sama sekali. Lebih praktis memindai apa yang benar-benar berubah dari luar:

0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads

Pada baris itu ada tiga hal yang penting. ionice dan nice menghilangkan dampak terhadap situs. Pakai --move alih-alih --remove — berkasnya masuk karantina alih-alih dihapus: positif palsu itu terjadi, dan berkas pelanggan yang terhapus keliru tidak bisa dipulihkan dari mana pun. Dan direktori yang dipindai adalah tempat berkas diunggah, bukan akarnya.

Tanda tangan untuk web shell

Basis data standar ClamAV lemah terhadap pintu belakang PHP — mereka terutama diarahkan ke lalu lintas surat. Linux Malware Detect (maldet) jauh lebih baik di sini: ia punya himpunan tanda tangan sendiri yang dibangun persis di sekitar web shell, dan ia memindai dengan mesin ClamAV kalau ClamAV terpasang. Kombinasi yang biasa dipakai: ClamAV sebagai mesin dan basis data yang bisa diperbarui, maldet sebagai sumber tanda tangan khusus.

Apa yang harus dilakukan dengan temuan

Web shell yang ditemukan bukanlah akhir penyelidikan melainkan awalnya. Sebuah berkas di direktori unggahan berarti ada yang bisa menulis di sana, dan menghapus berkas itu tidak menghilangkan kemampuan tersebut.

  1. Jangan langsung menghapusnya — simpan salinannya dan catat waktu berkas itu diubah.
  2. Dengan waktu itu carilah di log server web permintaan mana yang menaruhnya di sana. Itulah kerentanannya.
  3. Carilah tetangganya: pintu belakang hampir tidak pernah ditinggalkan dalam satu salinan saja.
  4. Periksa apa lagi yang berubah di disk pada periode yang sama, dan apakah muncul tugas cron serta kunci SSH baru.

Soal positif palsu perlu dibahas terpisah. Pustaka templat dan JavaScript yang diperkecil kadang cocok dengan tanda tangan. Karena itulah dipakai karantina alih-alih penghapusan, dan karena itu pula ada saran agar jangan menempelkan setiap himpunan tanda tangan pihak ketiga yang bisa ditemukan: kepercayaan pada laporan yang separuh barisnya kebisingan akan hilang dalam sepekan, dan orang berhenti membacanya.

Nilai praktis sebuah pemindai terletak pada hasilnya yang menyentak mata: pemindaian terakhir berjalan kapan, basis datanya seberapa tua, apa yang ditemukan. Itu satu baris, tetapi ketiadaannya mengubah antivirus yang sudah terpasang menjadi sekadar centang di kotak. Bagaimana baris itu tampak — lihat di halaman demo di bawah.