Unila Sentinel
Sistem "kesehatan siber" berlapis untuk seluruh aset web Universitas Lampung — deteksi, mitigasi, dan investigasi malware (judol/cloaking, backdoor/web‑shell) secara terpusat di bawah CSIRT UNILA.
- Deteksi konten sisipan tersembunyi (di luar layar, tinggi nol, display:none) di artikel, revisi, pengaturan tema/footer, widget, dan data page-builder.
- "Tandai aman" kini wajib beralasan, berlaku 90 hari, dan batal otomatis bila isi berubah — tidak bisa lagi menyembunyikan infeksi yang bertambah.
- Pemeriksaan versi inti, plugin, dan tema terhadap rilis resmi wordpress.org (istilah sama dengan pemantauan luar UPA TIK).
- Hardening yang jujur: menyebut penyebab bila gagal (izin/pemilik folder, server Nginx), menguji efektivitasnya, dan memberi perintah manual siap salin.
- Agen memverifikasi sendiri tanda tangan setiap paket pembaruan dan perintah konsol; vaksin tetap mengalir walau situs belum terdaftar.
- v1.11.1 (dari respons insiden nyata): pintu belakang cookie dan pemuat jarak jauh kini terdeteksi, root situs dan folder karantina ikut diperiksa, dan scan terjadwal selalu tuntas di situs besar.
- v1.11.2: email peringatan menjelaskan setiap temuan — artinya, apa yang perlu dilakukan, dan mana yang baru — dalam bahasa pengelola situs.
- v1.12.0: peristiwa percobaan masuk menyebut alamat pelaku yang sebenarnya (juga di belakang Cloudflare/Traefik), jumlah, nama yang dicoba, dan mitigasi yang sudah berjalan; tersedia peredam login bawaan serta pengaturan jeda, jam tenang, dan ringkasan harian.
- BARU (v1.10): Verifikasi KNOWN-GOOD — seluruh berkas inti WordPress dicocokkan dengan checksum resmi wordpress.org; yang menyimpang dapat DIPULIHKAN otomatis dari sumber resmi (berkas lama diarsip sebagai bukti).
- BARU: Model RS Pusat–Poliklinik — operator unit/fakultas (role PIC) login SSO & memantau aset unitnya sendiri; temuan kritis otomatis tereskalasi ke CSIRT pusat.
- Rantai pasok tepercaya: manifest rilis, SBOM, endpoint tanda tangan, & daftar cabut (revocation) — verifikasi keaslian paket makin kuat.
- Pengerasan kanal perintah: setiap perintah kini berkadaluarsa, ber-nonce, & ditandatangani server; aksi destruktif butuh persetujuan dua-pihak.
- Pemantauan: skor kesehatan aset (0–100), deteksi agent offline, & kolom Integritas Inti di fleet.
- Kepercayaan publik: berkas security.txt (RFC 9116) & halaman kunci publik CSIRT.
Ringkasan
Unila Sentinel adalah agen keamanan yang dipasang pada tiap aset web. Ia memindai berkas & database untuk pola berbahaya (doorway judol/cloaking, backdoor & web‑shell, injeksi konten, akun admin liar), mengisolasi temuan secara reversibel ke karantina, mengeraskan titik lemah (mis. blokir eksekusi PHP di folder unggahan), lalu melapor ke Konsol Pusat CSIRT dan menarik "vaksin" (signature terbaru) secara berkala.
- Deteksi: judol/cloaking doorway, backdoor eval/exec, web‑shell, injeksi DB, admin baru mencurigakan.
- Mitigasi: auto‑karantina (reversibel) + hardening folder unggahan.
- Pelaporan: temuan & spesimen dikirim ke Konsol CSIRT; insiden kritis otomatis jadi tiket.
- Kendali jarak jauh: tim CSIRT bisa memicu scan / karantina / pulihkan dari pusat.
Arsitektur Berlapis (analogi rumah sakit)
Model berlapis seperti sistem kesehatan: pasien dirawat sedekat mungkin dengan lokasinya, kasus berat dirujuk ke pusat.
| Lapisan | Peran |
|---|---|
| Agent (Plugin) | "Dokter di tempat" — scan, karantina, hardening pada aset itu sendiri. |
| Poliklinik Fakultas/Unit | Rujukan pertama: operator unit (role PIC, login SSO Unila) memantau rekam medis aset unitnya sendiri; kasus berat otomatis dirujuk (eskalasi) ke pusat. |
| Pusat Kendali CSIRT | "Rumah Sakit Rujukan" — fleet seluruh aset, Lab Spesimen, terbitkan vaksin, perintah jarak jauh. |
Cara Kerja
- 1Scan terjadwal (harian) memindai berkas + database memakai ruleset/vaksin terbaru.
- 2Temuan berbahaya diisolasi ke karantina (reversibel, dengan chain‑of‑custody hash SHA‑256).
- 3Ringkasan + spesimen (hash‑first) dikirim ke Konsol CSIRT; temuan kritis → tiket insiden otomatis (terkorelasi per kampanye agar tidak banjir tiket).
- 4Agent menarik perintah dari pusat (scan/karantina/pulihkan/hapus/hardening) dan melapor hasilnya.
- 5Agent menarik vaksin (hash + kata kunci) untuk memperbarui deteksi tanpa update plugin.
Known‑Good & Pemulihan Inti (v1.10)
Paradigma terbalik: deteksi berbasis signature mencari pola "jahat" yang sudah dikenal — malware jenis baru bisa lolos. Verifikasi known‑good bekerja sebaliknya: setiap berkas inti WordPress dicocokkan dengan checksum resmi wordpress.org untuk versi yang terpasang, lalu semua yang menyimpang dari asli ditandai — apa pun jenis malware-nya, dikenal atau belum.
| Kategori | Arti | Tindakan |
|---|---|---|
| Berubah | isi berkas inti ≠ rilis resmi (indikasi injeksi/backdoor) | Pulihkan otomatis dari sumber resmi |
| Asing | berkas yang BUKAN bagian WordPress berada di direktori inti (lokasi favorit backdoor) | tinjau → karantina |
| Hilang | berkas inti resmi tidak ditemukan | Pulihkan otomatis |
Pemulihan inti satu-klik — aman berlapis:
- Berkas asli diunduh dari sumber resmi WordPress; md5 unduhan WAJIB cocok dengan manifest resmi sebelum ditulis (proteksi anti-korupsi/MITM).
- Berkas lama TIDAK dibuang — diarsip ke karantina (chain-of-custody, bukti forensik, dapat dikembalikan).
- Hanya berkas yang terdaftar di manifest resmi yang dapat dipulihkan (tidak bisa dipakai menulis path lain).
- Verifikasi berjalan otomatis harian; juga tersedia di menu plugin (Integritas Inti) dan dari Konsol CSIRT (perintah jarak jauh dengan persetujuan dua-pihak).
- Plugin dari repo wordpress.org juga diverifikasi checksum-nya (report-only).
Prasyarat
- WordPress 5.6+ dengan PHP 7.4+ (disarankan PHP 8.x).
- Akses Administrator ke wp‑admin situs.
- Server bisa melakukan koneksi keluar (outbound HTTPS) ke Konsol CSIRT.
- URL Konsol CSIRT + Agent Key — diminta ke tim CSIRT UNILA (lihat Dukungan).
Instalasi Plugin WordPress
Cara A — via wp‑admin (paling mudah)
- 1Unduh paket plugin unila-wp-sentinel.zip dari tim CSIRT / repositori TIK.
- 2Masuk wp‑admin → Plugins → Add New → Upload Plugin.
- 3Pilih berkas zip → Install Now → Activate.
- 4Buka menu Unila Sentinel → tab Pengaturan, isi konfigurasi (URL Konsol + Agent Key dari CSIRT).
Cara B — manual / WP‑CLI (untuk admin server)
# Manual: salin ke folder plugin lalu aktifkan
cd /path/ke/wordpress/wp-content/plugins
unzip unila-wp-sentinel.zip
wp plugin activate unila-wp-sentinel
# Atau langsung dari berkas zip
wp plugin install ./unila-wp-sentinel.zip --activatewp-content/uploads. Jalankan Scan Sekarang sekali untuk baseline.Keaslian & Anti‑Tamper
Lapisan pengaman otomatis yang sudah berjalan:
- Gerbang unduhan memverifikasi SHA‑256 paket di server SEBELUM melayani — bila isi berubah, unduhan ditolak & CSIRT mendapat alarm seketika.
- Paket ditandatangani kriptografis (Ed25519) — modifikasi apa pun membatalkan tanda tangan.
- Sejak v1.11, agen memverifikasi sendiri SHA‑256 & tanda tangan Ed25519 setiap paket pembaruan dengan kunci publik yang tertanam di plugin SEBELUM memasangnya — paket tidak sah ditolak & dilaporkan ke CSIRT.
- Konsol hanya mengumumkan pembaruan ke agen bila tanda tangan rilis sudah terbit dan sah. Agen v1.10 ke bawah belum memverifikasi paket sendiri — untuk situs tersebut, perbarui secara manual setelah memverifikasi SHA‑256 & tanda tangan di bawah.
- Plugin memeriksa integritas berkasnya sendiri saat aktivasi & tiap scan — bila kode dimodifikasi di situs, ia melapor ke CSIRT (situs mana, berkas apa).
- Setiap unduhan dicatat (audit) & konsol memantau sidik jari kode tiap agent.
1. Verifikasi SHA‑256 (wajib, mudah)
b8bed9a770ed93a60b5c047b1341141a73be58b78030cf5566d1aa1f525306fe# Linux / macOS
sha256sum unila-wp-sentinel-1.17.0.zip
# Windows (PowerShell)
Get-FileHash unila-wp-sentinel-1.17.0.zip -Algorithm SHA256
# Hasilnya HARUS persis sama dengan SHA-256 resmi di atas. Jika beda → JANGAN instal.2. Verifikasi tanda tangan Ed25519 (lanjutan)
MCowBQYDK2VwAyEAZQhzWIQ/99KumDtc1flJPJVjG5y7B+juril+LrxYmGY=# Simpan kunci publik CSIRT ke csirt-pubkey.pem, lalu:
curl -s "https://csirt.unila.ac.id/api/download/plugin?part=sig" -o unila-wp-sentinel-1.17.0.zip.sig
openssl pkeyutl -verify -pubin -inkey csirt-pubkey.pem \
-rawin -in unila-wp-sentinel-1.17.0.zip -sigfile unila-wp-sentinel-1.17.0.zip.sig
# Output yang benar: "Signature Verified Successfully"https://csirt.unila.ac.id/api/download/checksum untuk SHA‑256, sidik jari, & status terkini paket di server.3. Tata kelola rantai pasok (rilis tepercaya)
Endpoint publik untuk verifikasi & audit distribusi paket:
| Endpoint | Isi |
|---|---|
| /api/download/manifest | metadata rilis: versi, kanal, sha256, sidik jari, kompatibilitas, rollback |
| /api/download/signature | tanda tangan Ed25519 (.sig) paket |
| /api/download/sbom | SBOM (CycloneDX) komponen paket |
| /api/download/revoked | daftar cabut — versi yang tak boleh dipakai lagi |
Detail Integrasi (Area Internal)
Untuk mengurangi paparan informasi operasional ke publik, kontrak API lengkap, contoh payload, konfigurasi agent, dan SOP kunci/rollback/penghentian darurat dipindahkan ke area terautentikasi. Materi ini hanya diperlukan oleh staf yang mengintegrasikan atau mengoperasikan agent.
Kontrak REST (X‑Sentinel‑Token), contoh curl/Python, tabel pengaturan agent, dan prosedur cabut/rotasi kunci & rollback.
Buka Runbook (perlu login)Status Aset di Konsol
terdaftar di inventaris, agent belum terpasang
discan, tidak ada temuan terbuka
ada temuan rendah/sedang
ada temuan tinggi
ada temuan kritis — segera tindak
Saat agent dipasang & melapor pertama kali, status otomatis berubah dari Belum Dipantau ke kondisi nyata.
Keamanan & Privasi
- Karantina bersifat reversibel (bisa dipulihkan) — bukan hapus permanen tanpa konfirmasi.
- Spesimen dikirim hash‑first; berkas penuh hanya bila Lab Pusat memintanya.
- Setiap aset memakai Agent Key sendiri (dapat dicabut tanpa mengganggu aset lain).
- Data PII penanggung jawab (PIC) tidak ikut tersebar ke konsol — tetap di sumber dengan masking per‑role.
- Token tidak pernah ditampilkan utuh di antarmuka (mis. sk-••••last4).
Log Pengembangan (Changelog)
- Versi PHP yang rentan dikenali: ambang aman per cabang ditanam di plugin, sehingga situs yang belum terdaftar di Konsol pun ikut terlindungi dari PHP2Shell.
- Paket distribusi tidak dituduh Kritis — distro menambal tanpa menaikkan nomor versi, jadi temuannya meminta konfirmasi kepada pengelola server.
- Setelan session.upload_progress dibaca langsung dan dilaporkan bila masih menyala.
- Agen melaporkan versi PHP ke Konsol, dasar inventaris untuk setiap celah PHP berikutnya.
- Berkas kosong tidak lagi luput di folder unggahan, dan tidak lagi otomatis Kritis di direktori inti.
- Sisipan JavaScript ter-obfuskasi di basis data tertangkap meski tidak memuat satu pun kata judi — celah yang membuat pemuat spam di bak.unila.ac.id lolos sepenuhnya.
- Muatan tersandi dibuka sebelum dinilai: shortcode [vc_raw_html] dan [vc_raw_js] berisi base64, serta muatan base64 yang berdiri sendiri.
- Skrip dan iframe ke domain asing dikenali, dengan daftar host tepercaya yang pendek agar pemasangan yang sah tidak tertuduh.
- Satu penanda kuat cukup untuk memvonis; penanda lemah yang masih lazim pada kode sah tetap menuntut penanda kedua.
- Keaslian terhadap rilis resmi wordpress.org dinilai untuk seluruh aturan berbasis pola; berkas yang identik turun satu tingkat, yang berbeda dari rilis resmi tetap naik ke Kritis.
- create_function() dipisah dan tidak lagi otomatis Kritis — fungsi itu dihapus sejak PHP 8.0 sehingga baris tersebut kode mati di situs PHP 8+.
- Rilis baru terlihat agen dalam hitungan menit: cache manifest 1 jam dan dibuang begitu konsol mengumumkan versi lebih baru.
- Keputusan mengirim surel memakai temuan BARU, bukan seluruh temuan terbuka; sebelumnya satu temuan yang belum ditutup membuat surel "TINDAKAN SEGERA" terkirim setiap pindai terjadwal tanpa batas.
- Tanpa temuan baru, Sentinel mengirim satu pengingat bertingkat Rendah tiap beberapa hari (bawaan 7, dapat diatur). Pindai manual selalu melaporkan.
- Judul membedakan temuan baru dari temuan yang masih terbuka, dan "situs kemungkinan sudah disusupi" tidak lagi dipakai untuk temuan yang sudah dilaporkan.
- Nama web shell yang dikenal harus berdiri sebagai kata utuh; pola lama cocok dengan variabel PHP biasa $filesManager sehingga berkas RESMI WP Staging dilaporkan Kritis. Web shell sungguhan tetap tertangkap dan tetap Kritis.
- Keaslian berkas dicocokkan dengan manifes rilis resmi wordpress.org: identik dengan rilis resmi menurunkan temuan berbasis pola, sedangkan ada di rilis resmi tetapi isinya berbeda dinaikkan ke Kritis — deteksi baru untuk berkas plugin yang disusupi.
- Tanda berbasis pola menuntut bukti jalur masukan, dan setiap temuan menyebut nomor baris serta potongan teks pemicunya.
- Aturan baru: PHP menyamar sebagai gambar (Kritis) dan edisi gratis + Pro aktif bersamaan (Sedang). Surel peringatan lebar penuh dan berlogo CSIRT.
- Alamat pelaku ditentukan benar di pemasangan berlapis proxy; bila tidak dapat ditentukan, dinyatakan apa adanya dan diuji sendiri lewat kartu "Alamat pengunjung" di Dashboard.
- Peristiwa percobaan masuk memuat jumlah, rentang waktu, nama yang dicoba beserta status akunnya, login berhasil, dan mitigasi; tingkat mengikuti sasaran hingga Kritis.
- Peredam login bawaan (opsional, bawaan mati), kebijakan pemberitahuan (tingkat minimum, jeda, jam tenang, ringkasan harian), dan perbaikan tampilan surel untuk mode gelap.
- Email peringatan berformat HTML (plus teks polos): situs, jumlah, penilaian, waktu WIB, pemicu, lalu temuan dikelompokkan per jenis dengan "Artinya" dan "Yang perlu dilakukan".
- Temuan baru ditandai; URL dan domain di bukti dijinakkan; pesan webhook memakai judul temuan, bukan kode aturan.
- Tombol "Kirim email uji" dan dukungan beberapa penerima di Pengaturan; penjaga folder WPForms tidak lagi tertuduh.
- Pintu belakang cookie dan loader yang memanggil nama fungsi dari input kini selalu diperiksa (superglobal_call kritis, superglobal_varfunc tinggi), ditambah deteksi pemuat kode jarak jauh; hash tujuh keluarga pintu belakang dari insiden simanila ditanam.
- Pengecualian pemindai terikat lokasi dan bukti: folder bernama vendor, wflogs, atau unila-wp-sentinel tidak lagi menjadi tempat sembunyi.
- Integritas Inti memeriksa root situs (PHP asing sejajar wp-config.php) dan auto_prepend_file di .user.ini/php.ini; WAF Wordfence resmi dan wp-config-docker.php dikecualikan.
- PHP asing di folder karantina Sentinel ditandai kritis; pengecualian "index.php aman" dipersempit.
- Scan terjadwal berjalan bertahap lewat WP-Cron hingga selesai, termasuk di situs besar dan sepi pengunjung.
- Divalidasi pada data nyata: 22/22 sampel asli terdeteksi, 0 salah tuduh di 27.713 berkas PHP situs produksi.
- Deteksi konten sisipan tersembunyi (hidden_judol kritis) di artikel, revisi, opsi tema/footer (termasuk td_*), widget, dan data page-builder — pengecualian opsi tema dan "Bandar Lampung" dihapus.
- Tanda aman v2: wajib alasan untuk temuan Tinggi/Kritis, terikat sidik isi, berlaku 90 hari, tercatat pelaku, dapat dicabut, dan dilaporkan ke konsol.
- Pemeriksaan versi inti/plugin/tema vs wordpress.org: inti_usang_mayor/minor, komponen_rentan, komponen_terbengkalai.
- Hardening jujur: status belum/gagal/tidak berlaku beserta sebabnya, uji efektivitas HTTP, perintah manual, sakelar XML-RPC & pendataan akun.
- Rantai kepercayaan: paket pembaruan dan perintah konsol diverifikasi Ed25519 oleh agen; vaksin publik untuk agen yang belum terdaftar; status pelaporan tampil di dasbor.
- Verifikasi KNOWN-GOOD: seluruh berkas inti WP dicocokkan dengan checksum resmi wordpress.org — berkas berubah/asing/hilang ditandai (tahan malware jenis baru apa pun), berjalan otomatis harian.
- Pemulihan inti satu-klik: unduh berkas asli dari sumber resmi (md5 diverifikasi sebelum ditulis), berkas lama diarsip ke karantina (bukti forensik). Menu baru "Integritas Inti" di plugin.
- Verifikasi checksum plugin repo wordpress.org (report-only) + perintah jarak jauh core_verify/core_repair dari Konsol (persetujuan dua-pihak).
- Konsol: model RS Pusat–Poliklinik — operator unit (role PIC) melihat aset unitnya sendiri; kolom Integritas Inti di fleet.
- Halaman admin plugin kini anti-cache (nonce selalu segar — perbaikan scan macet "0 berkas" di situs ber-LiteSpeed).
- Checkpoint scan lebih rapat (1,5 dtk + checkpoint dini) — tahan host yang memutus request sangat cepat.
- Scan berjalan bertahap (resumable) dengan checkpoint — tidak lagi terputus batas waktu server pada situs besar (50 ribu+ berkas); browser melanjutkan otomatis dari titik terakhir.
- Respons proses dibersihkan dari output tema/plugin "berisik" (JSON anti-cemar).
- Antarmuka admin plugin mendukung dual‑view: mode gelap (default) & terang, dengan tombol toggle ☀/🌙 di header.
- Preferensi tema tersimpan per‑pengguna (anti‑kedip, dirender server‑side) dan mengikuti preferensi sistem saat pertama kali.
- Plugin terpasang otomatis mendeteksi versi baru dari konsol → notifikasi "Update tersedia" + changelog di halaman Plugins, update sekali‑klik (paket terverifikasi integritas).
- Konsol: panel manajemen agent — daftar situs enrolled + tombol Cabut kunci.
- Form "Enroll ke Pusat": situs baru mendaftar dengan bootstrap key → menerima kunci agent UNIK (revocable), bukan token bersama.
- Endpoint enrollment; endpoint agent menerima kunci enrolled (token bersama lama dimatikan bawaan sejak September 2026).
- Setelah enroll otomatis tarik vaksin + scan baseline → aset langsung muncul di fleet.
- Paket ditandatangani Ed25519 + checksum SHA‑256 publik; unduhan lewat gerbang yang memverifikasi integritas (tolak + alarm bila berkas di server diubah).
- Self‑integrity plugin: manifest hash per‑berkas + cek otomatis saat aktivasi/scan → lapor SITUS yang kodenya dimodifikasi.
- Sidik jari kode dikirim pada tiap laporan; konsol menandai agent dengan plugin tak resmi.
- Audit unduhan (IP/klien) + panel "Integritas & Distribusi" + heartbeat pemantau drift.
- Poll adaptif (read‑before‑claim + next_poll idle/aktif) — hemat beban di ribuan agent.
- Korelasi kampanye di pusat: 1 signature menjangkiti banyak aset = 1 tiket (anti badai tiket).
- Dashboard pusat: agregat per‑fakultas, paginasi & filter, status inventaris "Belum Dipantau".
- Jembatan aman Webometrics → fleet (inventaris non‑PII).
- Allowlist false‑positive ("Tandai Aman") — dismissal menempel lintas‑scan.
- Kecualikan opsi tema/page‑builder (td_*) dari heuristik; supersede temuan lama (anti‑duplikat).
- Pulihkan/Hapus karantina langsung dari dashboard pusat.
- Perintah jarak jauh (pull): scan / karantina / pulihkan / hapus / hardening dari konsol.
- Poller wp‑cron + pelaporan hasil perintah.
- Lapor temuan & spesimen ke Konsol CSIRT (header X‑Sentinel‑Token).
- Tarik vaksin (signature) dari pusat secara berkala.
- Fase 1: scan (judol/cloaking, backdoor/web‑shell, injeksi DB, admin liar) + karantina reversibel + hardening + laporan CSIRT (PDF).
- Fase 2: monitor realtime + alert (webhook/email).
- Fase 3: fondasi konsol terpusat (fleet).
Dukungan & Kontak
Untuk meminta Agent Key, paket plugin, atau bantuan integrasi platform lain, hubungi CSIRT / UPA TIK Universitas Lampung.