Basic Auth

Basic Auth #

HTTP Basic Authentication adalah cara paling sederhana untuk melindungi area tertentu di Nginx dengan username dan password. Browser akan menampilkan dialog popup meminta kredensial, dan Nginx memverifikasinya sebelum meneruskan request.

Ini bukan mekanisme autentikasi yang paling canggih, tapi sangat berguna untuk melindungi hal-hal seperti halaman admin, dashboard monitoring, atau endpoint internal yang tidak perlu login yang rumit.

Membuat File Password #

Nginx membaca username dan password dari file yang formatnya sama dengan .htpasswd Apache. Tool yang digunakan untuk membuatnya adalah htpasswd dari paket apache2-utils:

# Install htpasswd (Ubuntu/Debian)
sudo apt install apache2-utils -y

# Buat file password baru dengan user pertama
# -c: buat file baru (create), akan menimpa jika sudah ada
sudo htpasswd -c /etc/nginx/.htpasswd username1

# Tambah user berikutnya ke file yang sama (tanpa -c)
sudo htpasswd /etc/nginx/.htpasswd username2

# Hapus user dari file
sudo htpasswd -D /etc/nginx/.htpasswd username1

# Lihat isi file (password tersimpan sebagai hash, bukan plaintext)
cat /etc/nginx/.htpasswd
# username1:$apr1$xyz...$hashedpassword
# username2:$apr1$abc...$hashedpassword

Atur permission file agar hanya bisa dibaca Nginx:

sudo chmod 640 /etc/nginx/.htpasswd
sudo chown root:www-data /etc/nginx/.htpasswd

Konfigurasi di Nginx #

server {
    listen 443 ssl;
    server_name example.com;

    # Proteksi seluruh site
    auth_basic "Area Terbatas";        # Teks yang muncul di dialog browser
    auth_basic_user_file /etc/nginx/.htpasswd;

    location / {
        try_files $uri $uri/ =404;
    }
}

Atau melindungi path tertentu saja:

server {
    listen 443 ssl;
    server_name example.com;

    root /var/www/html;

    # Path ini bebas diakses
    location / {
        try_files $uri $uri/ =404;
    }

    # Hanya /admin yang dilindungi
    location /admin/ {
        auth_basic "Admin Panel";
        auth_basic_user_file /etc/nginx/.htpasswd;
        try_files $uri $uri/ =404;
    }

    # Endpoint metrics internal
    location /metrics {
        auth_basic "Prometheus Metrics";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://localhost:9090;
    }
}

Kombinasi dengan Pembatasan IP #

Untuk keamanan lebih baik, kombinasikan basic auth dengan pembatasan IP — hanya IP tertentu yang boleh mencoba login:

location /admin/ {
    # Izinkan hanya dari jaringan internal
    allow 10.0.0.0/8;
    allow 192.168.0.0/16;
    deny all;

    auth_basic "Admin Panel";
    auth_basic_user_file /etc/nginx/.htpasswd;

    proxy_pass http://admin_backend;
}

Atau gunakan logika satisfy untuk “boleh akses jika dari IP yang diizinkan ATAU punya password yang benar”:

location /staging/ {
    satisfy any;   # 'any' = cukup salah satu; 'all' = harus semua terpenuhi

    # Kondisi 1: dari IP yang diizinkan
    allow 10.0.0.0/8;
    deny all;

    # Kondisi 2: punya kredensial yang benar
    auth_basic "Staging Environment";
    auth_basic_user_file /etc/nginx/.htpasswd;

    proxy_pass http://staging_backend;
}

Dengan satisfy any, tim internal bisa akses langsung tanpa password (karena IP mereka diizinkan), sementara orang luar tetap bisa akses dengan memasukkan password.


Keterbatasan Basic Auth #

Basic auth punya beberapa keterbatasan yang perlu dipahami:

Hanya aman di atas HTTPS. Kredensial dikirim sebagai Base64 (bukan enkripsi) di header Authorization. Di atas HTTP biasa, siapapun di jaringan yang sama bisa melihat username dan password. Selalu gunakan basic auth hanya di koneksi HTTPS.

Tidak ada mekanisme logout yang bersih. Browser menyimpan kredensial di session dan mengirimkannya otomatis ke semua request ke domain yang sama. Untuk “logout”, pengguna harus menutup browser atau cache kredensial harus expired.

Satu set kredensial untuk semua. Semua user dengan akses yang sama berbagi satu file password. Tidak ada granular permission berbasis role.

Rentan brute force jika tidak dikombinasikan dengan rate limiting.

Untuk kebutuhan autentikasi yang lebih serius (login form yang proper, session management, OAuth), implementasikan di level aplikasi atau gunakan solusi seperti OAuth2 Proxy di depan Nginx.


Ringkasan #

  • Buat file password dengan htpasswd -c /path/.htpasswd user (pertama kali), tambah user berikutnya tanpa flag -c.
  • auth_basic bisa diletakkan di level server (proteksi seluruh site) atau di location tertentu saja.
  • Selalu gunakan HTTPS — basic auth mengirim kredensial sebagai Base64 yang mudah dibaca di HTTP biasa.
  • Kombinasikan dengan satisfy any + allow/deny untuk akses tanpa password dari IP internal dan dengan password dari luar.
  • Basic auth cocok untuk proteksi sederhana (admin panel, monitoring endpoint) — bukan untuk autentikasi pengguna aplikasi yang sesungguhnya.

← Sebelumnya: HTTP/2   Berikutnya: Rate Limiting →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact