Bagaimana sistem menemukan, memindai, menilai, dan memberi peringatan — secara otomatis, asinkron, dan modular.
REST API async + auth Cloudflare Access (JWT) di tiap route.
Antrian job & penjadwal (beat). Worker memproses scan paralel.
SQLAlchemy async + Alembic. Scan, verdict, incident, audit.
Fetch HTTP async (dual-UA) + screenshot via headless render.
Dashboard operator: status, riwayat, insiden, tuning bobot.
5 container, deploy via registry + Traefik (TLS Let's Encrypt).
structlog → Loki → dashboard. Metrik antrian tiap 30 detik.
mypy strict, ruff, pytest + testcontainers (Postgres asli).
Sumber target: Cloudflare DNS API + Certificate Transparency logs (discovery tiap 30 menit).
API, worker, dan beat berbagi image yang sama — hanya beda perintah start. Postgres & Redis sebagai infrastruktur stateful.
FastAPI/uvicorn (2 worker). Jalankan alembic upgrade head saat boot. Di-route Traefik (HTTPS).
Celery, concurrency 4. Berlangganan semua antrian tier + default. Menjalankan pipeline scan.
Penjadwal Celery. Memicu scan per-tier, discovery, escalation, digest, metrik.
PostgreSQL 16. Volume persisten. Healthcheck pg_isready.
Redis 7 (AOF). Broker antrian Celery + backend hasil + metrik.
Setiap halaman diambil dengan dua identitas sekaligus, dan jaringan diperiksa paralel — semua tanpa memberatkan situs target.
Fetch sebagai browser biasa (Chrome). Inilah yang dilihat publik.
Fetch sebagai bot Google. Perbedaan = indikasi cloaking.
Resolusi DNS, sertifikat TLS, dan ASN — dijalankan paralel dengan fetch.
Batas aman: timeout 15 dtk, maks 5 redirect, body dipotong di 5 MB — agar scan ringan & tidak mengganggu.
Tidak semua langkah dijalankan untuk semua situs. Dua gerbang memastikan kerja mahal hanya dilakukan saat perlu.
Jika situs tak terjangkau (down / error jaringan), detektor konten dilewati — percuma menganalisis halaman kosong. Severity dasar tetap ditetapkan.
skip_detectors → hemat CPU & waktuLayanan eksternal (Safe Browsing, urlscan, VirusTotal) ber-kuota terbatas. Hanya dipanggil bila verdict dasar sudah ≥ mencurigakan.
severity ≥ SUSPICIOUS → baru jalanPluggable: tambah detektor = tambah satu class. Pipeline menjalankan semuanya paralel.
● 8 detektor konten (tiap scan) · ● 3 detektor enrichment (bersyarat)
Tiap detektor memberi confidence 0–100. Sistem menghitung rata-rata berbobot → satu skor → dipetakan ke tingkat keparahan. Bobot dapat ditala operator.
Saat sebuah situs pertama kali bersih, sistem merekam "sidik jari" kondisi normalnya. Scan berikutnya membandingkan terhadap baseline ini.
DOM hash (struktur halaman), visual phash (rupa screenshot), daftar link keluar, dan profil jaringan (DNS/TLS/ASN).
Struktur DOM berubah drastis (defacement), tampilan berbeda, link baru mencurigakan, atau sertifikat/server berpindah tak wajar.
Cerdas terhadap perubahan sah. Saat sertifikat TLS diperbarui wajar (penerbit sama) dan hasil scan bersih, baseline jaringan dirotasi otomatis — mengurangi alarm palsu.
Setiap hasil scan diproses oleh IncidentDispatcher menjadi salah satu aksi berikut — dengan dedup agar tidak banjir insiden.
| Severity | Telegram | Grafana / Loki | ||
|---|---|---|---|---|
| CRITICAL | ✓ | ✓ | ✓ | ✓ |
| HIGH | ✓ | ✓ | ✓ | ✓ |
| SUSPICIOUS | — | — | ✓ | ✓ |
Hormati keputusan manusia. Klasifikasi otomatis ditandai tier_source = auto. Begitu operator mengubah tier manual, otomatisasi tidak akan menimpanya lagi.
structlog (JSON) dikirim ke Loki, divisualkan di dashboard Grafana.
Kedalaman tiap antrian Celery dipush tiap 30 detik untuk pantau beban.
API (HTTP), worker (celery ping), beat (mtime jadwal) — dicek berkala.
Mesin usulan false-positive membantu operator menekan alarm palsu.
Kasus nyata otomatis jadi PR fixture uji — mencegah regresi deteksi.
Operator menala bobot detektor, lalu uji dampaknya pada data lampau.
asyncio + Celery: ratusan situs dipindai paralel tanpa saling menunggu.
Detektor sebagai class terpisah — mudah menambah deteksi baru.
Two-stage gating: kerja mahal hanya saat benar-benar perlu.
Discovery → scan → insiden → alert, tanpa intervensi manual.
Tabalong Sentinel · dokumen teknis