Ini adalah panduan untuk instalasi, konfigurasi, dan pemeliharaan Arcivéo Security 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 Security 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.
Dua irama kerja. Halaman panel menanyai perkakas pada saat dibuka — Anda selalu melihat keadaan terkini. Selain itu, di latar belakang berjalan tugas terjadwal (cron):
Daftar lengkap tugas ada di bagian “Semua tugas cron dalam satu tempat”.
Skor dimulai dari nilai maksimum dan berkurang untuk setiap masalah yang ditemukan:
PermitRootLogin yes) — −20PasswordAuthentication yes) — −10X11Forwarding aktif, MaxAuthTries lebih dari 3, atau sshd_config bisa dibaca semua akun — −5TRACE aktif, atau header Strict-Transport-Security atau X-Frame-Options tidak ada — −5Hasil: 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.
Salurannya ada empat: Telegram, Email, webhook, dan push di peramban. Semuanya berdiri sendiri — aktifkan yang mana pun, bahkan keempatnya. Melalui saluran yang sama pula dikirim laporan keamanan harian, peringatan beban, dan temuan sensor peristiwa; semuanya diatur sekali saja di sini, pada bagian “Pengaturan”.
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.Webhook. Satu alamat yang menerima POST sudah mencakup Slack, Discord, Mattermost, n8n, dan penangan buatan Anda sendiri. “Pengaturan” → Webhook: tempelkan alamatnya dan aktifkan sakelarnya.
{"text": …}, ke Discord {"content": …} (Discord menolak pesan yang lebih panjang dari 2000 karakter, jadi teksnya dipotong);text, event, severity, source, count, host, ts — teks pesan tidak perlu diurai lagi.Pemberitahuan push. Pesan tiba langsung di peramban, dan jika panel sudah ditambahkan ke layar utama ponsel, tampil seperti pemberitahuan aplikasi biasa — tanpa bot dan tanpa server surel di tengahnya. “Pengaturan” → Pemberitahuan push: aktifkan sakelarnya dan tekan “Hubungkan perangkat ini” pada setiap perangkat yang perlu menerima pemberitahuan. Penghitung “Perangkat terhubung” menunjukkan berapa jumlahnya.
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.
Panel dilindungi login berkata sandi dan, bila diaktifkan, oleh penyaring IP. Bagi sebuah program keduanya tidak cocok, karena itu sistem luar punya pintu masuk sendiri — dua alamat hanya-baca yang dilindungi token. Token tidak mengubah apa pun di server: dengannya hanya bisa diambil angka-angka.
Mengaktifkan — “Pengaturan” → “API hanya-baca”: sakelar “Aktifkan API”; tokennya dibuat otomatis pada penyimpanan pertama. Tombol “Token baru” menerbitkan token lain dan pada saat itu juga memutus semua yang memakai token sebelumnya.
/api/status.php — JSON: skor keamanan, keadaan modul, pengukuran beban terakhir beserta proses teratasnya, dan peristiwa keamanan selama 24 jam terakhir;/api/metrics.php — angka yang sama dalam format teks Prometheus (metrik arciveo_*: arciveo_security_score, arciveo_fail2ban_banned, arciveo_cpu_busy_pct, dan seterusnya).Jika klien Anda tidak bisa memasang header, token juga diterima sebagai parameter — ?token=…. Perlu diingat, dalam bentuk itu token akan tercatat di log akses server web, jadi header lebih dianjurkan.
Prometheus. Blok siap pakai untuk scrape_configs:
api disabled — API dimatikan di pengaturan. Permintaan yang ditolak dicatat di log aplikasi bersama IP pengirimnya, sehingga upaya menebak token terlihat pada halaman “Log aplikasi”.
Panel dipasang pada tiap server secara terpisah dan menjawab dengan baik pertanyaan “bagaimana keadaan mesin ini”. Pertanyaan “bagaimana keadaan semua mesin saya” tidak dijawabnya — untuk itu setiap panel dapat mengirim ringkasan singkat ke akun, tempat semua server terlihat dalam satu daftar.
Yang diambil di akun my.arciveo.com → bagian “Server saya”: di sana diterbitkan token (berbentuk fk_…) dan dicantumkan alamat penerima https://my.arciveo.com/api/fleet.php. Tokennya satu untuk satu akun — sama untuk semua server Anda.
Yang diatur di panel — “Pengaturan” → “Ringkasan server”: alamat penerima, token, nama server (bagaimana ia akan tertulis di daftar; jika dibiarkan kosong, dipakai domain panel), dan sakelar “Kirim ringkasan”. Tombol “Kirim sekarang” menguji sambungan seketika, tanpa menunggu jadwal.
Selanjutnya ringkasan dikirim lewat cron, setiap 15 menit:
Apa persisnya yang dikirim: nama dan domain server, sistem operasi, lama menyala, versi PHP; skor keamanan; keadaan modul (UFW, jumlah jail Fail2ban, pemblokiran hari ini, apakah CrowdSec, Suricata, dan Falco berjalan, ancaman ClamAV, perubahan AIDE, indeks Lynis, pembaruan yang menunggu, apakah perlu boot ulang, sisa hari sebelum sertifikat kedaluwarsa, jumlah port terbuka yang berbahaya); pengukuran beban terakhir (load, CPU, RAM, disk, inode); penghitung peristiwa selama 24 jam terakhir dan peristiwa kritis terakhir. Log, kata sandi, maupun isi berkas tidak ada dalam ringkasan.
sudo crontab -l), dan jawaban tombol “Kirim sekarang”. Galat pengiriman dicatat di log aplikasi dengan tanda FLEET — di sana terlihat apakah tokennya ditolak (HTTP 401) atau sambungannya sendiri yang tidak terjalin.
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. Jendela 24 jam adalah bawaannya: tombol di bagian atas mengubahnya menjadi 7 hari atau 30 hari.
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.
Dua kedalaman penyimpanan. Cuplikan “mentah” lima menit bertahan satu hari (ditambah satu jam cadangan agar titik tertua pada grafik masih punya pendahulu untuk perhitungan). Setiap jam yang selesai dilipat menjadi satu baris; deret per jam itu disimpan 30 hari dan justru itulah yang dibaca tampilan “7 hari” dan “30 hari”. Dengan begitu riwayat sebulan hanya menelan sekitar 720 baris, bukan sekitar 8600.
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.
Proses teratas. Di bawah grafik ada dua tabel berisi lima proses yang paling banyak memakai CPU:
Kedua tabel selalu menggambarkan 24 jam terakhir, bahkan saat grafik menampilkan satu bulan: cuplikan proses hanya dimiliki baris lima menit, dan baris itu tidak disimpan lebih dari sehari.
ps, skrip PHP pengumpul, dan rantai cron/sudo di atasnya) dikeluarkan dari daftar — jika tidak, mereka akan menempati baris teratas pada setiap cuplikan: ps pada saat dijalankan menunjukkan CPU hampir 100 %. Tugas cron lain yang berjalan pada menit yang sama justru tampil, dan itulah gunanya tabel ini.
Peringatan beban (bagian “Pengaturan” → “Peringatan beban”) — saat ambang CPU/RAM/disk/inode terlampaui, panel mengirim pemberitahuan melalui semua saluran yang aktif (Telegram, Email, webhook, push — sama dengan laporan harian; untuk peringatan tidak perlu mengaktifkan apa pun secara terpisah), lalu satu lagi ketika metrik kembali normal. Selama ambang masih terlampaui, panel tidak mengirim berulang-ulang: pemberitahuan 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.
Laporan harian menjawab pertanyaan “bagaimana keadaan server”. Sensor menjawab pertanyaan lain — “apa yang baru saja terjadi”. Setiap 5 menit ia menanyai sumber-sumber cepat dan mencatat hanya yang berubah sejak pemeriksaan sebelumnya; halaman “Peristiwa keamanan” di menu menampilkan daftar temuan.
Pemeriksaan lambat — Lynis, debsums, pembaruan paket, masa berlaku SSL — tidak disentuh sensor: angkanya toh hanya berubah sekali sehari dan tetap menjadi urusan laporan harian.
Apa yang diperhatikannya — sembilan sumber:
[Priority: 1] menaikkan temuan menjadi kritis;FOUND baru pada log pemindaian;root (kritis) dan login dari alamat yang belum pernah terlihat (peringatan);Perkakas yang tidak terpasang, atau yang lognya tidak dapat dibaca panel, sekadar diam — itu bukan kesalahan dan bukan peristiwa.
data/secwatch_state.json), dan jalannya yang pertama hanya menuliskan tanda itu. Kalau tidak, mengaktifkan pemantauan akan langsung mengirim pemberitahuan tentang segala hal yang terkumpul di log selama berbulan-bulan.
Pengaturan — “Pengaturan” → “Pemantauan peristiwa”:
23-7 saat peringatan tidak dikirim.Pemberitahuan berjalan lewat saluran yang sama dengan laporan harian (Telegram, Email, webhook, push) — tidak perlu mengaktifkan apa pun secara terpisah. Semua temuan ditulis ke daftar terlepas dari apakah pemberitahuan terkirim atau tidak, dan disimpan selama 90 hari.
Daftar peristiwa. Penyaring: periode (24 jam, 7, 30, atau 90 hari), tingkat kepentingan, dan sumber; ditampilkan 500 catatan terakhir. Tombol “Periksa sekarang” menjalankan pemeriksaan yang persis sama dengan cron — praktis dipakai tepat setelah pengaturan, supaya tidak perlu menunggu lima menit; tombol itu juga menyebutkan alasannya bila tidak ada pemberitahuan yang terkirim (“di bawah ambang kepentingan”, “jam tenang”, “tidak ada saluran pemberitahuan yang dikonfigurasi”). Penghitung merah di samping butir menu adalah jumlah peristiwa kritis dalam 24 jam terakhir.
Kartu alamat. Mengeklik baris di daftar peristiwa atau di blok Alamat terkait membuka semua yang diketahui tentang satu alamat: kronologi peristiwanya, negaranya, dan di baris pertama sebuah kesimpulan. Baris daftar membuka kartu bila peristiwa itu menyangkut tepat satu alamat; bila alamatnya beberapa, yang menjadi tautan adalah alamat di dalam baris. Kesimpulannya ada empat:
Di bawah kronologi ada blok Apa yang terjadi di server pada waktu yang sama: peristiwa yang sama sekali tidak punya alamat. AIDE tidak tahu siapa yang mengubah berkas, ClamAV tidak tahu siapa yang membawa berkas terinfeksi. Yang ditampilkan adalah yang jatuh dalam rentang aktivitas alamat dan enam jam sesudahnya. Justru login bersama apa yang menyusul itulah yang memisahkan percobaan dari akses yang benar-benar terjadi.
Jadwal. Tugas ini dimasukkan ke crontab root (sudo crontab -e), digeser 2 menit dari pengumpulan metrik agar keduanya tidak mulai bersamaan:
php cron/security_watch.php. Wrapper menemukan semua pemasangan panel di server dan menjalankan pemeriksaan atas nama pemilik situs — dengan hak sudo yang persis sama seperti yang dipakai panel dari web. Pemanggilan langsung dari crontab root akan membuat berkas keadaan data/secwatch_state.json dimiliki root, dan tombol “Periksa sekarang” di panel akan berhenti bekerja.
Halaman “Server web” mengurai log akses dan menunjukkan berapa banyak permintaan yang masuk, berapa bagian yang berakhir dengan galat, dan siapa yang mengirimkannya. ModSecurity menjawab pertanyaan “apa yang diblokir”, halaman ini menjawab “apa saja yang sebenarnya sampai ke situs”.
Yang terlihat: jumlah permintaan, RPS, porsi galat, penghitung 5xx tersendiri, dan volume data yang dikirim; grafik permintaan per jam; sebaran kode 2xx/3xx/4xx/5xx; alamat yang sering muncul, IP yang sering muncul, galat yang sering terjadi (kode plus jalur), dan klien (User-Agent). Periodenya: 24 jam atau 7 hari.
Sumbernya adalah log akses berformat combined, jadi Nginx maupun Apache sama-sama cocok dan tidak perlu modul tambahan. Panel mencari log di antara berkas standar:
/var/log/nginx/access.log/var/log/apache2/access.log/var/log/apache2/other_vhosts_access.log/var/log/httpd/access_logSelain itu, panel memeriksa berkas *access*.log dan *requests*.log di /var/log/nginx/, /var/log/apache2/, dan /var/log/httpd/. Dengan begitu, log yang ditulis situs ke berkasnya sendiri lewat direktif CustomLog juga ditemukan — misalnya arciveo-monitor_requests.log yang dibuat oleh penginstal Arcivéo.
Hanya satu log yang dibaca: bila Nginx berada di depan Apache, menjumlahkan dua log akan menghitung setiap permintaan dua kali. Yang diambil adalah log pertama dari daftar di atas yang ditulisi dalam sehari terakhir (berkas yang ditemukan lewat pola nama dicoba sesudahnya, dari yang terbaru); jika tidak ada yang ditulisi selama sehari, diambil log tidak kosong yang paling baru. Karena itu, log yang dikosongkan logrotate atau tertinggal dari server web yang dimatikan tidak lagi menutupi log yang aktif. Yang dibaca adalah potongan terakhir log (3 MB) dan hasilnya disimpan dalam cache selama 5 menit — jadi pada situs yang ramai, periode yang dipilih bisa saja tidak tercakup seluruhnya; cakupan sebenarnya tertulis di atas grafik.
adm, sedangkan pengguna web tidak termasuk di dalamnya. Penginstal Arcivéo menambahkannya ke grup itu; setelah instalasi manual, masalahnya diatasi wrapper kecil milik root yang hanya boleh melakukan satu hal — menampilkan log (halaman ModSecurity bekerja dengan cara yang sama). Wrapper memilih log dengan aturan yang sama seperti panel. Perintahnya ditampilkan langsung di halaman itu; ini dia juga. Tempelkan seluruhnya — ini satu perintah:
Pengguna web bisa saja berbeda dari www-data — periksa dengan pengguna apa pool PHP-FPM situs berjalan (ps -o user= -C php-fpm) dan cantumkan pengguna itu pada baris sudoers. Jika nama log tidak mengandung access maupun requests, tambahkan jalurnya di awal baris L=… di dalam wrapper.
Percobaan eksploit yang dikenal. Panel mencocokkan permintaan di log dengan tanda tangan sekitar dua puluh eksploit umum: PHP-CGI, penelusuran direktori di Apache, PHPUnit, Log4Shell, serta celah router, kamera, dan gateway VPN. Untuk setiap percobaan, panel menyatakan apakah itu bisa berhasil di server ini berdasarkan fakta: versi Apache dan PHP yang terpasang, ada tidaknya Java, dan kode respons server atas permintaan berkas. Hanya yang benar-benar bisa berhasil yang ditandai merah.
Pengamanan server web. Panel meminta setiap situs di server melalui 127.0.0.1 dan memeriksa apa yang diterima pengunjung: apakah versi server web dan PHP terlihat, apakah metode TRACE aktif, dan apakah header pelindung Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy dan Content-Security-Policy ada. Situs diambil dari alamat tempat panel dibuka dan dari berkas host virtual, jika panel bisa membacanya. Hasilnya diperbarui setiap 10 menit.
Jika ada yang kurang, satu perintah muncul di bawah tabel. Perintah ini membuat berkas terpisah, zz-arciveo-hardening.conf, dan memuat ulang server web hanya setelah uji konfigurasi lolos; header yang sudah dikirim situs tidak digandakan. CSP tidak ditawarkan sebagai satu baris: kebijakan disusun untuk situs tertentu, kalau tidak situs berhenti memuat skrip, gaya, dan fonnya sendiri. Membatalkan perubahan di Apache:
ServerSignature) tidak ditandai jika versi server web sudah tersembunyi: tanpa versi, tanda tangan hanya menampilkan nama server dan nama host.
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.Panel sudah berjalan dan di server yang sama diperlukan satu situs lagi — dengan domain sendiri di samping monitor. Setelah penyiapan otomatis, server adalah Apache + PHP-FPM biasa, jadi situs memerlukan tiga hal: direktorinya sendiri, vhost-nya sendiri, dan sertifikatnya sendiri. Panel tidak disentuh: panel mengawasi seluruh server, salinan kedua untuk domain kedua tidak diperlukan.
site2.example.com adalah alamat situs baru. Ini bisa berupa domain tersendiri (mycompany.com) maupun subdomain (shop.mycompany.com) — bagi Apache tidak ada bedanya, yang berbeda hanya rekaman DNS (langkah 1) dan penerbitan sertifikat (langkah 5). site2 hanyalah nama pendek situs: begitulah nama direktori /var/www/site2 dan berkas konfigurasi site2.conf. Nama itu tidak berkaitan dengan domain, Apache mengambil alamat hanya dari ServerName; namanya bebas — misalnya untuk shop.mycompany.com praktis memakai shop: direktori /var/www/shop, konfigurasi shop.conf.
1. DNS. Di panel DNS pada registrar domain Anda, buat rekaman A ke IP server ini:
Beberapa menit kemudian periksa: dig +short site2.example.com harus mengembalikan IP server.
2. Direktori situs.
3. vhost. Blok ditempelkan ke terminal secara utuh — jalur ke soket PHP-FPM ditentukan sendiri:
4. Aktifkan situs dan periksa konfigurasi sebelum memuat ulang:
5. SSL. certbot sudah dipasang oleh penyiapan otomatis; pada tahap ini DNS harus sudah mengarah ke server:
Domain ketiga dan seterusnya ditambahkan dengan cara yang sama — ulangi langkah 1–5 dengan mengganti domain dan direktori.
Host tidak cocok dengan satu pun ServerName (akses lewat IP atau domain orang lain yang diarahkan ke server Anda), Apache menyajikan situs aktif pertama secara alfabet dari /etc/apache2/sites-enabled/. Situs bawaan 000-default dinonaktifkan oleh penyiapan otomatis, sehingga peran “piket” itu tetap dipegang vhost panel (arciveo-monitor.conf) — hal ini tidak memengaruhi situs yang dibuka dengan namanya sendiri. Jika lewat IP harus terbuka situs lain, beri nama berkasnya agar lebih dulu secara alfabet (misalnya 000-site2.conf).
site2_error.log dan site2_access.log di /var/log/apache2/.
.htaccess-nya sendiri (front controller), dan situs bersarang akan menyajikan sesuatu yang berbeda dari yang Anda harapkan. Simpan situs berdampingan: /var/www/monitor, /var/www/site2.
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;security-watch-all.sh → /usr/local/bin/ (chmod +x) — menjalankan cron/security_watch.php milik panel atas nama pemilik situs (halaman “Peristiwa keamanan”, baris 2-57/5 pada crontab di atas); security_watch.php sudah termasuk dalam panel dan tidak perlu dipasang terpisah;fleet-push-all.sh → /usr/local/bin/ (chmod +x) — mengirim ringkasan server ke akun melalui cron/fleet_push.php milik panel (baris 3,18,33,48 di atas);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.