BerandaSecurity Advisory
Dokumentasi Resmi

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.

Versi 1.8.0Lisensi GPL‑2.0WordPress + RESTWajib (standar institusi)
Untuk siapa dokumen ini?
Pengelola situs/aplikasi tiap unit kerja (fakultas, lembaga, UPT) yang ingin memasang perlindungan Unila Sentinel — baik situs WordPress maupun platform lain (Laravel, Node, dll) lewat kontrak API. Tidak perlu login untuk membaca panduan ini.

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.

LapisanPeran
Agent (Plugin)"Dokter di tempat" — scan, karantina, hardening pada aset itu sendiri.
Klinik FakultasPengelompokan per unit kerja (RBAC) — pantau aset di fakultasnya.
Pusat Kendali CSIRT"Rumah Sakit Rujukan" — fleet seluruh aset, Lab Spesimen, terbitkan vaksin, perintah jarak jauh.

Cara Kerja

  1. 1Scan terjadwal (harian) memindai berkas + database memakai ruleset/vaksin terbaru.
  2. 2Temuan berbahaya diisolasi ke karantina (reversibel, dengan chain‑of‑custody hash SHA‑256).
  3. 3Ringkasan + spesimen (hash‑first) dikirim ke Konsol CSIRT; temuan kritis → tiket insiden otomatis (terkorelasi per kampanye agar tidak banjir tiket).
  4. 4Agent menarik perintah dari pusat (scan/karantina/pulihkan/hapus/hardening) dan melapor hasilnya.
  5. 5Agent menarik vaksin (hash + kata kunci) untuk memperbarui deteksi tanpa update plugin.

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

unila-wp-sentinel-1.8.0.zip
Paket plugin resmi · GPL‑2.0 · siap upload ke WordPress
Unduh Plugin

Cara A — via wp‑admin (paling mudah)

  1. 1Unduh paket plugin unila-wp-sentinel.zip dari tim CSIRT / repositori TIK.
  2. 2Masuk wp‑admin → Plugins → Add New → Upload Plugin.
  3. 3Pilih berkas zip → Install NowActivate.
  4. 4Buka menu Unila Sentinel → tab Pengaturan, isi konfigurasi (di bawah).

Cara B — manual / WP‑CLI (untuk admin server)

bash
# 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 --activate
Setelah aktif
Plugin otomatis membuat tabel temuan, folder karantina, dan blokir eksekusi PHP di wp-content/uploads. Jalankan Scan Sekarang sekali untuk baseline.

Keaslian & Anti‑Tamper

Wajib diverifikasi sebelum instal
Penyerang mengincar sumber unduhan plugin keamanan — satu berkas yang diracun bisa menyusupi ratusan situs. Hanya unduh dari domain CSIRT resmi dan verifikasi keaslian paket. Jangan instal dari link tak resmi (mis. share drive yang diteruskan orang lain).

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.
  • 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)

SHA‑256 resmid93aef08a8204842fd77a1659a81ede71552bed312af2e2d36378860f65ff8be
verify-sha256
# Linux / macOS
sha256sum unila-wp-sentinel-1.8.0.zip
# Windows (PowerShell)
Get-FileHash unila-wp-sentinel-1.8.0.zip -Algorithm SHA256
# Hasilnya HARUS persis sama dengan SHA-256 resmi di atas. Jika beda → JANGAN instal.

2. Verifikasi tanda tangan Ed25519 (lanjutan)

Kunci publik CSIRTMCowBQYDK2VwAyEADOcFzW01g4FnzRAU1MN1szYR2e4xF3iueuNRbaneRCg=
verify-signature
# 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.8.0.zip.sig
openssl pkeyutl -verify -pubin -inkey csirt-pubkey.pem \
  -rawin -in unila-wp-sentinel-1.8.0.zip -sigfile unila-wp-sentinel-1.8.0.zip.sig
# Output yang benar: "Signature Verified Successfully"
Status integritas langsung
Cek https://csirt.unila.ac.id/api/download/checksum untuk SHA‑256, sidik jari, & status terkini paket di server.

Konfigurasi Agent

Menu Unila Sentinel → Pengaturan:

KolomIsi
Label aset (situs)identitas unik, mis. akuntansi.feb.unila.ac.id
URL Konsol CSIRTalamat Konsol Pusat (diberikan CSIRT)
Agent Keytoken rahasia milik aset ini (jangan dibagikan)
Auto‑karantinaMati / ≥ Kritis (disarankan) / ≥ Tinggi
Jadwal scanHarian (disarankan) / 2× sehari / tiap jam
Monitor realtimeAktif — pantau upload mencurigakan seketika
Webhook / Email alertopsional — notifikasi ke n8n/WhatsApp/email
Auto‑karantina ≥ Kritis
Aman dipakai default: judol/backdoor asli selalu terdeteksi Kritis, sedangkan false‑positive umumnya Tinggi/Rendah sehingga tidak ikut terkarantina otomatis.

