Belajar Nginx - Security Hardening & Rate Limiting (DDoS & Brute-force Mitigation)
Episode 11 of 21

Belajar Nginx - Security Hardening & Rate Limiting (DDoS & Brute-force Mitigation)

Episode ini menjelaskan hardening NGINX: menyembunyikan versi, kontrol akses berbasis IP, rate limiting request dan koneksi, security headers, serta batas ukuran body untuk mitigasi serangan.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

NGINX yang dipublikasikan ke internet adalah pintu depan aplikasi. Tanpa pengaman, dia menjadi sasaran brute-force, DDoS, dan eksploitasi. Episode 11 ini membahas security hardening dan rate limiting — pertahanan pertama di layer NGINX.

Kalian akan menyembunyikan identitas versi server, membatasi akses berbasis IP, menerapkan rate limiting untuk request dan koneksi, memasang security headers, serta membatasi ukuran body upload untuk menggagalkan serangan payload besar. Ini persis yang dilakukan tim DevOps sebelum produksi.

Menyembunyikan Identitas Versi NGINX

server_tokens off

Versi NGINX yang tampil di header Server adalah informasi gratis bagi penyerang. Sembunyikan dengan server_tokens:

Sembunyikan versi server
http {
    server_tokens off;
}

Setelah diaktifkan, header Server: nginx tidak lagi menampilkan versi lengkap. Informasi sekecil ini mengurangi permukaan serangan yang bisa dieksploitasi secara otomatis.

Pembatasan Hak Akses

IP Whitelisting dan Blacklisting

Untuk area admin atau API internal, batasi siapa yang boleh masuk:

Batasi akses admin berdasarkan IP
location /admin {
    allow 192.168.1.0/24;
    allow 10.0.0.1;
    deny all;
}

Directive allow dan deny dievaluasi berurutan: dua baris allow pertama mengizinkan subnet internal dan satu IP khusus, lalu deny all; menolak semua yang lain. Untuk dashboard internal, pola ini jauh lebih aman daripada sekadar kata sandi.

Implementasi Rate Limiting

Request Rate Limit dengan limit_req

Rate limiting membatasi kecepatan request dari satu klien. Zona dideklarasikan di http, lalu dipakai di location:

Rate limiting request
http {
    limit_req_zone $binary_remote_addr zone=api_zone:10m rate=10r/s;
 
    server {
        location /api/ {
            limit_req zone=api_zone burst=20 nodelay;
            proxy_pass http://backend_app;
        }
    }
}

limit_req_zone menciptakan zona api_zone berkapasitas 10 megabyte dengan kecepatan 10 request per detik per IP. Directive limit_req zone=api_zone burst=20 nodelay; mengizinkan lonjakan 20 request sekaligus, sisanya langsung ditolak dengan status 503. Inilah benteng utama melawan brute-force login dan spam API.

Connection Rate Limit dengan limit_conn

Selain request, batasi juga jumlah koneksi paralel per IP:

Rate limiting koneksi
http {
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
 
    server {
        location / {
            limit_conn conn_zone 10;
            proxy_pass http://backend_app;
        }
    }
}

limit_conn_zone dan limit_conn conn_zone 10; membatasi satu IP hanya boleh membuka 10 koneksi paralel. Ini mencegah satu klien menghabiskan seluruh worker connections.

Security HTTP Headers dan Body Limits

Security Headers Standar

Beberapa header membuat browser lebih agresif memblokir serangan:

Security headers lengkap
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Content-Security-Policy "default-src 'self'" always;
add_header Referrer-Policy "no-referrer" always;
  • X-Frame-Options: SAMEORIGIN mencegah klikjacking dengan memblokir embed di frame luar.
  • X-Content-Type-Options: nosniff mencegah browser menebak MIME type.
  • Content-Security-Policy membatasi sumber konten yang boleh dimuat.

Perhatikan: add_header di context server tidak diwarisi ke location yang memiliki directive add_header sendiri. Letakkan di include agar konsisten — detailnya di episode 14.

Batas Ukuran Body

Upload yang raksasa bisa menghabiskan disk dan memori. Batasi:

Batas ukuran body
server {
    client_max_body_size 10M;
}

client_max_body_size 10M; menolak request dengan body lebih besar dari 10 megabyte dengan status 413. Jika aplikasi mengizinkan upload besar, sesuaikan angka ini — tapi jangan pernah membiarkannya tidak terbatas.

Penutup

Episode 11 membangun pertahanan layer pertama NGINX: kalian menyembunyikan versi server, membatasi akses berbasis IP, menerapkan rate limiting request dan koneksi, memasang security headers, serta membatasi ukuran body upload.

Inti yang harus dibawa pulang:

  • server_tokens off; menyembunyikan versi NGINX dari header Server.
  • allow dan deny membatasi akses berdasarkan IP.
  • limit_req_zone dan limit_req membatasi kecepatan request per IP.
  • limit_conn_zone dan limit_conn membatasi koneksi paralel.
  • Security headers memblokir klikjacking, MIME sniffing, dan XSS di browser.
  • client_max_body_size mencegah serangan berbasis payload besar.

Di episode 12 selanjutnya kita akan membahas authentication dan authorization di NGINX — HTTP Basic Authentication dengan htpasswd, otentikasi subrequest memakai auth_request, serta validasi token JWT untuk mengamankan endpoint internal.

Belajar Nginx - Security Hardening & Rate Limiting (DDoS & Brute-force Mitigation) | Belajar Nginx