Ini adalah panduan untuk instalasi, konfigurasi, dan pemeliharaan Arcivéo Monitor. Bagian-bagiannya dikelompokkan: ikhtisar umum, penerapan dashboard, penyambungan alat keamanan, modul bawaan, dan diagnostik. Perintah dapat disalin dengan tombol di sebelah kanan.
Instalasi panel tersedia di halaman langkah demi langkah tersendiri. Pilih metode:
Arcivéo Monitor — dashboard keamanan server. Mengumpulkan data dari alat yang terpasang (Fail2ban, UFW, Lynis, ModSecurity, AIDE, ClamAV, Auditd, CrowdSec, Suricata, Falco, dll.) dan menampilkannya dalam satu antarmuka dengan dashboard, peta serangan, dan halaman rinci untuk setiap alat.
Monitor bukan alat perlindungan aktif — ia tidak memblokir serangan sendiri. Tugasnya adalah menggabungkan informasi dari alat yang sudah berjalan dan menyajikannya dalam bentuk yang mudah dipahami.
Monitor bekerja hanya secara lokal — harus dipasang di server yang sama dengan yang dipantau. Tidak ada SSH atau API jarak jauh.
Semua perintah (fail2ban-client, ufw status, ipset list dsb.) dijalankan panel atas nama pengguna web server (biasanya www-data, di panel hosting — akun situs) dengan hak akses terbatas sudo — hanya untuk utilitas tertentu, tanpa akses root umum. Hasilnya diurai dan ditampilkan di browser.
Skor dimulai dari nilai maksimum dan berkurang untuk setiap masalah yang ditemukan:
PermitRootLogin yes) — −20Hasil: 80+ = Terlindungi, 60–79 = Perhatian, <60 = Terancam.
WebAuthn — standar autentikasi tanpa kata sandi melalui kunci keamanan perangkat keras. Mendukung YubiKey, Touch ID, Face ID, Windows Hello, Passkey.
Setelah masuk dengan kata sandi, sistem meminta konfirmasi melalui kunci keamanan yang terdaftar. Sekalipun kata sandi bocor — tanpa kunci fisik atau biometrik, masuk tidak dimungkinkan.
Untuk mengatur, buka Kunci WebAuthn di menu samping lalu klik “Daftarkan kunci”. Daftarkan dua kunci sekaligus: jika satu-satunya kunci hilang atau rusak, masuk ke dashboard dengan kunci itu tidak akan mungkin.
Dashboard bisa mengirim laporan keamanan ke Telegram dan email (lewat tombol dan terjadwal). Diatur di bagian “Setelan”.
Telegram. Diperlukan token bot dan chat id:
@BotFather → /newbot → dapatkan token berbentuk 123456:ABC....@userinfobot, atau buka https://api.telegram.org/bot<TOKEN>/getUpdates dan temukan "chat":{"id":...}.Email. Dua cara pilihan di “Setelan” → Email:
re_...) dan domain pengirim yang sudah diverifikasi.Status laporan: “PERHATIAN” atau “OK”. Judul menjadi “PERHATIAN” hanya saat ada masalah nyata atau tindakan yang tertunda: ClamAV menemukan ancaman, perubahan file di AIDE, event kritis Falco (Emergency/Alert/Critical dalam 24 jam terakhir), layanan mati di Monit, perlu reboot, SSL akan kedaluwarsa (≤14 hari) atau ada pembaruan keamanan yang menunggu. Derau latar — percobaan brute force SSH oleh bot, IP yang dibanned fail2ban, alert Suricata, peringatan Lynis, serta permintaan ModSecurity yang sudah ditangkis — tidak menaikkan status, jadi angka-angka seperti itu dalam laporan bukan berarti “PERHATIAN” dengan sendirinya.
Modul pemantauan terperinci (Lynis, UFW, ModSecurity, peta serangan, AIDE, ClamAV, dll.) terbuka jika ada lisensi aktif. Tanpanya, dasbor, pengaturan, dan akun tetap berfungsi, sedangkan modul menampilkan kartu “Perlu lisensi”.
Setelah membeli di akun, Anda punya kode aktivasi berformat ARCIVEO-XXXX-XXXX-XXXX-XXXX. Kode itu perlu “diaktifkan” ke domain panel Anda — ini mengubah kode menjadi berkas lisensi bertanda tangan (blok [license]) yang Anda tempelkan ke panel.
Cara mengaktifkan (3 langkah):
my.arciveo.com → bagian “Lisensi” / “Aktivasi lisensi” — salin kode ARCIVEO-….monitor.example.com). Klik aktifkan — sistem akan membuat berkas lisensi yang terikat ke domain itu dan menampilkannya di kolom dengan tombol “Salin”.Panel memverifikasi kunci secara kriptografis: tanda tangan, keterikatan ke domain, dan masa berlaku.
APP_URL di config.php dan masukkan hanya nama host — tanpa https:// dan tanpa awalan www. Aktivasi hanya sekali: kode berubah menjadi lisensi untuk domain yang dimasukkan dan tidak dapat diaktifkan ulang — jika domain salah, kunci tidak cocok dengan panel Anda, dan kode terbuang. Karena itu masukkan domain dengan teliti.
Semua parameter utama panel diatur dalam satu berkas config.php di root (di samping folder public/) berupa konstanta define() biasa. Berkas dibuat saat instalasi; menyuntingnya secara manual jarang diperlukan — biasanya hanya saat mengganti domain, memindahkan, atau menyambung ke basis data lain. Setelah setiap perubahan mulai ulang PHP-FPM (jika tidak, perubahan tak akan diterapkan karena OPcache).
Isikan nilai Anda pada bagian yang disorot; sisanya biarkan apa adanya:
Basis data. Kredensial koneksi ke MySQL/MariaDB:
DB_HOST — host DBMS, hampir selalu localhost;DB_NAME — nama basis data panel;DB_USER — pengguna BD (akses hanya ke basisnya sendiri);DB_PASS — kata sandi pengguna ini;DB_CHARSET — enkode koneksi, biarkan utf8mb4.Aplikasi.
APP_URL — alamat lengkap panel (mis. https://monitor.example.com). Harus sama dengan domain tempat lisensi diaktifkan — jika tidak, kunci akan ditolak (lihat bagian “Lisensi”);TIMEZONE — zona waktu PHP: hanya memengaruhi cara panel menampilkan tanggal dan waktu. Tidak memengaruhi waktu jalannya tugas cron — di sana berlaku zona sistem (lihat “Semua tugas cron”).Waktu sesi. SESSION_LIFETIME — batas waktu idle sesi dalam detik (bergulir: diperbarui saat ada aktivitas). Bawaannya 28800 = 8 jam; setelah durasi tak aktif ini, panel akan meminta masuk kembali. Misalnya, 3600 = 1 jam, 86400 = sehari.
Pencatatan galat. Galat tak pernah ditampilkan ke pengunjung, melainkan ditulis ke logs/php_errors.log — terlihat di halaman “Log aplikasi”. Baris-baris ini (display_errors=0, log_errors=1, jalur error_log) biasanya tak perlu diubah — pengaturan ditetapkan langsung di berkas dan tidak bergantung pada php.ini.
public/), dan web-root (DocumentRoot) panel ini adalah root panel itu sendiri, bukan public/. Berkas ini tidak “bocor” dengan sendirinya: di .htaccess root ada larangan eksplisit untuknya (Require all denied) — server mengembalikan 403. Bahkan tanpa aturan ini, sumbernya tak akan bocor: ini PHP — server mengeksekusinya, bukan menyajikannya sebagai teks. Untuk berjaga-jaga: jangan unggah ke repositori publik dan jangan kirim ke dukungan dengan kata sandi asli. Izin berkas — 640.
UFW (Uncomplicated Firewall) — antarmuka sederhana untuk nftables/iptables. Menutup semua port masuk kecuali yang diizinkan secara eksplisit. Halaman “Firewall UFW” menampilkan status dan aturan.
ufw enable, wajib izinkan SSH (ufw allow OpenSSH), jika tidak Anda akan kehilangan akses ke server.
deny tidak dianggap dapat diakses dari luar.
Skipping adding existing rule — ini bukan kesalahan. Dengan begitu UFW memberi tahu bahwa aturan yang sama persis sudah ada, dan tidak menambahkannya lagi. Saat menjalankan ulang konfigurasi otomatis (yang bersifat idempoten), ini adalah pesan normal — tidak perlu ditanggapi.
Memblokir IP secara otomatis setelah jumlah percobaan login gagal melebihi batas. Menganalisis log SSH, nginx, Apache, dan layanan lainnya.
Instalasi dasar ada di atas. Di sini adalah konfigurasi kerja yang menghasilkan puluhan jail aktif dan ribuan blokir: pengaturan umum, jail utama, dan autoban IP berbahaya dari daftar ipsum.
Berkas /etc/fail2ban/jail.local — pengaturan umum dan jail terpenting:
ignoreip wajib masukkan IP Anda sendiri dan jaringan tepercaya, jika tidak Anda bisa memblokir diri sendiri. Setelah perubahan: sudo fail2ban-client reload.
Pemuatan otomatis daftar blokir ipsum — ke cron root (sudo crontab -e): level 1 (100+ ribu IP) dimuat ke set ipsum, yang diblokir di firewall (selengkapnya di bagian “Daftar blokir IPset”):
ipsum — itulah yang dibaca dasbor (kartu “IPset ipsum”). Level: levels/1.txt — cakupan maksimal, levels/3.txt — lebih akurat (3+ sumber).
Mengapa “Monitor keamanan” dibagi menjadi dua zona. Perlindungan bekerja di dua tingkat, dan dasbor tidak mencampurnya:
sshd, apache-*, nginx-* dsb.) dan residivis berat (jail recidive — yang sudah diban beberapa kali). Ini IP yang benar-benar menyerang Anda — mereka ada di peta serangan dan “Garis waktu”.ipset ipsum, diblokir di firewall dengan aturan DROP. Sebagian besar alamat ini bahkan tidak pernah menyentuh server Anda — mereka diblokir lebih awal; penghitung “IPset ipsum” menunjukkan berapa banyak yang diblokir secara preventif.Bedanya sederhana: reaktif — “mereka menyerang lalu diban”, preventif — “mereka diblokir bahkan sebelum mencoba”. Dulu recidive diisi secara artifisial dengan list-3 ipsum (dari sinilah muncul pembagian lama “recidive daftar”); kini recidive hanya berisi residivis asli, sedangkan preventif sepenuhnya di firewall.
ipsum — daftar publik IP berbahaya yang diperbarui setiap hari. Monitor menampilkan jumlah alamat yang dimuat di dasbor dan peta serangan serta memperhitungkannya dalam Skor Keamanan (−10 jika kumpulan tidak dimuat).
Varian minimal tanpa fail2ban — kumpulan ipsum tersendiri dengan pemblokiran lewat iptables:
@reboot. Sekalian perintah create … -exist menetapkan batas maxelem 300000 (secara default 65536 — level 1 tidak muat, akan muncul “Hash is full”):
ipsum dan, jika firewall dikelola oleh penginstal (VPS baru — profil “Penuh”/“Ringan”), menautkan kumpulan ke UFW dengan aturan DROP — trafik dari IP ini benar-benar diblokir. Aturan ditempatkan setelah ESTABLISHED,RELATED, sehingga koneksi yang sedang berjalan (termasuk SSH Anda) tidak terputus — hanya koneksi baru dari daftar yang dipotong. Kumpulan dipulihkan saat pemuatan layanan ipsum-load.service sebelum firewall (jika tidak, UFW tidak akan aktif), dan diperbarui oleh cron pada pukul 04:00. Pada server yang sudah dikonfigurasi (panel, firewall sendiri), penginstal tidak menyentuh firewall — di sana ipsum tetap menjadi daftar untuk dasbor dan peta serangan, sedangkan aturan DROP dapat ditambahkan manual bila diinginkan (varian minimal dengan iptables … --match-set ipsum … -j DROP — di atas). Saat instalasi otomatis, Anda tidak perlu melakukan apa pun secara manual.
Pengganti modern untuk Fail2ban dengan threat intelligence kolektif: pemblokiran dari komunitas plus aturan buatan sendiri. Membutuhkan bouncer terpisah untuk menerapkan pemblokiran ke firewall.
systemctl is-active crowdsec). Aktifkan: sudo systemctl enable --now crowdsec; jika gagal, lihat sudo journalctl -u crowdsec -n 30. Aturan yang sama berlaku untuk layanan apa pun berstatus “Tidak berjalan” (Suricata, Falco, Monit, MySQL).
stream halted / pemblokiran tidak diterapkan. Ini kunci api yang terlantar: bouncer telah dihapus dari cscli bouncers list, tetapi kunci lamanya masih ada di /etc/crowdsec/bouncers/*.yaml. Daftarkan ulang bouncer dan tuliskan kunci baru:
AIDE (Advanced Intrusion Detection Environment) membuat snapshot sistem berkas dan pada setiap pemeriksaan melaporkan perubahan di /etc, /bin, /usr. Setelah instalasi, inisialisasi basis data wajib dilakukan (aideinit).
aideinit terminal berhenti selama 5–15 menit pada baris Running aide --init... — ini normal (hashing seluruh sistem berkas, beban pada disk). Jangan hentikan dengan Ctrl+C. Jika proses “menggantung” tetapi tidak menulis apa pun — mungkin ia menunggu jawaban atas permintaan tersembunyi Overwrite existing aide.db.new [Yn]? (tekan Y). Periksa aktivitas dari sesi lain: pgrep -af aide.
aideinit: “21_aide_spamassassin … printf: invalid number” (return code 20) — bug yang dikenal pada snippet konfigurasi AIDE di Ubuntu 22.04. Basis data tidak dibuat. Keluarkan snippet yang rusak lalu ulangi:
aideinit belum dijalankan, atau (Ubuntu 24.04) direktori /var/lib/aide dibuat dengan mode 700 dan tidak dapat diakses www-data — diperbaiki dengan sudo chmod 755 /var/lib/aide (lihat blok di atas). “Belum ada pemeriksaan” = basis data ada, tetapi pemeriksaan belum pernah dijalankan — ini bukan kesalahan. Hasilnya dibaca monitor dari /var/log/aide/aide.log.
/etc/cron.daily/aide bawaan pada Ubuntu/Debian baru mungkin tidak menulis /var/log/aide/aide.log dalam bentuk yang diperlukan (dan aide.wrapper sudah tidak ada di dalamnya). Lebih andal menambahkan cron sendiri dengan --config eksplisit — ia menulis log sebagai root dengan mode 644, dan monitor membacanya tanpa grup tambahan:
chmod 755 /var/lib/aide dan cron pemeriksaan pukul 02:00 — tidak perlu apa pun secara manual.
sudo aideinit && sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db.
Pemindai antivirus untuk Linux. Sangat berguna untuk memeriksa /var/www dari PHP-shell dan kode berbahaya.
enable --now? Tiga penyebab umum:
1. Baris Example masih ada di konfigurasi — clamd menolak start selama baris itu ada:
2. Basis data signature belum diunduh — clamd tidak start tanpanya:
3. Sedang memuat saja — clamd memuat ~8 juta signature ke memori selama 30–60 detik. Tunggu dan periksa: systemctl is-active clamav-daemon (status activating → masih memuat).
sudo journalctl -u clamav-daemon -n 30 --no-pager.
clamd hanya menyimpan signature di memori, ia sendiri tidak memindai apa pun secara terjadwal. Dashboard menampilkan hasil pemindaian terjadwal, jadi diperlukan cron yang memindai dan menulis log. Instalasi otomatis memasang wrapper /usr/local/bin/clamav-scan.sh dan cron pada 01:30 — setelah menjalankan pertama kali, “File diperiksa” dan “Pemindaian terakhir” akan terisi. Jalankan langsung tanpa menunggu jadwal: sudo /usr/local/bin/clamav-scan.sh.
Linux Malware Detect (LMD) — pemindai malware untuk ancaman web: PHP-shell, backdoor web, downloader. Menggunakan mesin ClamAV dan melengkapinya dengan signature miliknya sendiri.
maldet --report.
update-rc.d: error: unable to read /etc/init.d/maldet — baris ini tidak berbahaya. maldet tidak menggunakan init.d, pembaruan signature dan pemindaian dijalankan melalui /etc/cron.daily/maldet. Jika di bawah terlihat installation completed — semuanya sudah terpasang.
apt, melainkan di /usr/local/maldetect, dan saat open_basedir aktif keberadaannya diperiksa melalui shell — lihat bagian “Halaman kosong padahal data ada di server”.
Sistem deteksi intrusi jaringan: menganalisis lalu lintas pada tingkat paket dan mengenali ribuan signature serangan. Melengkapi ModSecurity (yang bekerja pada tingkat HTTP, sedangkan Suricata pada tingkat TCP/IP).
/var/log/suricata/eve.json sebagai root dengan mode 750 pada direktori, dan server web (www-data) tidak dapat membacanya. Buka akses lintas direktori — file di dalamnya tetap terlindungi:
Menangkap system call melalui eBPF/kernel module dan mendeteksi anomali secara real-time: shell dari nginx, pembacaan /etc/passwd oleh proses web, penulisan ke /bin, dsb.
journalctl -u falco (tanpa sudo — lewat grup systemd-journal). Pastikan www-data ada di grup ini — lihat “Konfigurasi sudo” (poin 2) pada halaman instalasi manual.
/etc/passwd, penulisan ke direktori sistem). Nol peristiwa kritis dalam sehari pada server yang tenang adalah kondisi yang sehat.
journalctl memerlukan izin atas jurnal; agar panel melihat peristiwa secara stabil, instalasi otomatis mengaktifkan file_output pada Falco → /var/log/falco/falco.log dan mengatur UMask=0022 pada layanan (log dapat dibaca web server). Pada instalasi baru, ini tidak perlu dikonfigurasi secara manual.
ModSecurity — firewall web (WAF) untuk Apache atau Nginx. Memblokir serangan di lapisan aplikasi: injeksi SQL, XSS, path traversal, pemindai.
IncludeOptional /etc/modsecurity/*.conf, sedangkan paket hanya meletakkan modsecurity.conf-recommended — file ini tidak cocok dengan pola *.conf. Jika tidak disalin ke modsecurity.conf, SecRuleEngine tetap Off: modul termuat, aturan CRS termuat, tetapi trafik tidak diperiksa dan log audit tidak dibuat. Mode antara DetectionOnly hanya menulis peristiwa ke log tanpa memblokir permintaan — dashboard menampilkannya dengan warna kuning.
Akses dashboard ke log audit. Log /var/log/apache2/modsec_audit.log dimiliki oleh root (hak 640), pengguna web tidak bisa membacanya. Dashboard mengambil data melalui pembungkus — buatlah:
SecRuleEngine terakhir tanpa indentasi: baris berindentasi berada di dalam blok <LocationMatch>/<Directory> (misalnya mematikan WAF untuk phpMyAdmin) dan tidak menentukan mode global.www-data, di HestiaCP pool situs berjalan sebagai pemilik situs (misalnya admin) — periksa dengan grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.X-Forwarded-For. Yang masuk ke statistik hanya transaksi dengan aturan yang terpicu: direktif SecAuditLogRelevantStatus menulis semua respons 4xx/5xx ke log audit, sehingga 403/500 biasa pun ikut masuk — dashboard tidak menghitungnya sebagai peristiwa WAF.---RULES--- dibutuhkan oleh bagian “Semua aturan aktif” — dashboard menampilkan bukan hanya aturan yang terpicu, melainkan seluruh aturan CRS + kustom yang termuat. Tiga path dalam loop for f in … adalah lokasi khas untuk aturan CRS dan tambahan lokal; jika tata letak Anda berbeda (paket meletakkan file di direktorinya sendiri, atau aturan kustom tidak berada di /etc/modsecurity/custom-rules.conf), temukan path sebenarnya dengan perintah sudo grep -rl 'IncludeOptional\|^Include ' /etc/apache2/mods-enabled/security2.conf /etc/apache2/conf-enabled/*.conf 2>/dev/null dan masukkan ke daftar. Jika pembungkus versi lama (tanpa bagian ini) — bagian tersebut hanya akan menampilkan peringatan “tidak tersedia”, sisa halaman berfungsi seperti sebelumnya.
Auditd (Linux Audit Daemon) mencatat panggilan sistem pada level kernel: login dan logout, perintah sudo, upaya autentikasi yang gagal, perubahan berkas. Monitor menampilkan login, upaya yang gagal, dan perintah sudo hari ini.
ausearch (/usr/sbin/ausearch) dan bila perlu dari /var/log/audit/audit.log dengan perintah tail. Keduanya harus ada di sudoers.
Memantau layanan (nginx, php-fpm, mysql, dll.) dan memulai ulang saat gagal. Bisa mengirim peringatan ke email.
monit status. Di /etc/monit/monitrc antarmuka HTTP harus diaktifkan (blok set httpd dengan allow localhost), jika tidak monit status akan mengembalikan error.
monitrc baris set httpd dikomentari (secara default tertulis sebagai # set httpd port 2812 …). Hapus komentar pada blok itu dan izinkan localhost. (2) httpd yang aktif saja tidak memantau apa pun — Monit hanya menghitung yang dijelaskan pada stanza check; tanpa itu daftarnya kosong meski antarmuka berjalan. Konfigurasi minimal yang berfungsi:
conf.d siap pakai dengan httpd di 2812 beserta seperangkat pemeriksaan — pada instalasi baru tidak perlu diatur manual.
PSAD menganalisis log iptables dan mendeteksi pemindaian port serta serangan jaringan, memberikan tingkat ancaman (1–5) ke setiap sumber. Melengkapi fail2ban dan Suricata.
psad --Status (perlu ada di sudoers). Tanpa logging iptables, halaman akan kosong — ini normal selama belum ada pemindaian.
Mandatory Access Control membatasi file dan sumber daya apa saja yang bisa diakses sebuah program, bahkan jika program itu telah diretas. Di Ubuntu/Debian, AppArmor dipakai secara default (biasanya sudah terpasang dan aktif).
aa-status (perlu ada di sudoers). Menampilkan jumlah profil dalam mode enforce/complain dan proses tanpa profil.
“Profil dimuat” lebih banyak daripada enforce + complain — itu normal. Pada AppArmor 4.x (Ubuntu 24.04 dan lebih baru) muncul mode unconfined: profil dimuat ke kernel, tetapi tidak membatasi apa pun. Ubuntu menandai puluhan profil seperti ini untuk program yang memakai user namespaces (peramban, klien torrent, dan sejenisnya). Ketika profil semacam itu ada, kartu “Profil dimuat” menjadi kuning dan menampilkan jumlahnya — misalnya unconfined: 90 dari 120 yang dimuat dan 26 dalam enforce. Yang benar-benar melindungi hanya profil dalam enforce; di Ubuntu 22.04 (AppArmor 3.x) mode ini tidak ada sehingga angkanya selalu cocok.
unconfined hanya layak dilakukan secara sadar: profil itu dimatikan bukan karena kesalahan, melainkan karena kalau tidak, program itu sendiri jadi rusak. Profil dalam complain berbeda halnya: di situ aturannya sudah ditulis dan hanya belum diterapkan.
debsums memverifikasi bahwa file paket yang terpasang cocok dengan checksum dari repositori — mendeteksi biner sistem yang dipalsukan (melengkapi AIDE). Pemindaian penuh memakan 1–2 menit, sehingga dijalankan lewat cron, dan dashboard membaca hasilnya dari data/debsums/debsums.log lalu mengelompokkannya sendiri per kategori (hanya biner dan pustaka yang penting).
Tugas ditempatkan di cron root (sudo crontab -e). Pembungkus siap pakai debsums-scan.sh diletakkan di /usr/local/bin/ (chmod +x; lihat ringkasan tugas cron) dan menulis laporannya sendiri ke data/debsums/ dashboard.
Pembungkus debsums-scan.sh menemukan sendiri data/ dashboard — path tidak perlu dituliskan.
/etc/ (konfigurasi) dan /usr/share/ (sumber daya) pada server biasanya wajar — dashboard menandainya dengan warna tersendiri. Yang mengkhawatirkan adalah perubahan pada biner dan pustaka (/bin, /sbin, /usr/lib dsb.) — kartu “Biner / pustaka” menampilkan tepat perubahan tersebut.
Lynis dijalankan manual atau lewat cron. Laporan harus disimpan ke folder data/lynis/ proyek — monitor membaca file lynis-report.dat.
lynis-scan.sh di latar belakang langsung dari panel (tanpa menunggu cron): menampilkan “Memindai…” dan setelah selesai laporan diperbarui otomatis. Untuk itu, pengguna web memerlukan baris sudoers agar bisa menjalankan skrip — installer menambahkannya otomatis ke /etc/sudoers.d/monitor. Jika panel dipasang manual/sebelumnya, tambahkan baris tersebut dengan pengguna yang sama yang sudah tercantum di file:
Logwatch harus menyimpan laporan harian ke folder data/logwatch/ proyek dalam format .txt. Monitor menampilkan laporan terbaru dan arsipnya.
Monitor jaringan tidak perlu diinstal — ini halaman dashboard bawaan. Halaman ini menampilkan status jaringan server dari sumber lokal:
/proc/net/dev;ip;ss;journalctl -k.Tiga sumber pertama bekerja tanpa sudo, jadi antarmuka, trafik, koneksi, dan port langsung terlihat. Blok “Peristiwa kernel” memakai journalctl -k — dibaca melalui grup systemd-journal (“Konfigurasi sudo”, poin 2), tidak perlu sudo. Untuk memastikan semuanya bisa diakses pengguna web:
UFW BLOCK tidak masuk ke sini — ada di halaman “Firewall UFW” dan “Peta serangan”. Blok kosong dengan centang hijau = tidak ada gangguan jaringan selama sehari.
Halaman bawaan menampilkan tiga hal:
df); skala memerah saat ≥90%;lsblk), hanya yang nyata (loop/snap disembunyikan);smartctl).Ruang dan daftar perangkat langsung berfungsi tanpa pengaturan. Untuk SMART diperlukan paket smartmontools. Proses web tidak memiliki akses langsung ke perangkat disk, sehingga SMART diambil lewat cron ke berkas data/disk/smart.txt, lalu dibaca oleh dashboard.
Tugasnya ada di cron root (sudo crontab -e). Pembungkus siap pakai smart-scan.sh ditaruh di /usr/local/bin/ (chmod +x; lihat ringkasan tugas cron) dan langsung menulis ke data/disk/ dashboard.
Pembungkus smart-scan.sh menemukan sendiri data/ dashboard — jalurnya tidak perlu ditulis. Di dalamnya lsblk -e7,11 mengecualikan loop/cdrom.
Halaman ini menampilkan riwayat beban server selama 24 jam terakhir — Load Average, pemakaian CPU dan waktu tunggu I/O, RAM/Swap, trafik jaringan (terima/kirim), I/O disk (baca/tulis), pengisian disk dan inode, deskriptor file yang terbuka serta koneksi MySQL, ditambah jumlah koneksi TCP dan proses saat ini.
Data dikumpulkan oleh cron/collect_metrics.php — setiap 5 menit menulis satu snapshot “mentah” dari penghitung (/proc/loadavg, /proc/meminfo, /proc/stat, /proc/net/dev, /proc/diskstats, df/df -i, /proc/sys/fs/file-nr, SHOW GLOBAL STATUS LIKE 'Threads_connected') ke tabel basis data system_metrics; persentase dan kecepatan dihitung sendiri oleh halaman berdasarkan selisih antara snapshot berdekatan (pengisian disk/inode/deskriptor/koneksi MySQL — nilai sesaat, tanpa perhitungan ulang). Sudo tidak diperlukan — sumber dibaca tanpa hak root. Titik data yang lebih lama dari 24 jam dihapus otomatis pada setiap penulisan.
Pembungkus collect-metrics-all.sh (lihat ringkasan tugas cron) secara otomatis menemukan semua instans panel yang terpasang di server dan menjalankan cron/collect_metrics.php masing-masing atas nama pemilik situs.
Peringatan beban (bagian “Pengaturan” → “Peringatan beban”) — saat ambang batas CPU/RAM/disk/inode terlampaui, panel mengirim notifikasi ke Telegram/Email (kanal yang sama seperti laporan harian — tidak perlu mengaktifkannya terpisah untuk peringatan), dan satu lagi — ketika metrik kembali normal. Selama ambang batas tetap terlampaui tidak dikirim ulang: notifikasi berikutnya baru datang setelah siklus “kembali normal → terlampaui lagi”.
collect_metrics.php yang sama pada setiap kali dijalankan (setiap 5 menit) — tidak perlu cron terpisah. Status “sudah diberi tahu / belum” disimpan di data/alerts_state.json, ambang batas — di pengaturan panel.
Halaman “Peta serangan” menentukan negara berdasarkan IP dengan perintah geoiplookup. Tanpa paket GeoIP, negara tidak terdeteksi dan titik pada peta tidak muncul:
/usr/share/GeoIP/GeoIP.dat dapat dibaca semua, hasilnya di-cache di tmp/geoip_cache.json. Petanya sendiri (Leaflet + tile OpenStreetMap) dimuat di browser — perlu internet pada komputer tempat dashboard dibuka.
Dua kartu bawaan pada dasbor yang menampilkan bukan status “aktif/nonaktif” sebuah alat, melainkan tingkat keamanan server yang sebenarnya. Tidak perlu instalasi, dibaca secara lokal tanpa sudo.
Eksposur eksternal — berapa banyak layanan yang mendengarkan semua antarmuka (0.0.0.0/[::]) dan dapat diakses dari luar. Menyorot merah bila DBMS atau cache terbuka ke luar (MySQL, PostgreSQL, Redis, MongoDB, Memcached, Elasticsearch) — ini celah langsung (−10 pada Skor Keamanan). Sumber: ss -tuln.
127.0.0.1 (bind-address pada konfigurasi MySQL/PostgreSQL, bind 127.0.0.1 pada Redis) atau tutup port di UFW.
127.0.0.1 (loopback) hanya terlihat oleh server itu sendiri — dari luar tidak dapat dijangkau, meski port “terbuka”. Karena itu Postfix pada port 25 yang terikat ke loopback tetap aman: penyetelan otomatis mengatur inet_interfaces = loopback-only (plus smtpd_banner netral — menutup temuan Lynis MAIL-8818 soal pengungkapan versi). Kartu “Eksposur eksternal” hanya menghitung yang mendengarkan 0.0.0.0/[::] sebagai terbuka ke luar; layanan loopback tidak termasuk.
/etc/postfix/main.cf atur smtpd_banner = $myhostname ESMTP (tanpa versi dan OS) dan inet_interfaces = loopback-only, lalu sudo systemctl restart postfix.
Pembaruan keamanan — berapa banyak patch keamanan yang menunggu dipasang dan apakah perlu boot ulang setelah pembaruan kernel (−5 pada Skor Keamanan bila ada patch). Sumber: /usr/lib/update-notifier/apt-check, berkas /var/run/reboot-required. Daftar rincinya ada di halaman “Pembaruan keamanan”.
update-notifier-common). Jika apt-check tidak ada — monitor menghitung patch melalui apt-get -s upgrade.
Pembaruan keamanan otomatis (unattended-upgrades) — pada halaman “Pembaruan keamanan” ada kartu terpisah yang menampilkan apakah pemasangan otomatis patch keamanan aktif dan kapan terakhir dijalankan. Sudo tidak diperlukan — statusnya dibaca melalui apt-config dump.
Cadangan adalah asuransi utama: kehilangan data lebih parah daripada peretasan mana pun. Ada dua hal yang diperlukan — cadangan server/situs dan secara terpisah cadangan basis data panel (di sana ada pengguna, kunci WebAuthn, pengaturan, lisensi).
Opsi A — HestiaCP: tab Backup pada pengguna → tombol pembuatan cadangan (atau terjadwal di pengaturan server). Cadangan mencakup situs dan basis datanya.
Opsi B — manual (cron): dump basis data + arsip direktori data/ panel:
Pembaruan ke versi baru. Buat cadangan terlebih dahulu. Lalu unggah ulang berkas kode, dengan menyimpan data Anda:
public/, includes/, assets/, cron/, database/, serta .htaccess di root (front controller — perutean tidak boleh dibiarkan dari versi lama), manifest.json, sw.js;config.php (data DB), data/ (laporan), logs/, tmp/ (sesi dan cache).SSH_FX_PERMISSION_DENIED — Permission denied. File panel dimiliki www-data (begitulah pengaturannya saat instalasi), sedangkan klien SFTP terhubung sebagai pengguna Anda sendiri yang tidak punya hak tulis. Memberikan seluruh panel ke www-data “agar berfungsi” justru itulah yang menyebabkan error ini; di bawah ada tiga cara, mana pun menyelesaikan masalahnya.
data/ (laporan), tmp/ (sesi dan cache), logs/; ketiganya tetap dimiliki www-data. Sisanya adalah kode, dan server web hanya perlu membacanya, yang diberikan oleh grup www-data dengan hak 644. Keuntungan sampingan: saat ada celah di PHP, file panel sudah tidak bisa ditimpa. Pada panel hosting (HestiaCP dan sejenisnya) opsi A tidak diperlukan: di sana file situs memang sudah dimiliki akun yang Anda gunakan untuk masuk lewat SFTP, dan server web membacanya lewat grup.
chmod berikutnya pada file akan mereset masker ACL, dan akses hilang tanpa pemberitahuan. Jika setelah “merapikan hak akses” pengunggahan kembali terhenti oleh Permission denied — ulangi kedua perintah setfacl.
2 pada opsi C adalah setgid: file yang diunggah lewat SFTP tetap berada di grup www-data, jika tidak panel tak bisa menimpanya. Setelah opsi C, sambungkan ulang di FileZilla — grup baru hanya berlaku pada login baru. Pemeriksaan: id deploy (grup www-data harus muncul) dan ls -ld /path/to/monitor (drwxrwsr-x — huruf s berarti setgid sudah aktif).
Pemindahan ke server lain:
config.php, data/.mysqldump di server lama → impor di server baru; sesuaikan data DB di config.php.adm, tugas cron.Jika Anda tidak bisa masuk — semuanya bisa diperbaiki langsung di basis data dari server. Buka basis data (namanya — dari config.php):
Kunci WebAuthn hilang (faktor kedua gagal) — nonaktifkan 2FA, masuk dengan kata sandi, daftarkan kunci baru:
Lupa kata sandi — tetapkan hash baru (buat di server lalu masukkan):
Terkunci sendiri oleh filter IP — nonaktifkan pembatasan:
sudo mysql di server, atau phpMyAdmin / bagian basis data di panel hosting. Setelah pemulihan, aktifkan kembali WebAuthn dan filter IP.
Ringkasan tugas ada di cron root server (ditambahkan lewat sudo crontab -e). Sisakan hanya baris untuk alat yang Anda gunakan; sesuaikan path dengan server Anda.
sudo crontab -l dan pastikan layanan cron aktif.
TIMEZONE dari config.php. Konstanta TIMEZONE hanya memengaruhi PHP (cara panel menampilkan tanggal), tetapi daemon cron menjalankan tugas berdasarkan waktu sistem OS. Jika zona server tidak sama dengan zona Anda, laporan “08:00” akan datang pada waktu yang salah. Contoh: server berada di zona lain (Asia/Dhaka, UTC+6), sedangkan Anda di Jakarta (UTC+7) → laporan “08:00” akan datang pukul 09:00 menurut waktu Anda. Periksa dan bila perlu sesuaikan zona sistem dengan zona Anda:
0 8 * * * akan berjalan pukul 08:00 waktu setempat. Jika tidak, Anda harus menggeser cron itu sendiri, tetapi saat pergantian ke waktu musim dingin/panas pergeseran akan melenceng lagi — karena itu lebih tepat mengatur zona sistem.
crontab.txt) berada di folder system/ di samping proyek, di luar public_html. Ini bukan bagian dari situs — tidak perlu diunggah ke web-root; tempatkan di server sesuai path sistem (seperti pada crontab di atas):
lynis-scan.sh → /usr/local/bin/ (chmod +x) — menjalankan lynis audit system, selama pemindaian memasang flag /tmp/lynis-running dan menyalin lynis-report.dat ke data/lynis/ panel;logwatch_daily.sh → /usr/local/bin/ (chmod +x) — membuat laporan harian Logwatch (sshd, fail2ban, sudo, postfix) di data/logwatch/;smart-scan.sh → /usr/local/bin/ (chmod +x) — mengambil status disk (smartctl) di data/disk/;debsums-scan.sh → /usr/local/bin/ (chmod +x) — memeriksa integritas paket (debsums) di data/debsums/;clamav-scan.sh → /usr/local/bin/ (chmod +x) — pemindaian antivirus ClamAV pada path berisiko (web, home, temp); menulis ringkasan ke /var/log/clamav/scan.log, tempat halaman ClamAV membacanya (baris 01:30 pada crontab di atas);load-ipsum.sh → /usr/local/bin/ (chmod +x) — memperbarui set ipset ipsum (level 1) di tempat, tanpa memutus aturan firewall yang aktif (baris 04:00 pada crontab di atas);daily-report-all.sh → /usr/local/bin/ (chmod +x) — menjalankan laporan cron/daily_report.php panel (baris 08:00 pada crontab di atas);daily_report.php — sudah termasuk dalam panel (cron/daily_report.php), dijalankan lewat daily-report-all.sh, tidak perlu dipasang terpisah;collect-metrics-all.sh → /usr/local/bin/ (chmod +x) — menjalankan cron/collect_metrics.php panel (halaman “Performa”, baris */5 pada crontab di atas); collect_metrics.php sudah termasuk dalam panel, tidak perlu dipasang terpisah;crontab.txt (system/cron/) — contoh tugas; masukkan baris yang diperlukan lewat sudo crontab -e./usr/local/bin/. Langsung dari FileZilla tak bisa menulis ke sana — direktori itu dimiliki root, dan klien SFTP akan mendapatkan SSH_FX_PERMISSION_DENIED. Urutannya begini: pertama unggah file ke /tmp (semua bisa menulis di sana), lalu pindahkan ke tempatnya dengan satu perintah:
/tmp di root server — bukan /var/tmp dan bukan tmp/ di dalam panel itu sendiri (yang terakhir dimiliki www-data dan tertutup dari pengguna Anda). Di pohon FileZilla /tmp adalah cabang tingkat atas, di sebelah var, bukan di dalamnya.
/usr/local/bin/, log — /var/log/arciveo-cron.log) — tidak perlu melakukan apa pun secara manual.
/home/*/web/*/public_html dan /var/www/*, lalu meletakkan laporan di data/ masing-masing. Jika panel berada di path lain — tambahkan path itu ke baris for app in … di dalam skrip, jika tidak laporan Lynis/SMART/debsums/Logwatch tak akan sampai ke panel.
logs/cron.log pertama kali dibuat oleh cron root — file itu akan dimiliki root, dan tab “Log cron” di panel tak dapat membacanya maupun mengosongkannya. Buat file itu terlebih dahulu atas nama pengguna web (pemilik direktori situs; pada HestiaCP ini akun, misalnya admin) — dengan begitu cron root hanya menambahkan, tanpa mengubah pemilik:
stat -c %U /path/to/monitor.
sudo crontab -e), jika tidak tugas itu akan berjalan dua kali.
sudo crontab mentah (itu akan menjadi eskalasi langsung ke root bagi siapa pun yang mengakses sesi panel), melainkan skrip terbatas dengan dua perintah (list/set) yang hanya menyentuh bloknya sendiri di antara komentar khusus. Pasang sekali:
www-data — periksa di bawah pengguna mana pool PHP-FPM situs berjalan (ps -o user= -C php-fpm), dan masukkan pengguna itu ke baris sudoers.
public/crontab_monitor.php diunggah lewat FTP/SFTP di bawah pengguna sistem yang berbeda (misalnya root) dari file situs lainnya, web-server tak akan dapat membacanya. Bandingkan pemilik dan hak akses dengan file di sebelahnya lalu samakan:
Monitor mendeteksi keberadaan alat melalui dpkg-query — basis data paket APT. Jika alat tidak dipasang melalui apt (secara manual, dari snap, atau dari sumber), dpkg tidak dapat melihatnya.
Error 500 — periksa log PHP, nginx, dan monitor itu sendiri:
www-data, melainkan sebagai akun pengguna (misalnya admin — pemilik direktori situs). Semua aturan sudo dan keanggotaan grup (adm, systemd-journal) harus didaftarkan ke pengguna itu, jika tidak modul akan menampilkan “Tidak aktif / 0” meski layanan berjalan. Untuk mengetahui pengguna PHP yang sebenarnya: ps -o user= -C php-fpm | sort -u atau pemilik direktori situs stat -c '%U' /path/to/monitor. Selanjutnya, pada semua perintah di bawah gantilah www-data dengannya. Instalasi otomatis mendeteksi pengguna web sendiri dan mendaftarkan sudoers ke pengguna tersebut.
Data tidak muncul — hampir selalu karena hak sudo belum diatur. Periksa perintah tertentu sebagai pengguna web (ganti www-data dengan milik Anda). Flag -n = tanpa kata sandi, seperti PHP — jika diminta kata sandi, berarti aturannya belum ada di sudoers:
sudo aa-status di terminal menampilkan profil, tetapi halaman “AppArmor” menampilkan “Tidak aktif”). Penyebabnya: pengguna web tidak punya hak sudo untuk perintah modul tersebut. Periksa perintahnya dari daftar di atas: jika diminta kata sandi — tambahkan baris yang hilang ke /etc/sudoers.d/monitor (“Pengaturan sudo”). Perintah “baru” yang umum: /usr/sbin/aa-status (MAC), /usr/sbin/psad --Status (PSAD).
apache2ctl, ausearch, aa-status, atau ss belum diizinkan, atau pengguna web tidak ada di grup adm/systemd-journal (dari situ log fail2ban/auth/modsec dan journalctl dibaca — Falco dan event kernel).
Gejala: data ada di server (terlihat lewat shell), tetapi halaman menampilkan “tidak ada data” atau status yang salah — misalnya AIDE menulis “Belum diinisialisasi” padahal basisnya sudah dibuat.
Penyebabnya adalah open_basedir: banyak panel dan hosting membatasi pool PHP-FPM ke direktori domain, sehingga fungsi PHP file_exists(), file_get_contents(), filemtime() pada path sistem (/var/lib/aide, /var/log, /proc…) diblokir. Monitor menyiasatinya dengan membaca path tersebut lewat perintah sistem standar (cat, test, stat).
open_basedir. Solusi yang tepat adalah pembacaan lewat perintah sistem (sudah diterapkan untuk AIDE dan Monitor Jaringan). Memperluas open_basedir ke /var, /proc tidak perlu dan kurang aman.
Monitor memeriksa sertifikat dengan terhubung langsung ke domain melalui port 443. Jika domain tidak dapat diakses dari server itu sendiri atau port ditutup oleh firewall, pemeriksaan akan gagal.
/etc/nginx/sites-enabled/, /etc/nginx/conf.d/) dan Apache (/etc/apache2/sites-enabled/) ditambah host saat ini dari HTTP_HOST.
Monitor terhubung ke MySQL sebagai pengguna dari config.php yang hanya punya akses ke basis datanya sendiri. MySQL hanya menampilkan basis data yang punya hak akses di information_schema — karena itu yang lain tidak terlihat.
Agar monitor dapat melihat semua basis data, berikan pengguna ini hak baca saja (sekali sebagai root; ganti dengan nama pengguna dari config.php):
sudo mysql sama sekali: daftar basis data diambil melalui koneksi PDO-nya sendiri.
PostgreSQL memerlukan akses pada tingkat pengguna postgres, yang tidak dimiliki oleh pengguna web panel. Menjalankan sudo psql yang luas dari PHP tidak aman — sebagai gantinya panel memanggil pembungkus sempit tanpa parameter yang hanya mencetak versi, jumlah koneksi, dan daftar basis data beserta ukurannya. Buat pembungkus tersebut:
monitor-pgstat dari sudoers (langkah 13 pemasangan manual) dan jangan buat skripnya: kartu PostgreSQL hanya akan tetap tidak aktif.
Dashboard menunjukkan apa yang terjadi; di bawah ini — apa yang harus dilakukan pada situasi umum. Prinsip utama: jangan panik, cocokkan dengan aktivitas sah (tindakan Anda, pembaruan, cadangan), dan tanggapi sesuai tingkat keseriusannya.
ignoreip./etc, di luar /usr/share) — berpotensi disusupi. Cocokkan paketnya: debsums PACKAGE_NAME, jika ragu pasang ulang (apt install --reinstall).127.0.0.1 atau tutup port di UFW. Ini celah nyata.certbot renew atau pengaturan di dashboard).sudo apt update && sudo apt upgrade; setelah pembaruan kernel, boot ulang server.