Integrasi Semua Platform (non‑WordPress)

Konsep intinya: platform apa pun yang bisa melakukan HTTP request dapat menjadi agent — cukup melaporkan hasil pemeriksaan dan menarik perintah/vaksin lewat kontrak REST yang sama. Cocok untuk aplikasi Laravel/PHP, Node, Python, situs statis, atau pemindai kustom.

Contoh: lapor hasil scan (curl)

bash
curl -X POST https://csirt.unila.ac.id/api/ingest/sentinel \
  -H "Content-Type: application/json" \
  -H "X-Sentinel-Token: <AGENT_KEY>" \
  -d '{
    "site": "app.fmipa.unila.ac.id",
    "platform": "laravel",
    "unit": "FMIPA",
    "scan_id": "scan-2026-0001",
    "summary": { "critical": 0, "high": 0, "medium": 0, "low": 0 },
    "count": 0,
    "scanned": 350
  }'

Contoh: agent mini (Python)

python
import requests
KONSOL = "https://csirt.unila.ac.id"; TOKEN = "<AGENT_KEY>"; SITE = "app.fmipa.unila.ac.id"
H = {"X-Sentinel-Token": TOKEN}

# 1) lapor hasil pemeriksaan
requests.post(f"{KONSOL}/api/ingest/sentinel", headers=H, json={
    "site": SITE, "platform": "python", "unit": "FMIPA",
    "summary": {"critical": 0, "high": 0, "medium": 0, "low": 0}, "scanned": 120})

# 2) tarik vaksin (signature) + perintah dari pusat
vaksin   = requests.get(f"{KONSOL}/api/agent/vaccine", headers=H).json()
perintah = requests.get(f"{KONSOL}/api/agent/commands", params={"site": SITE}, headers=H).json()

# 3) eksekusi perintah lalu lapor hasil
for c in perintah.get("commands", []):
    ok, msg = True, "selesai"  # ... jalankan aksi sesuai c["action"]
    requests.post(f"{KONSOL}/api/agent/command-result", headers=H,
                  json={"id": c["id"], "ok": ok, "message": msg})
Pola pull (aman untuk skala)
Agent hanya butuh koneksi keluar ke konsol — tidak perlu membuka port masuk. Konsol membalas next_poll untuk mengatur ritme (hemat saat ribuan agent).

Kontrak API

Semua endpoint memakai header X-Sentinel-Token: <AGENT_KEY>.

MetodePathFungsi
POST/api/ingest/sentinelLapor hasil scan (ringkasan + temuan teratas)
POST/api/agent/alertAlert realtime (upload diblokir, admin liar, dll)
POST/api/agent/specimenKirim spesimen (hash‑first) ke Lab Pusat
GET/api/agent/vaccineTarik vaksin/signature (hash + kata kunci)
GET/api/agent/commands?site=Tarik perintah pending + next_poll
POST/api/agent/command-resultLapor hasil eksekusi perintah
POST/api/agent/quarantineKirim snapshot manifest karantina

Status Aset di Konsol

Belum Dipantau

terdaftar di inventaris, agent belum terpasang

Sehat

discan, tidak ada temuan terbuka

Tinjau

ada temuan rendah/sedang

Tinggi

ada temuan tinggi

Kritis

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)

v1.8.02026‑06‑29Mode tampilan ganda (dark & light)
  • 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.
v1.7.02026‑06‑28Pembaruan otomatis (ala repo WP) & manajemen agent
  • 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.
v1.6.02026‑06‑28Enrollment mandiri & kunci per‑agent
  • Form "Enroll ke Pusat": situs baru mendaftar dengan bootstrap key → menerima kunci agent UNIK (revocable), bukan token bersama.
  • Endpoint /api/agent/enroll; semua endpoint agent menerima token bersama (legacy) maupun kunci enrolled.
  • Setelah enroll otomatis tarik vaksin + scan baseline → aset langsung muncul di fleet.
v1.5.02026‑06‑28Anti‑tamper & keaslian rantai pasok
  • 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.
v1.4.02026‑06‑28Skala & efisiensi
  • 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).
v1.3.02026‑06‑28Akurasi & kendali
  • 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.
v1.2.02026‑06‑27Command channel
  • Perintah jarak jauh (pull): scan / karantina / pulihkan / hapus / hardening dari konsol.
  • Poller wp‑cron + pelaporan hasil perintah.
v1.1.02026‑06‑27Integrasi konsol
  • Lapor temuan & spesimen ke Konsol CSIRT (header X‑Sentinel‑Token).
  • Tarik vaksin (signature) dari pusat secara berkala.
v1.0.02026‑06‑27Rilis awal — 3 fase
  • 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.

Catatan distribusi
URL Konsol final & paket plugin resmi disalurkan melalui kanal internal TIK agar Agent Key tetap rahasia. Dokumen ini bersifat publik sebagai panduan umum.