Panduan Keamanan

Proteksi dengan Basic Auth & IP Whitelist

Setelah panel berada di balik Nginx + HTTPS, tambahkan dua lapisan klasik namun efektif: Basic Auth berbasis htpasswd dan IP whitelist via allow/deny. Lengkapi dengan fail2ban untuk menghalau brute force.

Strategi Berlapis

  1. HTTPS — wajib, agar kredensial Basic Auth tidak terkirim polos.
  2. IP whitelist — hanya jaringan tepercaya yang boleh mencoba.
  3. Basic Auth — username & password untuk yang lolos filter IP.
  4. fail2ban — blokir IP yang berkali-kali gagal.
Lapisan IP dievaluasi sebelum prompt password muncul, jadi penyerang di luar whitelist bahkan tidak akan melihat dialog login.

Langkah 1 — Buat .htpasswd

# pasang utilitas htpasswd
sudo apt install -y apache2-utils      # Debian/Ubuntu
sudo dnf install -y httpd-tools        # AlmaLinux/RHEL

# -c membuat file baru, -B memakai bcrypt (kuat)
sudo htpasswd -B -c /etc/nginx/.htpasswd admin

# tambah user lain (tanpa -c agar tidak menimpa file)
sudo htpasswd -B /etc/nginx/.htpasswd devops
Gunakan -c hanya saat pertama kali. Menjalankannya lagi akan menimpa seluruh file dan menghapus user lain.

Langkah 2 — Aktifkan auth_basic

server {
    listen 443 ssl http2;
    server_name panel.contoh.com;
    # ... blok ssl dari panduan sebelumnya ...

    location / {
        auth_basic           "Area Terbatas nusabet88";
        auth_basic_user_file /etc/nginx/.htpasswd;

        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host            $host;
        proxy_set_header X-Real-IP       $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
sudo nginx -t && sudo systemctl reload nginx

Langkah 3 — IP Whitelist

Batasi akses hanya dari subnet kantor atau IP exit VPN. Urutan penting: allow dulu, lalu deny all.

    location / {
        # jaringan tepercaya
        allow 203.0.113.0/24;     # subnet kantor
        allow 198.51.100.10;      # IP exit VPN
        deny  all;                # tolak sisanya

        auth_basic           "Area Terbatas nusabet88";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://127.0.0.1:8080;
    }
Kombinasi terbaik: izinkan hanya IP VPN lewat allow/deny, lalu tetap minta Basic Auth. Penyerang harus berada di VPN dan tahu kredensial.
Jika Nginx berada di belakang CDN/load balancer, $remote_addr bisa berisi IP proxy. Gunakan modul realip dan set_real_ip_from agar whitelist mengevaluasi IP asli klien.

Langkah 4 — fail2ban Anti Brute Force

# /etc/fail2ban/jail.d/nginx-auth.conf
[nginx-http-auth]
enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
maxretry = 5
findtime = 600
bantime  = 3600
# aktifkan & cek status jail
sudo systemctl enable --now fail2ban
sudo fail2ban-client status nginx-http-auth

Filter nginx-http-auth sudah disertakan fail2ban dan mengenali baris user ... password mismatch di error log. Setelah 5 kegagalan dalam 10 menit, IP diblokir 1 jam.

Tips Keamanan Tambahan

  • Pakai password panjang dan unik per user; rotasi berkala.
  • Jangan menaruh .htpasswd di dalam webroot yang bisa diakses publik.
  • Selalu pasang Basic Auth bersama HTTPS, tidak pernah sendirian di HTTP.
  • Catat dan audit log akses; perhatikan lonjakan 401.
  • Pertimbangkan mTLS atau SSO/OAuth proxy untuk tim besar.

Kesimpulan

  • Buat .htpasswd dengan htpasswd -B (bcrypt), bukan format lama yang lemah.
  • Pasang auth_basic di blok location dan kombinasikan dengan allow/deny.
  • VPN + Basic Auth = dua faktor independen yang harus ditembus penyerang.
  • fail2ban memblokir otomatis IP yang gagal autentikasi berulang.

FAQ Basic Auth & IP Whitelist

Apakah Basic Auth saja cukup untuk mengamankan panel?

Basic Auth adalah lapisan pertama yang baik, tetapi sebaiknya dikombinasikan dengan HTTPS (agar kredensial tidak dikirim polos) dan pembatasan IP atau VPN. Basic Auth tanpa TLS sama dengan mengirim password dalam teks biasa. Lapisan berganda jauh lebih sulit ditembus.

Algoritma apa yang dipakai htpasswd?

Secara default htpasswd modern memakai bcrypt bila Anda menambahkan flag -B. Hindari format lama seperti crypt atau MD5 (apr1) untuk produksi. Gunakan htpasswd -B agar hash kuat dan tahan brute force.

Bagaimana membatasi akses hanya dari kantor atau VPN?

Gunakan direktif allow/deny (modul ngx_http_access_module) di blok location. Daftarkan subnet kantor atau IP gateway VPN dengan allow, lalu deny all untuk sisanya. Pendekatan ini efektif bila tim memakai IP statis atau VPN dengan exit IP tetap.

Apa fungsi fail2ban di sini?

fail2ban memantau log Nginx dan memblokir IP yang berkali-kali gagal autentikasi. Ini melindungi dari brute force terhadap Basic Auth. Anda mendefinisikan filter untuk pola 401 lalu jail yang memblokir IP pelanggar lewat firewall selama durasi tertentu.

Lengkapi Hardening Produksi

Lihat praktik terbaik keamanan menyeluruh untuk cluster dan panel di lingkungan produksi.

Best Practices Keamanan