Instalasi manual sepenuhnya: dari VPS yang baru dibeli hingga dashboard yang berfungsi, langkah demi langkah.
Penyiapan server, pembuatan situs, basis data, config.php dan SSL diuraikan di sini.
Perintah untuk tiap alat keamanan dan cron ada di
rujukan FAQ, tautan tersedia sepanjang jalan.
Aturan utama: saat mengubah SSH atau firewall, jangan tutup koneksi yang sedang aktif sebelum memverifikasi yang baru di jendela terpisah. Jika akses tetap hilang — hampir semua hoster menyediakan konsol darurat (VNC/Recovery) di panel kontrol.
01. Membeli VPS dengan Ubuntu/Debian — mulai dari mana
Setelah pembelian, penyedia hosting mengirimkan: alamat IP, nama pengguna (biasanya root) dan kata sandi (atau kunci SSH). Ini sudah cukup untuk masuk. Urutan langkahnya (tiap langkah dibahas di bagian bawah):
Sambungkan ke server melalui SSH;
Perbarui sistem, atur nama host dan zona waktu;
Buat pengguna biasa dengan hak sudo (jangan bekerja sebagai root);
Atur login dengan kunci SSH dan nonaktifkan login dengan kata sandi;
Aktifkan firewall dan proteksi otomatis;
(opsional) pasang panel kontrol HestiaCP — server web, basis data, email “siap pakai”.
02. Koneksi SSH pertama
SSH adalah terminal aman ke server. Ganti 203.0.113.10 dengan IP Anda sendiri.
203.0.113.10 hanyalah contoh, alamat yang tidak ada (dicadangkan untuk dokumentasi). Jangan memasukkannya apa adanya — ganti dengan IP asli server Anda dari email hosting. Kalau tidak, koneksi tidak akan terjadi.
Windows 10/11: buka PowerShell atau "Terminal" dan gunakan ssh bawaan (atau klien PuTTY / MobaXterm). macOS / Linux: buka "Terminal".
# Masuk sebagai root (kata sandi dari hosting):
ssh root@203.0.113.10
# Jika hosting memberi file-kunci alih-alih kata sandi:
ssh -i path/ke/kunci root@203.0.113.10
Saat koneksi pertama, SSH akan bertanya tentang "authenticity of host" — ketik yes. Kata sandi tidak ditampilkan saat diketik (ini normal). Jika hosting memberi kata sandi sementara — ganti dengan perintah passwd.
03. Pembaruan sistem dan konfigurasi dasar
Langkah pertama — perbarui semua paket lalu atur nama host dan zona waktu.
# Perbarui sistem:
apt update && apt upgrade -y
# Utilitas dasar:
apt install -y curl wget ufw fail2ban unattended-upgrades
# Zona waktu (contoh) dan nama host:
timedatectl set-timezone Asia/Jakarta
hostnamectl set-hostname myserver
# Pembaruan keamanan otomatis:
dpkg-reconfigure -plow unattended-upgrades
Daftar zona waktu — timedatectl list-timezones. Jika di akhir pembaruan muncul jendela biru “Daemons using outdated libraries” — tandai semua layanan (Spasi) lalu tekan OK, ini aman.
04. Membuat pengguna dengan sudo
Bekerja terus-menerus sebagai root tidak aman. Buat pengguna biasa dan beri hak sudo (menjalankan perintah admin bila diperlukan). Ganti deploy dengan nama apa pun.
# Buat pengguna (akan meminta kata sandi dan data lain — boleh Enter):
adduser deploy
# Tambahkan ke grup sudo:
usermod -aG sudo deploy
# Periksa (sebagai root):
su - deploy
sudo whoami # harus menampilkan: root
exit
Selanjutnya masuk ke server dengan pengguna ini: ssh deploy@203.0.113.10, dan jalankan perintah administrator dengan awalan sudo.
05. Kunci SSH dan menonaktifkan login dengan kata sandi
Login dengan kunci lebih aman daripada kata sandi: kata sandi bisa ditebak, kunci hampir mustahil. Pertama buat kunci di komputer Anda, salin ke server, uji login — baru setelah itu nonaktifkan kata sandi.
Langkah 1. Buat kunci di komputer Anda (Windows PowerShell / macOS / Linux):
ssh-keygen -t ed25519 -C "my-laptop"
# Enter untuk semua pertanyaan (kunci tersimpan di ~/.ssh/id_ed25519)
Langkah 3. Uji login dengan kunci di jendela baru — seharusnya masuk tanpa kata sandi:
ssh deploy@203.0.113.10
Jangan jalankan Opsi B sebelum login dengan kunci diverifikasi dan berfungsi (Langkah 1–3), dan jangan tutup sesi yang sedang aktif. Opsi ini menonaktifkan login dengan kata sandi untuk semua pengguna, termasuk root. Tanpa kunci yang berfungsi, Anda akan kehilangan akses ke server sepenuhnya — dan hanya bisa memulihkannya lewat konsol hosting. Tidak punya kunci — pakai Opsi A.
Langkah 4. Perketat akses SSH. Pengaturan diletakkan di file terpisah, konfigurasi utama tidak disentuh. Pilih opsi sesuai situasi:
Opsi A — hanya tutup root, kata sandi tetap. Tidak perlu kunci, akses tidak hilang:
Opsi B — hardening penuh. Nonaktifkan login dengan kata sandi dan biarkan root hanya lewat kunci. Jalankan hanya setelah memastikan login dengan kunci berfungsi:
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password
KbdInteractiveAuthentication no
EOF
sudo systemctl restart ssh
Pada kedua opsi, root lewat kata sandi ditutup. PermitRootLogin no melarang root sepenuhnya, prohibit-password hanya menyisakan login dengan kunci (untuk administrasi, login sebagai deploy dan gunakan sudo). Jika ingin mengganti port SSH — tambahkan baris Port 2222, tapi pertama buka port baru di firewall (bagian berikutnya) dan uji login, jika tidak Anda akan mengunci akses Anda sendiri.
06. Firewall dasar dan proteksi otomatis
Tutup semua yang tidak perlu dengan firewall dan aktifkan fail2ban (memblokir upaya menebak kata sandi via SSH). Terlebih dahulu izinkan SSH, jika tidak Anda akan kehilangan akses setelah UFW diaktifkan.
# Izinkan SSH (atau port Anda jika diubah) dan web:
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
# Aktifkan firewall:
sudo ufw enable
sudo ufw status verbose
# fail2ban — proteksi SSH dari brute force (profil dasar langsung aktif):
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Ini adalah minimum. Konfigurasi fail2ban yang siap pakai, blok-list ipsum, UFW lanjutan, dan alat lainnya ada di grup “Alat keamanan” pada panduan. Panel Arcivéo Monitor sendiri akan menampilkan status semuanya dengan jelas.
07. Instalasi panel HestiaCP (opsional)
HestiaCP — panel kontrol hosting gratis: memasang dan mengonfigurasi server web (nginx + apache), PHP, basis data (MariaDB), email, DNS, dan sertifikat SSL, serta menyediakan antarmuka web untuk situs. Praktis jika tidak ingin mengatur semuanya secara manual dan berencana menempatkan situs (termasuk panel Arcivéo Monitor itu sendiri).
Pasang HestiaCP di server yang bersih (Ubuntu/Debian versi baru yang didukung, minimal ~1–2 GB RAM), sebelum memasang server web dan basis data lain — jika tidak, akan terjadi konflik. Instalasi memakan waktu 10–20 menit dan akan me-reboot server.
# Unduh installer dan jalankan:
wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
sudo bash hst-install.sh
Installer akan menanyakan email dan nama host, lalu memasang seluruh stack. Setelah reboot, panel dapat diakses di https://YOUR_IP:8083 (login dan kata sandi ditampilkan installer di akhir).
HestiaCP mengelola sendiri UFW dan fail2ban — tidak perlu mengaturnya secara terpisah, ia akan menanganinya. Kunci SSH dan penonaktifan kata sandi (bagian sebelumnya) tetap perlu Anda lakukan.
08. Persyaratan sistem dan ionCube
Dashboard adalah aplikasi PHP di atas stack LAMP/LEMP standar:
OS: Linux (disarankan Ubuntu/Debian);
Server web: nginx atau Apache dengan PHP-FPM;
PHP 8.0+ dengan ekstensi: pdo_mysql, openssl, curl, json, mbstring;
ionCube Loader — ekstensi PHP yang diperlukan agar dashboard berjalan;
Basis data: MySQL 5.7+ atau MariaDB 10.3+;
HTTPS — wajib (login dan WebAuthn hanya bekerja via https);
sudo untuk pengguna server web (set terbatas — langkah 13).
# Periksa versi PHP dan ekstensi:
php -v
php -m | grep -iE 'pdo_mysql|openssl|curl|mbstring|ioncube'
Instalasi ionCube Loader (jika belum terpasang). Pada hosting dengan panel (HestiaCP, cPanel) ionCube diaktifkan dengan centang di pengaturan PHP. Secara manual di Ubuntu/Debian:
# Cek versi PHP dan direktori ekstensi:
php -v
EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
# Unduh dan ekstrak loader (64-bit):
cd /tmp
wget -q https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xzf ioncube_loaders_lin_x86-64.tar.gz
# Salin loader sesuai versi PHP Anda ke direktori ekstensi:
sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/
# Aktifkan (CLI + PHP-FPM) dan mulai ulang:
echo "zend_extension=ioncube_loader_lin_${PHPVER}.so" | sudo tee /etc/php/${PHPVER}/mods-available/ioncube.ini
sudo phpenmod ioncube
sudo systemctl restart php${PHPVER}-fpm
# Verifikasi — pada output muncul baris "with the ionCube PHP Loader":
php -v
Versi loader harus sesuai dengan versi PHP (misalnya ioncube_loader_lin_8.1.so untuk PHP 8.1). Jika menggunakan beberapa versi PHP — aktifkan loader untuk masing-masing.
09. Domain dan DNS
Agar dashboard bisa dibuka di alamat seperti monitor.example.com dan mendapat SSL gratis — Anda perlu domain yang mengarah ke server Anda. Di panel kelola DNS, buat A-record:
Tipe: A
Nama: monitor (subdomain → monitor.example.com)
atau @ (root domain → example.com)
Nilai: 203.0.113.10 ← IP server Anda
TTL: 3600
Beberapa menit kemudian, periksa bahwa domain mengarah ke server:
dig +short monitor.example.com # harus mengembalikan IP Anda
# atau, jika dig tidak ada:
getent hosts monitor.example.com
Sertifikat SSL Let's Encrypt hanya diterbitkan untuk domain — DNS harus mengarah ke server sebelum sertifikat diterbitkan.
10. Buat situs dan unggah berkas panel
Apache: DocumentRoot — ke root panel, BUKAN ke public/. Gaya (CSS/JS), sw.js, manifest.json berada di assets/ berdampingan dengan public/ dan diminta dari root situs. .htaccess di root adalah front controller. Jika di Apache DocumentRoot diarahkan ke public/, panel akan terbuka tanpa gaya. Untuk nginx murni justru sebaliknya: public/ dijadikan root, sedangkan assets/ dilayani dengan aturan terpisah (lihat blok nginx di bawah).
Berkas panel (arsip distribusi) diunduh setelah pembelian di akun my.arciveo.com → “Unduhan”. Ekstrak arsip sebelum diunggah.
1) Buat direktori panel dan unggah ke dalamnya isi distribusi (agar di dalamnya terdapat public/, assets/, config.php, dan lain-lain):
sudo mkdir -p /var/www/monitor
# lalu unggah berkas distribusi ke /var/www/monitor (FileZilla / WinSCP / scp)
2) Konfigurasikan server web.Apache: DocumentRoot — ke root panel (BUKAN ke /public); AllowOverride All wajib. Jalur ke soket PHP-FPM ditentukan otomatis. Blok ditempel ke terminal secara utuh:
nginx: nginx tidak punya .htaccess, jadi public/ dijadikan root, sedangkan assets/, sw.js, manifest.json (satu tingkat di atas) dilayani dengan aturan terpisah:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # deteksi otomatis soket PHP-FPM
sudo tee /etc/nginx/sites-available/monitor.conf > /dev/null <<'EOF'
server {
listen 80;
server_name monitor.example.com;
root /var/www/monitor/public;
index index.php;
# assets, service worker dan manifest berada satu tingkat di atas public/
location ~ ^/(assets/|sw\.js|manifest\.json) { root /var/www/monitor; }
location / { try_files $uri $uri/ /index.php?$query_string; }
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:__PHPSOCK__;
}
}
EOF
sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/nginx/sites-available/monitor.conf
sudo ln -s /etc/nginx/sites-available/monitor.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Unggah berkas — SFTP/SCP (FileZilla, WinSCP) atau scp:
# Contoh via scp dari komputer lokal:
scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Atur hak akses berkas — ini langkah wajib. Jika mengunggah sebagai root atau lewat SFTP, berkas milik root, dan server web (www-data) tidak akan bisa membacanya — panel akan terbuka kosong atau dengan galat 403 (di log: .htaccess unreadable / directory not executable). Perintah di bawah memperbaikinya:
# Normalisasi hak akses seluruh webroot: direktori yang dibuat root tidak dapat diakses
# server web (www-data) — tanpa ini panel menampilkan halaman kosong atau 403.
# Apache berjalan sebagai www-data; jika pengguna web Anda berbeda — ganti.
cd /var/www/monitor
# Folder kerja dibuat SEBELUM chown — jika tidak, direktori baru akan tetap root:root
# dan saat chmod 750 server web (www-data) tidak bisa menulis ke dalamnya.
sudo mkdir -p data/lynis data/logwatch tmp logs
sudo chown -R www-data:www-data /var/www/monitor
sudo find /var/www/monitor -type d -exec chmod 755 {} \;
sudo find /var/www/monitor -type f -exec chmod 644 {} \;
sudo chmod 640 /var/www/monitor/config.php
sudo chmod 750 data tmp logs
3) Buka akses unggah file lewat SFTP untuk diri Anda. Setelah perintah di atas semua file dimiliki www-data, sedangkan FileZilla / WinSCP terhubung sebagai pengguna Anda sendiri — unggahan lalu gagal dengan SSH_FX_PERMISSION_DENIED (Permission denied). Masuk sebagai root untuk mengunggah bukan pilihan — login root sudah dimatikan pada langkah 05. Pilih salah satu dari dua opsi.
Opsi A — ACL hanya untuk pengguna Anda (disarankan). Hak tulis hanya Anda yang dapat; server web tetap tidak bisa menimpa kode panel:
sudo apt install -y acl
# Hak tulis untuk pengguna Anda pada seluruh direktori panel:
sudo setfacl -R -m u:deploy:rwX /var/www/monitor
# Aturan yang sama sebagai bawaan — untuk file dan folder yang dibuat kemudian:
sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor
Opsi B — lewat grup www-data. Lebih sederhana, tetapi hak tulis ke file panel juga didapat server web: bila ada celah di PHP, kode bisa diganti. Urutan perintah penting — config.php dan folder kerja ditutup paling akhir:
sudo usermod -aG www-data deploy
# Hak tulis untuk grup + setgid (bit 2): file yang diunggah lewat SFTP tetap
# berada di grup www-data — jika tidak, panel tak bisa menimpanya.
sudo find /var/www/monitor -type d -exec chmod 2775 {} \;
sudo find /var/www/monitor -type f -exec chmod 664 {} \;
sudo chmod 640 /var/www/monitor/config.php
sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
Setelah opsi B, sambungkan ulang di FileZilla (Server → Putuskan sambungan, lalu masuk lagi) — grup baru hanya berlaku pada login baru, sebelum itu izin tetap belum ada. Pemeriksaan: id deploy — pada daftar grup harus muncul www-data; ls -ld /var/www/monitor — izin drwxrwsr-x, huruf s menggantikan x berarti setgid sudah aktif.
11. Basis data
Buat basis data dan pengguna, lalu impor skema. Blok ini disisipkan ke terminal secara utuh. monitor_db dan monitor_user hanyalah nama contoh, Anda bebas menentukan nama sendiri; catat nama basis data, pengguna, dan kata sandinya — Anda akan memasukkannya ke config.php pada langkah berikutnya:
# 1. Basis data. Kata sandi diatur SEKALI di DBPASS dan disisipkan ke semua baris.
# Blok disisipkan ke terminal SECARA UTUH; sudo mysql masuk sebagai root via unix-socket
# (kata sandi root tidak diperlukan). JANGAN gunakan `sudo mysql -u root -p` interaktif
# dengan copy-paste — saat menyisipkan, baris SQL akan masuk ke prompt kata sandi dan hilang.
DBPASS='CHOOSE_A_PASSWORD' # ← ubah hanya baris ini
sudo mysql <<SQL
CREATE DATABASE IF NOT EXISTS monitor_db CHARACTER SET utf8mb4;
CREATE USER IF NOT EXISTS 'monitor_user'@'localhost' IDENTIFIED BY '$DBPASS';
GRANT ALL ON monitor_db.* TO 'monitor_user'@'localhost';
FLUSH PRIVILEGES;
SQL
# Pemeriksaan (harus menampilkan monitor_db):
mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;"
# Kata sandi yang sama masukkan ke config.php → DB_PASS.
Skema tidak perlu diimpor — dashboard membuat tabel dan akun admin secara otomatis saat pertama kali dibuka di browser (dari database/db.sql), jika basis data kosong. Impor skema manual hanya diperlukan bila inisialisasi otomatis gagal.
Jika Anda memakai installer browser public/start_db.php — hapus segera setelah instalasi: file itu memungkinkan pembuatan ulang basis data tanpa otorisasi. Selama file berada di root dashboard atau di public/, dashboard menampilkan peringatan merah.
12. Konfigurasi config.php
config.php di root panel (/var/www/monitor/config.php) adalah satu-satunya file yang perlu diedit secara manual. Semua pengaturan panel didefinisikan di dalamnya sebagai konstanta define(). Buka dengan editor:
sudo nano /var/www/monitor/config.php
Isikan nilai Anda pada bagian yang disorot; sisanya biarkan apa adanya:
// --- Basis data (dari langkah 11) ---
define('DB_HOST', 'localhost'); // biarkan
define('DB_NAME', 'db_name'); // yang dibuat di langkah 11
define('DB_USER', 'user'); // yang dibuat di langkah 11
define('DB_PASS', 'db_password'); // yang diatur di langkah 11
define('DB_CHARSET', 'utf8mb4'); // biarkan
// --- Aplikasi ---
define('APP_URL', 'https://monitor.example.com'); // alamat panel, tanpa garis miring di akhir
define('TIMEZONE', 'Asia/Jakarta'); // zona waktu Anda
// --- Waktu sesi ---
define('SESSION_LIFETIME', 28800); // idle sampai login ulang, detik (28800 = 8 jam)
Yang perlu diubah:
DB_NAME, DB_USER, DB_PASS — persis nama basis data, pengguna, dan kata sandi yang Anda tetapkan saat membuat basis data di langkah 11 (jika contoh dibiarkan — monitor_db / monitor_user). Jangan ubah DB_HOST dan DB_CHARSET.
APP_URL — alamat lengkap panel dengan https://, tanpa garis miring di akhir dan tanpa www. Harus sama dengan domain tempat Anda mengaktifkan lisensi (langkah 16), jika tidak, key akan ditolak.
TIMEZONE — zona waktu Anda (daftar — timedatectl list-timezones). Hanya memengaruhi cara panel menampilkan tanggal; waktu peluncuran tugas cron tidak terpengaruh (di situ berlaku zona sistem).
SESSION_LIFETIME — setelah berapa detik tidak aktif panel akan meminta login ulang (bawaan 8 jam). Mis. 3600 = 1 jam, 86400 = sehari.
Blok pencatatan galat (display_errors, log_errors, error_log) — biarkan sesuai bawaan.
Simpan file (Ctrl+O, Enter, lalu Ctrl+X) dan mulai ulang PHP-FPM — jika tidak, perubahan tidak akan diterapkan karena OPcache:
sudo systemctl restart php*-fpm
config.php — file rahasia (berisi kata sandi basis data). File ini berada di root panel, yang juga merupakan web-root, tetapi tertutup: hak akses 640 (diatur di langkah 10) dan larangan eksplisit di .htaccess root. Jangan unggah ke repositori publik dan jangan kirim ke dukungan dengan kata sandi asli.
PHP dijalankan sebagai pengguna server web yang tidak punya hak atas perintah sistem. Akses diberikan secara sempit: sudo terarah pada utilitas tertentu dan pembacaan log lewat grup (tanpa sudo). Peretasan lapisan web tidak memberikan root.
Dalam contoh, www-data adalah pengguna standar Apache. Jika milik Anda berbeda (di beberapa panel PHP berjalan sebagai pengguna terpisah) — ganti di semua tempat. Cek: ps -o user= -C php-fpm | sort -u.
1. Buat /etc/sudoers.d/monitor lewat sudo visudo -f /etc/sudoers.d/monitor dan tempelkan (hapus baris modul yang tidak dipakai):
# UFW — status dan aturan (halaman “Firewall”)
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw status, /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw allow [0-9]*, /usr/sbin/ufw deny [0-9]*, /usr/sbin/ufw --force delete [0-9]*
# Fail2ban — status, ban dan unban (banned mengembalikan ban semua jail dengan satu perintah;
# ban/unban dibutuhkan tombol dashboard)
www-data ALL=(ALL) NOPASSWD: /usr/bin/fail2ban-client status, /usr/bin/fail2ban-client status *, /usr/bin/fail2ban-client banned, /usr/bin/fail2ban-client set * banip *, /usr/bin/fail2ban-client set * unbanip *
# Pembaruan keamanan (kartu “Pembaruan”). Hanya baca, tapi memang harus dari root:
# cache apt (~70 MB) hanya bisa diakses root, non-root membangunnya ulang setiap panggilan
# (4.2 d CPU dibanding 0.01 d). Tanpa wildcard — persis perintah tunggal ini, tidak memasang apa pun.
www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable
# IPset (peta serangan, dashboard)
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ipset list -t ipsum
# CrowdSec
www-data ALL=(ALL) NOPASSWD: /usr/bin/cscli decisions list *, /usr/bin/cscli alerts list *, /usr/bin/cscli bouncers list *, /usr/bin/cscli scenarios list *
# Auditd — pencarian peristiwa + pembacaan baris terakhir log (jalur tepat)
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ausearch -m *
www-data ALL=(ALL) NOPASSWD: /usr/bin/tail -n 300 /var/log/audit/audit.log
# Monit / ModSecurity / AppArmor / PSAD
www-data ALL=(ALL) NOPASSWD: /usr/bin/monit status
www-data ALL=(ALL) NOPASSWD: /usr/sbin/apache2ctl -M
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-modsec
www-data ALL=(ALL) NOPASSWD: /usr/sbin/aa-status
www-data ALL=(ALL) NOPASSWD: /usr/sbin/psad --Status
# Port terbuka (log kernel/SSH/Falco dibaca TANPA sudo — lewat grup
# systemd-journal, lihat poin 2; sudo untuk journalctl TIDAK perlu diberikan dan tidak aman)
www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln
# PostgreSQL (hanya jika dipakai) — skrip read-only tetap,
# buat sesuai FAQ “PostgreSQL tidak tampil”; tanpanya hapus baris ini
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
2. Akses ke log dan jurnal systemd. Modul membaca /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide secara langsung (di Debian/Ubuntu log ini ada di grup adm). Peristiwa kernel, SSH, dan Falco diambil dari journald dengan perintah journalctltanpa sudo, lewat grup systemd-journal. Tambahkan pengguna web ke kedua grup dan mulai ulang PHP-FPM:
sudo usermod -aG adm,systemd-journal www-data
sudo systemctl restart php*-fpm # wajib, jika tidak grup tidak akan diterapkan
3. Jika ClamAV atau Suricata menulis log bukan ke grup adm (kadang root:root) — beri akses lewat ACL:
4. Pembungkus ModSecurity. Log audit WAF (/var/log/apache2/modsec_audit.log) dimiliki root dengan hak 640, pengguna web tidak bisa membacanya langsung. Halaman ModSecurity mengambil mode mesin, peristiwa, dan daftar aturan aktif lewat skrip read-only tetap — inilah yang diizinkan dalam sudoers pada baris di atas:
Tanpa file /etc/modsecurity/modsecurity.conf, WAF sendiri tidak bekerja: paket hanya menaruh modsecurity.conf-recommended, dan mesin aturan tetap nonaktif — cara mengaktifkannya lihat FAQ → “Instalasi ModSecurity”.
Pengguna di semua baris sudoers harus sama dengan pengguna pool FPM: pada Apache/Debian biasa ini www-data, di HestiaCP pool situs berjalan sebagai pemilik situs (misalnya admin) — periksa grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.
5. Jika di depan Apache ada Nginx (HestiaCP, ISPmanager, dan panel lain — di sana Nginx mem-proxy PHP ke Apache, dan menyajikan konten statis sendiri). Direktori layanan ditutup dengan file .htaccess, tetapi Nginx tidak membacanya: setiap file statis (.json, .txt, .log, .dat) akan disajikannya langsung, melewati Apache. Cache panel dan data akan bocor keluar — misalnya tmp/modsec_cache.json berisi peristiwa WAF dan IP penyerang. Tambahkan larangan ke konfigurasi situs Nginx:
Prefiks ^~ wajib: ia dipilih lebih dulu daripada aturan reguler untuk konten statis di dalam location /, jika tidak larangan tidak akan berlaku.
Di HestiaCP taruh ini sebagai file terpisah /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny (dan nginx.conf_deny untuk HTTP) — konfigurasi situs menyertakan nginx.ssl.conf_* dan saat pembangunan ulang file seperti itu tidak ditimpa. Terapkan: sudo nginx -t && sudo systemctl reload nginx.
Pemeriksaan: curl -s -o /dev/null -w '%{http_code}\n' https://monitor.example.com/tmp/modsec_cache.json — harusnya 403. Jika Apache bekerja tanpa Nginx (mendengarkan 80/443 sendiri), tidak perlu menambahkan apa pun — .htaccess sudah cukup.
Periksa jalur biner lewat which (misalnya which ufw cscli ausearch ss). Sunting sudoers hanya lewat visudo. Daftar semua basis data MySQL diaktifkan dengan GRANT terpisah (FAQ → “Hanya satu basis data yang tampil”).
14. Pembatasan akses berdasarkan IP
Batasi akses ke monitor berdasarkan alamat IP — meskipun URL diketahui, halaman login tidak akan terbuka. Bisa dilakukan di tingkat server web (contoh untuk nginx di bawah) atau di panel itu sendiri (“Setelan” → “Pembatasan akses berdasarkan IP”). Jika Anda memakai Apache, gunakan pembatasan di panel.
Jika situs nginx sudah dikonfigurasi pada langkah 10, jangan tambahkanlocation / kedua — tuliskan baris allow/deny ke dalam blok yang sudah ada. Dua location / yang sama dalam satu server { } adalah kesalahan konfigurasi, nginx tidak akan restart.
# Di konfig nginx (di dalam server { }):
# Jalur ACME Let's Encrypt tetap dibuka melewati pembatasan IP —
# agar penerbitan dan perpanjangan otomatis SSL (langkah 15) tidak bergantung pada filter IP.
location ^~ /.well-known/acme-challenge/ { allow all; }
location / {
allow 203.0.113.10; # ← tuliskan IP Anda
allow 10.0.0.0/8; # jaringan lokal (jika perlu)
deny all;
try_files $uri $uri/ /index.php?$query_string;
}
# Muat ulang nginx:
sudo nginx -t && sudo systemctl reload nginx
15. Terbitkan SSL (HTTPS)
Dashboard hanya berjalan lewat HTTPS. Sesi login memakai cookie aman, dan WebAuthn (2FA) hanya bekerja di HTTPS. Melalui http:// Anda tidak bisa masuk.
Sertifikatnya gratis (Let's Encrypt). DNS domain harus sudah mengarah ke server. Perintahnya tergantung web server:
# Apache:
sudo certbot --apache -d monitor.example.com
# nginx — HANYA jika Anda memang memakai nginx. Di Apache JANGAN jalankan:
# apt akan menarik nginx dan menempati port 80, konflik dengan Apache.
# sudo apt install python3-certbot-nginx
# sudo certbot --nginx -d monitor.example.com
# certbot akan menuliskan HTTPS ke konfig dan mengatur perpanjangan otomatis
Yang akan ditanyakan certbot: e-mail → persetujuan Terms (Y) → pengiriman e-mail ke EFF (terserah Anda). Setelah itu ia akan menerbitkan sertifikat, menuliskan <VirtualHost *:443>, mengatur pengalihan http→https dan perpanjangan otomatis.
DNS harus mengarah ke server SEBELUM menjalankan certbot (verifikasi kepemilikan lewat port 80). Cek: dig +short monitor.example.com → IP server. Port 80/443 terbuka: sudo ufw allow 80,443/tcp.
Setelah diterbitkan: https://monitor.example.com terbuka dengan ikon gembok, http:// dialihkan ke https:// (APP_URL di config.php sudah diatur pada langkah 12).
16. Masuk dan pengaturan awal
Buka https://monitor.example.com, masuk dengan admin / useradmin dan ikuti daftar periksa:
Ganti kata sandi admin — bagian “Pengguna” di menu.
Aktifkan WebAuthn (2FA) — “Kunci WebAuthn” → daftarkan kunci/passkey (memerlukan HTTPS). Daftarkan langsung dua sekaligus: jika satu-satunya kunci hilang, Anda tidak akan bisa masuk dengannya. Selengkapnya.
Batasi akses berdasarkan IP — “Pengaturan” → “Pembatasan akses berdasarkan IP” (masukkan IP Anda sebelum mengaktifkan, jika tidak akses Anda akan terblokir).
Masukkan lisensi — aktifkan kode ARCIVEO-… dari akun ke domain Anda dan tempel kunci di “Pengaturan” → “Lisensi”. Selengkapnya.
Atur notifikasi — Telegram dan/atau Email di “Pengaturan”. Selengkapnya.
Hapus penginstalpublic/start_db.php, jika masih ada (langkah 11).
17. Alat keamanan (opsional)
Panel sudah berjalan. Alat dipasang sesuai kebutuhan — pasang yang Anda perlukan, dan panel langsung menampilkan statusnya. Perintah pemasangan masing-masing ada di panduan (bagian terpisah per alat):
Ini demo Arcivéo Security Monitor hanya untuk dilihat — semua perubahan dinonaktifkan. Pasang di server Anda sendiri untuk mengelola data keamanan sungguhan.