Panduan gratis SSem SecuMon

Mulai dari satu server pribadi · per Oktober 2026

Segera hadirPaket instalasi sedang dipersiapkan.

Panduan ini lebih dulu memuat persiapan, urutan instalasi, dan hal yang perlu diketahui saat mengoperasikannya. Begitu distribusi dimulai, alamat unduhannya akan dicantumkan di sini.

1. Persiapan

ApaSyarat
Server yang dilindungiLinux (systemd) + fail2ban · nftables · sqlite3. amd64 atau arm64. Sudah diuji di Ubuntu 22.04 · CentOS 8.
Server konsol1 server. JDK 21 · Tomcat 11 · PostgreSQL 17. Paling mudah dijalankan dengan Docker.
JaringanServer-server harus bisa mengakses alamat konsol lewat HTTPS. Tidak perlu port masuk ke server. Konsol sebaiknya ditempatkan di balik VPN atau jaringan internal.
JamSinkronkan jam semua server dan konsol dengan NTP. Jika waktu tanda tangan meleset lebih dari 60 detik, permintaan ditolak.
SertifikatSertifikat HTTPS untuk konsol (mis. Let's Encrypt). Cookie login hanya dikirim lewat HTTPS, jadi Anda tidak bisa login lewat HTTP biasa.

Pasang paket-paket ini terlebih dahulu di setiap server yang dilindungi.

# Debian · Ubuntu
apt-get update && apt-get install -y fail2ban nftables sqlite3
# RHEL · Rocky · CentOS
dnf install -y epel-release && dnf install -y fail2ban nftables sqlite
systemctl enable --now fail2ban

2. Aktifkan ban eksponensial fail2ban

Atur agar IP yang sama diblokir makin lama setiap kali kembali. SecuMon memakai pengali ini untuk menghitung “level saat ini” dan “berapa lama blokir berikutnya”.

# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
bantime.increment   = true
bantime.multipliers = 1 2 4 8 16 32 64 168
bantime.maxtime     = 168h
ignoreip = 127.0.0.1/8 ::1 <rentang VPN Anda>

# /etc/fail2ban/fail2ban.local — simpan riwayat residivis 60 hari (bawaan 1 hari: sehari kemudian dianggap pelanggar baru lagi)
[DEFINITION]
dbpurgeage = 60d

Dengan pengaturan di atas, durasi ban menjadi seperti berikut. fail2ban menambahkan sedikit waktu acak, jadi nilai sebenarnya sedikit berbeda.

Ban kumulatif1 kali2 kali3 kali4 kali5 kali6 kali7 kali8 kali atau lebih
Durasi ban1 jam2 jam4 jam8 jam16 jam32 jam64 jam7 hari

Pastikan jalur akses Anda (mis. rentang VPN) dimasukkan ke ignoreip. Ini mencegah Anda terkena ban di server sendiri hanya karena beberapa kali salah memasukkan kata sandi.

3. Instalasi konsol

3-1. File rahasia

Nilai rahasia tidak ditulis di kode atau variabel lingkungan, melainkan disimpan sebagai file dalam satu folder. Kontainer konsol memasang folder ini di /App/secrets sebagai hanya-baca.

mkdir -p /srv/secumon/secrets/tls && chmod 700 /srv/secumon
cd /srv/secumon/secrets
openssl rand -hex 24 > db_password
openssl rand -base64 18 > admin_password      # Kata sandi login pertama (nama akun admin)
openssl genpkey -algorithm ed25519 -out console_ed25519.key
openssl pkey -in console_ed25519.key -pubout -out console_ed25519.key.pub
# File dibuat 644 agar bisa dibaca akun kontainer — perlindungan ditangani folder induk 700
chmod 644 db_password admin_password console_ed25519.key console_ed25519.key.pub
FileKegunaanJika tidak ada
db_passwordAkses basis dataKonsol tidak bisa berjalan
admin_passwordKata sandi akun administrator pertama adminAkun tidak dibuat sehingga tidak bisa login
console_ed25519.key · .pubTanda tangan perintahHanya bisa melihat, tidak bisa melakukan penegakan
abuseipdb.keyKunci API AbuseIPDB (opsional)Laporan · cek reputasi tidak bisa dipakai
telegram.envNotifikasi Telegram (opsional)Notifikasi tidak terkirim
tls/cert.pem · chain.pem · privkey.pemSertifikat HTTPS konsolTidak bisa dibuka lewat HTTPS

Hanya dengan console_ed25519.key, perintah yang sah untuk semua server bisa ditandatangani. Jangan simpan file ini di repositori · drive bersama; simpan secara terpisah.

3-2. Basis data

Port DB tidak dibuka ke luar. Konsol mengaksesnya dengan nama kontainer di dalam jaringan Docker yang sama.

docker network create secumon-net
docker run -d --name secumon-db --network secumon-net --restart unless-stopped \
  -e POSTGRES_DB=secumon -e POSTGRES_USER=secumon \
  -e POSTGRES_PASSWORD_FILE=/run/secrets/db_password \
  -v /srv/secumon/secrets/db_password:/run/secrets/db_password:ro \
  -v secumon_pgdata:/var/lib/postgresql/data \
  postgres:17

Tabel dan data dasar dibuat sendiri oleh konsol saat pertama kali berjalan. Tidak perlu memasukkan skema secara terpisah dengan psql.

3-3. Pengaturan konsol

Konsol adalah aplikasi web yang berjalan di atas Tomcat 11. Cara menjalankannya akan diumumkan bersama paket distribusi; di sini kami rangkum dulu variabel lingkungan yang perlu ditetapkan.

Variabel lingkunganNilai bawaanArti
F2B_DB_URLjdbc:postgresql://…:5432/secumonAlamat DB. Tulis dengan nama kontainer.
F2B_CANONICAL_HOSTWajib diisi nilai AndaDomain konsol Anda. Akses lewat HTTP biasa atau alamat lain dialihkan ke HTTPS alamat ini.
F2B_PROTECTED_CIDRSWajib diisi nilai AndaRentang yang tidak akan pernah diblokir — VPN Anda · jaringan internal · IP publik server. Jaringan privat · loopback selalu dilindungi, terlepas dari nilai ini.
F2B_BLOCK_TTL_DAYS30Durasi bawaan blokir rentang IP (hari). 0 berarti permanen.
F2B_AUTO_BLOCK_ENABLEDtrueMengaktifkan atau menonaktifkan blokir otomatis IP residivis.
F2B_AUTO_BLOCK_THRESHOLD3Mulai ban keberapa blokir otomatis diterapkan.
F2B_AUTO_BLOCK_TTL_DAYS30Durasi blokir otomatis (hari).
F2B_FEED_REFRESH_HOURS24Interval mengunduh ulang daftar blokir publik · daftar negara (jam).
F2B_BAN_MULTIPLIERS1 2 4 8 16 32 64 168Samakan persis dengan pengali di pengaturan jail.
F2B_ABUSE_DAILY_LIMIT1000Batas pemakaian harian AbuseIPDB.

Setelah berjalan, periksa statusnya. Jika muncul "db":"ok", berarti normal.

curl -s https://<alamat konsol>/api/health

4. Mendaftarkan server — agen

  1. Login ke konsol sebagai admin, masukkan nama server di tab Target, lalu klik Daftarkan + terbitkan token.
  2. Layar menampilkan ID target dan token sekali pakai. Token hanya ditampilkan sekali saat itu dan kedaluwarsa setelah 15 menit.
  3. Jalankan skrip instalasi sebagai root di server yang dilindungi.
# Di server yang dilindungi (root)
tar xzf agent-amd64.tgz && cd agent
./install-agent.sh --console https://<alamat konsol> \
    --target-id <ID target> --token <token sekali pakai>
journalctl -u secumon-agent -f      # Normal jika dalam 30 detik muncul baris seperti di bawah

Jika berjalan normal, akan muncul baris seperti ini secumon-agent: 2026/10/06 16:40:12 전송 완료 — jail 2개, 밴 5건

Inilah semua yang dilakukan skrip instalasi. Port firewall tidak dibuka.

  • Membuat akun khusus f2bagent yang tidak bisa dipakai login — agen tidak berjalan sebagai root.
  • Hanya mengizinkan satu wrapper berhak root, /usr/local/sbin/f2b-agent-exec, lewat sudo.
  • Membuat kunci tanda tangan agen di server itu sendiri. Kunci privat tidak pernah keluar ke jaringan.
  • Setelah mendaftar ke konsol, agen dijalankan terus-menerus sebagai layanan secumon-agent.

Jangan memakai nama host yang mengandung garis bawah (_) untuk alamat konsol. Tomcat 11 menolaknya karena melanggar standar. Periksa dulu dengan getent hosts <domain konsol> apakah server bisa me-resolve domain konsol.

Jika pendaftaran sudah selesai tetapi langkah sesudahnya gagal, perbaiki penyebabnya lalu jalankan perintah yang sama persis sekali lagi. Agen yang sudah terdaftar tidak memakai token lagi.

Untuk melepas server, klik Nonaktifkan di konsol (permintaan dari agen tersebut langsung ditolak), lalu jalankan systemctl disable --now secumon-agent di server.

5. Membaca tampilan

  • Dasbor — ban aktif · ban kumulatif · IP residivis · tren semua server. Jika “terakhir diterima” pada kartu server jauh melewati 30 detik, periksa agen di server itu.
  • Daftar ban — IP yang sedang diblokir, beserta level residivis · sisa waktu · negara. Negara dicari dari tabel bawaan di konsol.
  • Detail IP — server tempat IP itu terkena ban, riwayat ban, perkiraan durasi ban berikutnya, reputasi AbuseIPDB.

“Ban aktif” dibaca dari daftar yang benar-benar sedang diblokir fail2ban, sedangkan “jumlah residivis” dibaca terpisah dari catatan ban fail2ban. Karena itu, ban yang sudah dicabut tidak keliru tampil sebagai ban aktif.

6. Ban · unban · blokir rentang IP

  • Ban · unban bisa dilakukan oleh operator ke atas. Ban bisa untuk IP apa saja, dan jika jail tidak dipilih, dipakai sshd.
  • Blokir rentang IP hanya bisa dilakukan administrator. Perintah baru dijalankan setelah Anda mengetik ulang rentang yang akan diblokir, dan rentang yang lebih luas dari IPv4 /16 · IPv6 /48 ditolak. Secara bawaan dicabut otomatis setelah 30 hari.
  • Anda bisa memblokir banyak rentang × banyak server sekaligus. Semuanya harus lolos pemeriksaan sebelum satu pun diterbitkan — karena kondisi setengah terblokir adalah yang paling berbahaya.
  • Perintah hanya dijalankan jika agen di server mengambilnya dalam 60 detik. Hasilnya bisa dilihat di riwayat perintah pada tab Penegakan sebagai selesai · gagal · kedaluwarsa.

Jika salah memblokir, cabut lewat Penegakan → Buka blokir di konsol. Jika begitu mendesak sampai Anda tidak bisa masuk ke konsol, hapus langsung di server tersebut.

# Satu rentang saja
nft delete element inet f2b_console blocklist4 '{ 203.0.113.0/24 }'
# Semua blokir yang dimasukkan SecuMon (aturan fail2ban ada di tabel lain, jadi tetap utuh)
nft delete table inet f2b_console

7. Blokir otomatis

Blokir otomatis IP residivis

Setiap 5 menit, IP yang sudah terkena ban 3 kali atau lebih secara kumulatif dipilih lalu diblokir 30 hari di semua server. Ini satu-satunya fitur yang mengubah firewall tanpa persetujuan manusia, jadi diberi beberapa lapis pengaman.

  • Yang diblokir hanya IP tunggal (/32 · /128), bukan rentang.
  • Rentang terlindungi dilewati. Maksimal 20 entri diterbitkan sekaligus.
  • IP yang sama tidak dieskalasi dua kali, dan semuanya dicatat di log audit serta dikirim ke Telegram.

Untuk menonaktifkan, beri konsol F2B_AUTO_BLOCK_ENABLED=false lalu jalankan ulang. IP yang salah terblokir harus dicabut dulu lewat Buka blokir, lalu catatan eskalasinya dihapus agar nanti dinilai ulang.

docker exec secumon-db psql -U secumon -d secumon -c "DELETE FROM auto_block WHERE ip = '<IP>'"

Daftar blokir publik

Aktifkan di tab Feed blokir. Awalnya keduanya nonaktif.

  • Spamhaus DROP — rentang yang dibajak atau hanya dipakai untuk kejahatan. Tidak mungkin ada lalu lintas normal dari sana, jadi hampir tidak ada risiko salah blokir.
  • FireHOL level1 — alamat yang tidak dipakai dan rentang berbahaya yang sudah terkonfirmasi. Daftar ini juga berisi jaringan privat, jadi konsol menyaring entri yang tumpang tindih dengan rentang terlindungi sebelum mengirimnya.

Daftar diunduh ulang sekali sehari; jika isinya tidak berubah, tidak dikirim ulang ke server. Rentang yang keluar dari daftar otomatis dicabut pada pembaruan berikutnya.

8. Blokir negara — sebelum mengaktifkan

Layanan yang harus bisa diakses dari seluruh dunia tidak bisa diblokir per negara.

  • Server DNS otoritatif — resolver di seluruh dunia harus bisa masuk agar domain Anda bisa di-resolve. SecuMon selalu mengizinkan port 53.
  • Penerimaan email (25) · VPN — jika diblokir, email terputus dan Anda sendiri tidak bisa masuk ke server dari luar negeri. Jangan aktifkan blokir negara di server seperti ini.
  • Bot mesin pencari — jika memblokir negara besar, bot pencari ikut terblokir dan situs web Anda bisa hilang dari hasil pencarian.

Saat Anda memilih negara di tab Blokir negara, jumlah rentangnya ditampilkan lebih dulu. Begitu diterapkan, daftar langsung diunduh dan masuk ke semua server dalam 30 detik; saat dinonaktifkan, daftar negara itu dihapus. Negara besar bisa memiliki puluhan ribu rentang.

Negara asal banyak serangan pun sering kali sebenarnya hanya beberapa rentang atau server sewaan di negara itu. Jika diblokir, penyerang pindah ke server di negara lain. Anggap blokir negara sebagai sarana pendukung yang dipakai bersama daftar blokir publik dan blokir otomatis residivis.

SecuMon mengizinkan balasan koneksi yang sudah terjalin di posisi paling depan aturan firewall. Tanpa aturan ini, balasan untuk koneksi keluar dari server Anda ke layanan di negara itu (mirror paket · API notifikasi · penerbitan sertifikat) juga ikut terblokir.

9. AbuseIPDB · Telegram

AbuseIPDB

Fitur ini aktif jika abuseipdb.key diletakkan di folder rahasia. Kunci hanya ada di server konsol dan tidak pernah keluar ke layar · DB · server mana pun.

  • Hanya IP yang sedang terkena ban atau terkena ban dalam 30 hari terakhir yang bisa dilaporkan — IP sembarang tidak bisa dilaporkan.
  • IP yang sama tidak dilaporkan ulang dalam 15 menit. Batas harian dihitung sendiri oleh konsol.
  • Kategori ditentukan dari nama jail — ssh → 18 · 22, web (apache · nginx) → 18 · 21, email → 18 · 11, lainnya → 18.

Telegram

# /srv/secumon/secrets/telegram.env
TELEGRAM_TOKEN=<token bot>
TELEGRAM_CHAT_ID=<ID chat>

Memberi tahu blokir otomatis residivis dan perubahan daftar publik. Daftar lengkapnya dilampirkan sebagai file. Jika tidak ada perubahan, tidak ada notifikasi — kalau setiap hari datang pesan “tidak ada perubahan”, notifikasi yang benar-benar penting malah terlewat.

10. Akun · autentikasi dua faktor

PeranYang bisa dilakukan
VIEWER hanya-lihatMelihat dasbor · daftar ban · detail IP · riwayat perintah
OPERATOR operator+ ban · unban · laporan AbuseIPDB dan cek reputasi
ADMIN administrator+ blokir rentang IP · pendaftaran server · feed blokir · blokir negara · pengguna · log audit
  • Login pertama memakai admin dan kata sandi dari file admin_password. Setelah login, ganti kata sandi di Akun saya.
  • Di Akun saya → Autentikasi dua faktor, pindai kode QR dengan aplikasi autentikator atau masukkan kodenya secara manual. Kode yang sama tidak bisa dipakai dua kali.
  • Jika kata sandi salah 5 kali, akun dikunci 15 menit, dan satu IP hanya bisa mencoba hingga 10 kali per menit. Jika tidak ada aktivitas selama 30 menit, Anda otomatis logout.

Jika aplikasi autentikator hilang, autentikasi dua faktor tidak bisa direset dari layar. Orang yang memiliki akses ke server konsol harus meresetnya langsung di DB.

docker exec secumon-db psql -U secumon -d secumon -c \
  "UPDATE app_user SET totp_enabled=false, totp_secret=NULL, totp_last_counter=0 WHERE username='admin';"

11. Cadangan · pengelolaan kunci

# Basis data — kata sandi tersimpan sebagai hash, token pendaftaran juga hanya sebagai hash
docker exec secumon-db pg_dump -U secumon secumon | gzip > secumon-$(date +%F).sql.gz
# Folder rahasia — inilah rahasia yang sebenarnya. Simpan di tempat berbeda dari cadangan DB
tar czf secumon-secrets-$(date +%F).tgz -C /srv/secumon secrets
  • Jika kunci tanda tangan konsol diganti, semua agen menolak perintah. Jika sudah terlanjur diganti, daftarkan ulang setiap server dengan urutan: nonaktifkan → terbitkan ulang token → hapus /etc/secumon/agent.json · agent_ed25519.key di server → instal ulang.
  • Yang perlu diperiksa secara rutin: setiap hari, status server dan perintah yang gagal; setiap minggu, catatan penolakan di log audit dan akun yang belum mengaktifkan autentikasi dua faktor.

12. Pemecahan masalah

Pesan dari agen dan konsol dicetak dalam bahasa Korea. Cari di log teks persis yang ditampilkan dengan format kode pada tabel di bawah.

GejalaPenyebabTindakan
Log agen 등록되지 않았거나 비활성 상태인 타겟Server dinonaktifkan di konsolTerbitkan ulang token lalu daftar ulang
Log agen 요청 시각 편차가 허용치를 넘습니다Jam server meleset lebih dari 60 detikSinkronkan jam dengan NTP
Log agen 이미 사용된 noncePermintaan yang sama masuk lagiIni pertahanan yang normal. Jika terus terjadi, curigai pengiriman ganda di jaringan
Hasil perintah 거부: 만료된 명령Agen tidak mengambilnya dalam 60 detikPeriksa status secumon-agent di server lalu jalankan ulang
Hasil perintah 거부: 서명이 유효하지 않음Kunci tanda tangan konsol diganti tanpa pendaftaran ulangDaftar ulang mengikuti urutan di bab 11
“Terakhir diterima” di kartu server berhenti · log terputusAgen macetsystemctl restart secumon-agent
Blokir negara sudah diaktifkan, tetapi tidak diterapkan di serverBaris ini tidak ada di log agen: 국가 차단 적용Pastikan agen versi terbaru dan periksa pesan error di log
Terus-menerus ter-logoutMengakses lewat alamat yang bukan HTTPSAkses lewat alamat HTTPS konsol

Pertanyaan lain? Kirimkan ke halo@levelupsoft.com.