NGINX Keamanan & SSL

Target: Pemula yang ingin menguasai Hardening Keamanan Server Web NGINX 1.24+ / 1.26+ (Enkripsi HTTPS, SSL/TLS 1.2 & TLS 1.3, SSL Session Cache, Certbot Let’s Encrypt, HTTP HTTPS 301 Redirect, Strict HSTS Preload, Essential Security Headers CSP/X-Frame-Options, server_tokens off, Proteksi File .env/.git, Rate Limiting Leaky Bucket limit_req_zone, Connection Limiting limit_conn_zone, Kompresi Gzip & Brotli, Kernel Zero-Copy sendfile/tcp_nopush/tcp_nodelay, Worker Tuning, dan Audit Keamanan Skor A+ Qualys SSL Labs). Versi: NGINX 1.24+ / 1.26+ / OpenSSL 3.x Prasyarat: NGINX Reverse Proxy Fokus modul pembelajaran ini: mental model Defense in Depth → Konfigurasi HTTPS Dasar → 301 HTTPS Redirect → TLS 1.3 & Modern Ciphers → SSL Session Caching → Certbot ACME Challenges → Strict-Transport-Security (HSTS) → Anti-Clickjacking & Anti-XSS Headers → Menyembunyikan Identitas NGINX → Memblokir File Rahasia (.env) → Rate Limiting Leaky Bucket (burst, nodelay, HTTP 429) → Connection Limiting (Anti-Slowloris) → Gzip & Brotli Compression → Kernel Zero-Copy File Transfer → Worker Limits & Timeouts → mini project Bank-Grade Hardened NGINX Security Gateway.


Cara Belajar

🟢 Fundamental
→ wajib dipahami: Konfigurasi HTTPS/SSL, HTTP to HTTPS 301 Redirect, TLS 1.3 Hardening, dan Certbot Automation
 
🟡 Lanjutan
→ pelajari setelah SSL aktif: Strict HSTS, Essential Security Headers, Proteksi File Sensitif, dan Rate Limiting (limit_req)
 
🔴 Advanced / Operasional
→ penting untuk skala produksi: Kompresi Gzip/Brotli, Kernel Zero-Copy (sendfile), Worker Tuning, dan Audit Skor A+

Mental model alur filter keamanan berlapis (Defense-in-Depth Pipeline) di NGINX Gateway:

                     HTTP/HTTPS REQUEST MASUK DARI INTERNET


                       1. PORT 80 REDIRECT LAYER
               Apakah request datang via HTTP Port 80?
                ├── YA  ──> Redirect 301 ke HTTPS (Port 443) Instan! 🔒
                └── TIDAK (Sudah HTTPS)


                       2. TLS 1.3 & SSL SESSION LAYER
               Verifikasi Sertifikat & Cipher Suite Modern
               (Resume via SSL Session Cache shared:SSL:10m)


                       3. SENSITIVE FILE BLOCKER LAYER
               Apakah URI meminta '/.env' atau '/.git'?
                ├── YA  ──> Blokir & Kembalikan HTTP 404/403 Seketika! 🚫
                └── TIDAK


                       4. LEAKY BUCKET RATE LIMITING
               Apakah IP client melebihi batas (misal: > 5 req/detik)?
                ├── YA  ──> Tolak dengan HTTP 429 Too Many Requests! ⚠️
                └── TIDAK


                       5. SECURITY HEADERS & GZIP COMPRESSION
               Sematkan HSTS, CSP, X-Frame-Options & Kompres Gzip/Brotli


                     TERUSKAN KE BACKEND SERVER (100% AMAN)

Hafalan:

Defense in Depth      → pendekatan keamanan berlapis di level web server sebelum request menyentuh kode aplikasi backend
listen 443 ssl        → mengaktifkan port HTTPS terenkripsi SSL/TLS pada server block NGINX
ssl_protocols TLSv1.3 → membatasi protokol enkripsi hanya pada versi terbaru yang aman (TLS 1.2 dan TLS 1.3)
HSTS                  → header yang memaksa browser hanya berkomunikasi via HTTPS selama periode tertentu (misal: 1 tahun)
server_tokens off     → menyembunyikan nomor versi NGINX pada header respons dan halaman error sistem
limit_req_zone        → membuat zona memori pembatas laju request per IP client menggunakan algoritma Leaky Bucket
burst & nodelay       → mengizinkan lonjakan request singkat yang langsung diproses tanpa membuat koneksi antre
limit_conn_zone       → membatasi jumlah koneksi TCP simultan per alamat IP untuk menangkal serangan Slowloris
gzip on               → mengaktifkan kompresi data teks (HTML, CSS, JS, JSON) untuk menghemat 70% bandwidth
sendfile on           → mengaktifkan transfer file langsung dari disk ke network socket di level kernel OS (Zero-Copy)

Daftar Isi

🟢 Fundamental

  1. Pengenalan Keamanan & Hardening Server Web NGINX
  2. Konfigurasi HTTPS & SSL/TLS Dasar
  3. Pengalihan Otomatis HTTP ke HTTPS (301 Permanent Redirect)
  4. SSL Hardening: Protokol Aman TLSv1.2 TLSv1.3 & Modern Cipher Suites
  5. Optimasi Kinerja SSL: SSL Session Cache & Session Tickets
  6. Integrasi Otomatis Let’s Encrypt dengan Certbot

🟡 Lanjutan

  1. HTTP Strict Transport Security (HSTS)
  2. Security Headers Esensial: Anti-Clickjacking & Anti-XSS
  3. Menyembunyikan Versi NGINX & Header Sensitif
  4. Proteksi File Sensitif & Direktori Tersembunyi
  5. Rate Limiting Dasar dengan limit_req_zone (Algoritma Leaky Bucket)
  6. Parameter Rate Limiting Lanjutan: burst=N dan nodelay
  7. Connection Limiting dengan limit_conn_zone
  8. Kustomisasi Status HTTP & Logging Rate Limiting

🔴 Advanced / Operasional

  1. Kompresi HTTP Berkecepatan Tinggi dengan Gzip
  2. Kompresi Modern Brotli
  3. Optimasi Transfer File Kernel OS (Zero-Copy Transfer)
  4. Tuning Worker Processes & File Descriptors Sistem
  5. Tuning Buffer Klien & Timeouts Mitigasi Serangan DoS
  6. Audit Keamanan & Verifikasi Skor A+

🛠️ Referensi & Praktik

  1. Peta Ingatan Cepat
  2. Tabel Ringkasan
  3. Cheat Code NGINX Keamanan & SSL 10 Detik
  4. Urutan Belajar yang Disarankan
  5. Mini Project: Production-Ready Bank-Grade NGINX Security Gateway with TLS 1.3, Strict HSTS, Leaky Bucket Rate Limiting, Gzip Compression, and Kernel Tuning
  6. Referensi Resmi

1. 🟢 Pengenalan Keamanan & Hardening Server Web NGINX

Konsep

Sebagai gerbang terdepan (Frontend Web Server / Ingress Gateway), NGINX adalah benteng pertama yang menghadapi jutaan botnet, web scraper, dan serangan siber di internet publik.

Prinsip Defense in Depth: Jika keamanan hanya dipasang di kode aplikasi (Node.js/PHP/Java), server tetap rentan kehabisan RAM atau CPU saat diserang banjir traffic. Dengan memasang filter keamanan di NGINX level:

  • Request berbahaya diblokir di level gerbang jaringan sebelum sempat menyentuh memori aplikasi backend.

Hafalan:

Defense in Depth → memfilter serangan di level web server sebelum membebani aplikasi backend

2. 🟢 Konfigurasi HTTPS & SSL/TLS Dasar

Konsep

Untuk mengaktifkan HTTPS, sebuah server block memerlukan:

  1. Port listen 443 ssl; (dan http2 untuk NGINX modern).
  2. ssl_certificate : Path ke file public certificate chain (fullchain.pem).
  3. ssl_certificate_key : Path ke file private key (privkey.pem).

Contoh

server {
    listen 443 ssl http2;
    server_name tokokita.com www.tokokita.com;
 
    # Berkas Sertifikat SSL
    ssl_certificate /etc/ssl/certs/tokokita_fullchain.pem;
    ssl_certificate_key /etc/ssl/private/tokokita_privkey.pem;
 
    root /var/www/tokokita/public;
    index index.html;
}

Hafalan:

listen 443 ssl; ssl_certificate /path/fullchain.pem; ssl_certificate_key /path/privkey.pem;

3. 🟢 Pengalihan Otomatis HTTP ke HTTPS (301 Permanent Redirect)

Konsep

Jangan biarkan pengunjung mengakses website melalui koneksi HTTP polos yang tidak terenkripsi.

Buat Server Block Port 80 khusus yang tugas satu-satunya adalah me-redirect seluruh request ke URL HTTPS yang setara menggunakan status HTTP 301 Moved Permanently.

Contoh

# Server Block Port 80 (HTTP -> HTTPS Redirector)
server {
    listen 80;
    server_name tokokita.com www.tokokita.com;
 
    # 301 Permanent Redirect
    return 301 https://$host$request_uri;
}

Hafalan:

server { listen 80; server_name domain.com; return 301 https://$host$request_uri; } → rumus redirect HTTPS wajib

4. 🟢 SSL Hardening: Protokol Aman TLSv1.2 TLSv1.3 & Modern Cipher Suites

Konsep

Protokol SSL versi lama (SSLv2, SSLv3, TLSv1.0, TLSv1.1) memiliki kerentanan kriptografi fatal (seperti POODLE, BEAST, Heartbleed).

Standar Hardening SSL Modern:

  • Batasi protokol hanya pada TLSv1.2 TLSv1.3.
  • Gunakan Cipher Suites modern berbasis Elliptic Curve (ECDHE) dan AES-GCM / CHACHA20.

Contoh

# Nonaktifkan Protokol Jadul yang Rentan
ssl_protocols TLSv1.2 TLSv1.3;
 
# Cipher Suites Standar Mozilla Modern / Intermediate
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;

Hafalan:

ssl_protocols TLSv1.2 TLSv1.3; → membuang protokol usang dan hanya mengizinkan standar enkripsi terkuat

5. 🟢 Optimasi Kinerja SSL: SSL Session Cache & Session Tickets

Konsep

Proses negosiasi awal SSL/TLS (TLS Handshake) membutuhkan beberapa putaran pertukaran data (RTT) dan komputasi CPU yang berat.

Dengan mengaktifkan SSL Session Caching: Ketika pengguna yang sama membuka halaman kedua atau kembali beberapa menit kemudian, sesi SSL di-resume seketika tanpa kalkulasi ulang handshake (menghemat ~100ms latency).

Contoh

# Alokasikan 10MB RAM untuk Cache Sesi SSL (~40.000 Sesi)
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
 
# Matikan Session Tickets untuk Keamanan Forward Secrecy yang Lebih Kuat
ssl_session_tickets off;

Hafalan:

ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; → menghemat 100ms latency koneksi SSL berulang

6. 🟢 Integrasi Otomatis Let’s Encrypt dengan Certbot

Konsep

Let’s Encrypt menyediakan sertifikat SSL/TLS gratis yang diakui oleh seluruh browser dunia dengan masa aktif 90 hari.

Certbot adalah agen otomatis untuk menerbitkan dan memperbarui (Auto-Renewal) sertifikat via tantangan ACME HTTP-01.

Perintah CLI di Server Ubuntu/Debian

# [1] Install Certbot NGINX Plugin
sudo apt install certbot python3-certbot-nginx -y
 
# [2] Terbitkan & Konfigurasikan SSL Otomatis
sudo certbot --nginx -d tokokita.com -d www.tokokita.com
 
# [3] Uji Coba Auto-Renewal Otomatis
sudo certbot renew --dry-run

Hafalan:

certbot --nginx -d example.com → menerbitkan dan memasang sertifikat SSL Let's Encrypt secara otomatis

7. 🟡 HTTP Strict Transport Security (HSTS)

Konsep

HSTS (Strict-Transport-Security) adalah header HTTP yang memberitahu browser pengguna: “Jangan pernah mencoba menghubungi website ini via HTTP biasa selama X detik ke depan. Selalu ubah http:// menjadi https:// langsung di level browser!”

Mencegah serangan Man-in-the-Middle (MITM) SSL Stripping.

Contoh

# Aktifkan HSTS selama 1 Tahun (31536000 detik) untuk Domain & Seluruh Subdomain
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

Hafalan:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

8. 🟡 Security Headers Esensial: Anti-Clickjacking & Anti-XSS

Konsep

Paket HTTP Security Headers Standar Industri untuk Memperoleh Nilai A+ di SecurityHeaders.com:

  1. X-Frame-Options "SAMEORIGIN" : Mencegah website Anda di-embed ke dalam <iframe> situs jahat (Anti-Clickjacking).
  2. X-Content-Type-Options "nosniff" : Mencegah browser menebak (MIME sniffing) tipe file executable sebagai script.
  3. Referrer-Policy "strict-origin-when-cross-origin" : Menjaga kerahasiaan URL referrer saat berpindah ke situs eksternal.
  4. Permissions-Policy : Menonaktifkan akses sensor perangkat (kamera, mikrofon, geolokasi) yang tidak dibutuhkan.

Contoh

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

Hafalan:

X-Frame-Options SAMEORIGIN + X-Content-Type-Options nosniff → fondasi wajib security headers di web server

9. 🟡 Menyembunyikan Versi NGINX & Header Sensitif

Konsep

Secara default, NGINX menyematkan versinya pada header HTTP (Server: nginx/1.24.0) dan pada halaman error bawaan. Hacker menggunakan informasi versi ini untuk mencari celah eksploitasi (CVE Fingerprinting).

Gunakan direktif: server_tokens off; (Wajib di blok http {}).

Contoh

http {
    # Sembunyikan Versi NGINX (Hanya akan menampilkan 'Server: nginx')
    server_tokens off;
 
    # Sembunyikan Header Bahasa Backend
    fastcgi_hide_header X-Powered-By;
    proxy_hide_header X-Powered-By;
}

Hafalan:

server_tokens off; → menyembunyikan versi NGINX untuk mencegah information disclosure

10. 🟡 Proteksi File Sensitif & Direktori Tersembunyi

Konsep

Sering kali developer tidak sengaja mengekspos folder repositori git (.git/) atau file konfigurasi rahasia database (.env, .htaccess, .DS_Store) ke direktori public web root.

Blokir seluruh akses ke file/folder berawalan titik menggunakan Regex Matcher:

Contoh

# Blokir File Rahasia (.env, .git, .yaml, .config) dengan Return 404
location ~ /\.(env|git|svn|htaccess|htpasswd|DS_Store|bak|config) {
    deny all;
    return 404; # Kembalikan 404 agar penyerang mengira file tidak ada
}

Hafalan:

location ~ /\.(env|git) { deny all; return 404; } → mengamankan file rahasia agar tidak bisa diunduh dari browser

11. 🟡 Rate Limiting Dasar dengan limit_req_zone (Algoritma Leaky Bucket)

Konsep

Rate Limiting: Membatasi jumlah request yang boleh dikirim oleh satu alamat IP dalam satu satuan waktu untuk menangkal Serangan Brute Force Login, Web Scraping Agresif, dan DoS.

Dua Langkah Konfigurasi:

  1. Definisikan Zona Memori (Di Blok http {}): limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/s;
    • $binary_remote_addr : Menyimpan IP client dalam bentuk biner (hanya 4 byte per IP / sangat hemat RAM).
    • zone=login_limit:10m : 10MB RAM dapat menyimpan ~160.000 IP aktif.
    • rate=5r/s : Batas maksimal 5 request per detik.
  2. Terapkan pada Endpoint (Di Blok location): limit_req zone=login_limit;

Hafalan:

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s; → zona memori rate limit IP client

12. 🟡 Parameter Rate Limiting Lanjutan: burst=N dan nodelay

Konsep

Jika rate diatur 5r/s, browser yang mengunduh 6 file CSS/JS secara paralel akan langsung diblokir (False Positive).

Solusi:

  • burst=10 : Mengizinkan lonjakan mendadak hingga 10 request tambahan dalam ember penampung (Leaky Bucket).
  • nodelay : Memproses request di dalam burst secara instan tanpa penundaan, selama ember belum meluap penuh.

Contoh

location /api/auth/login {
    proxy_pass http://backend_cluster;
 
    # Maksimal 5 req/s dengan toleransi burst 10 request seketika
    limit_req zone=login_limit burst=10 nodelay;
}

Hafalan:

limit_req zone=login_limit burst=10 nodelay; → mengakomodasi lonjakan request sesaat secara instan

13. 🟡 Connection Limiting dengan limit_conn_zone

Konsep

Berbeda dengan limit_req yang membatasi laju request per detik, limit_conn membatasi jumlah koneksi TCP simultan yang sedang terbuka.

Sangat efektif untuk menangkal Serangan Slowloris DoS (penyerang membuka ribuan koneksi lambat untuk menghabiskan worker server).

Contoh

# Di http context:
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
 
server {
    listen 443 ssl;
    
    # Batasi maksimal 20 koneksi TCP simultan per IP
    limit_conn conn_limit 20;
 
    location /downloads/ {
        # Batasi maksimal 2 koneksi unduhan bersamaan per IP
        limit_conn conn_limit 2;
    }
}

Hafalan:

limit_conn conn_limit 20; → membatasi jumlah koneksi TCP simultan per IP pengunjung

14. 🟡 Kustomisasi Status HTTP & Logging Rate Limiting

Konsep

Secara default, NGINX mengembalikan status 503 Service Unavailable saat rate limit terlampaui. Standar industri modern merekomendasikan status 429 Too Many Requests.

Gunakan direktif:

  • limit_req_status 429;
  • limit_req_log_level warn;

Contoh

http {
    limit_req_status 429;
    limit_req_log_level warn;
}

Hafalan:

limit_req_status 429; → mengembalikan status standar RFC 6585 'Too Many Requests' saat rate limit terlewati

15. 🔴 Kompresi HTTP Berkecepatan Tinggi dengan Gzip

Konsep

Kompresi Gzip mengecilkan ukuran file teks (HTML, CSS, JavaScript, JSON, SVG) hingga 70%–80% sebelum dikirim ke browser.

Aturan Kinerja:

  • Jangan mengompres file yang ukurannya sudah terlalu kecil (gzip_min_length 256; / kompresi file < 256 byte justru memperbesar ukuran).
  • Jangan mengompres file gambar biner (.jpg, .png) karena format gambar sudah terkompresi.

Contoh

http {
    # Aktifkan Kompresi Gzip
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5; # Level 5: Keseimbangan optimal rasio kompresi vs beban CPU
    gzip_min_length 256;
    
    # Daftar MIME Types yang Dikompresi
    gzip_types
        text/plain
        text/css
        text/javascript
        application/javascript
        application/json
        application/x-javascript
        text/xml
        application/xml
        application/xml+rss
        image/svg+xml;
}

Hafalan:

gzip on; gzip_comp_level 5; gzip_types application/json text/css; → menghemat 70% bandwidth transfer file teks

16. 🔴 Kompresi Modern Brotli

Konsep

Brotli (ngx_brotli) adalah algoritma kompresi generasi terbaru buatan Google yang menghasilkan ukuran file 20% lebih kecil dibanding Gzip dengan kecepatan dekompresi lebih cepat di browser.

Contoh (Jika Modul Brotli Terpasang)

http {
    brotli on;
    brotli_comp_level 6;
    brotli_types text/plain text/css application/json application/javascript image/svg+xml;
}

Hafalan:

Brotli Compression → algoritma kompresi modern yang 20% lebih hemat bandwidth dibanding Gzip

17. 🔴 Optimasi Transfer File Kernel OS (Zero-Copy Transfer)

Konsep

Tiga Direktif Kernel Tuning Inti di Blok http {}:

  1. sendfile on; : Menginstruksikan kernel OS untuk langsung memindahkan file dari disk cache ke TCP Socket tanpa menyalinnya ke user memory buffer (Zero-Copy).
  2. tcp_nopush on; : Memaksa NGINX mengirim header HTTP dan isi file dalam 1 paket TCP utuh (hanya aktif jika sendfile on).
  3. tcp_nodelay on; : Menonaktifkan algoritma Nagle pada koneksi keepalive untuk meminimalkan latency respons API kecil.

Hafalan:

sendfile on; tcp_nopush on; tcp_nodelay on; → trio direktif optimasi throughput kernel jaringan Linux

18. 🔴 Tuning Worker Processes & File Descriptors Sistem

Konsep

Konfigurasi Tingkat Sistem di nginx.conf (Context main & events):

  • worker_processes auto; : Menjalankan 1 worker per core CPU fisik/virtual.
  • worker_rlimit_nofile 65535; : Menaikkan batas maksimal File Descriptors yang boleh dibuka NGINX di level OS.
  • worker_connections 4096; : Setiap worker sanggup melayani 4096 koneksi simultan.
  • multi_accept on; : Worker menerima seluruh koneksi baru di antrean sekaligus.

Contoh

user www-data;
worker_processes auto;
worker_rlimit_nofile 65535; # Batas File Descriptors OS
 
events {
    worker_connections 4096;
    multi_accept on;
    use epoll; # Mekanisme I/O tercepat di Linux
}

Hafalan:

worker_processes auto; worker_connections 4096; worker_rlimit_nofile 65535;

19. 🔴 Tuning Buffer Klien & Timeouts Mitigasi Serangan DoS

Konsep

Jika penyerang mengirimkan header HTTP dengan sangat lambat (Slow Client Attack), worker NGINX bisa tertahan lama.

Kunci Timeouts yang Ketat:

  • client_body_timeout 10s; : Waktu maksimal menunggu client mengirim body payload.
  • client_header_timeout 10s; : Waktu maksimal menunggu client mengirim header HTTP.
  • keepalive_timeout 30s; : Menutup koneksi idle setelah 30 detik untuk membebaskan memory.

Hafalan:

client_body_timeout 10s; client_header_timeout 10s; → mencegah koneksi lambat menahan resource server

20. 🔴 Audit Keamanan & Verifikasi Skor A+

Konsep

Alat Verifikasi & Audit Keamanan Standar Industri Gratis:

  1. Qualys SSL Labs (ssllabs.com/ssltest): Menguji keamanan SSL/TLS, sertifikat, dan cipher suites (Target: Nilai A+).
  2. SecurityHeaders.com: Menguji kelengkapan HTTP Security Headers (Target: Nilai A+).
  3. Mozilla Observatory (observatory.mozilla.org): Audit menyeluruh standar kepatuhan web security.

Hafalan:

Audit A+ SSL Labs & SecurityHeaders → verifikasi kepatuhan standar keamanan web server global

21. 🛠️ Peta Ingatan Cepat

               PETA ARSITEKTUR NGINX KEAMANAN, SSL & OPTIMASI

       ┌──────────────────────────────┼──────────────────────────────┐
       ▼                              ▼                              ▼
HTTPS & SSL/TLS HARDENING      SECURITY HEADERS & LIMITING    PERFORMANCE & KERNEL TUNING
├─ listen 443 ssl http2        ├─ Strict HSTS Preload         ├─ gzip on (Comp level 5)
├─ 301 HTTP -> HTTPS           ├─ X-Frame-Options SAMEORIGIN  ├─ sendfile & tcp_nopush
├─ TLS 1.2 & TLS 1.3 only      ├─ limit_req_zone (Rate Limit) ├─ worker_processes auto
└─ ssl_session_cache 10m       └─ Block sensitive (/.env)     └─ worker_rlimit_nofile 65k

22. 📚 Tabel Ringkasan

Direktif / ParameterContextFungsi & Karakteristik Utama
listen 443 sslserverMengaktifkan port HTTPS terenkripsi SSL/TLS
ssl_protocolshttp/serverMenentukan versi protokol SSL yang diizinkan (TLSv1.2 TLSv1.3)
ssl_session_cachehttp/serverMenyimpan cache sesi SSL di RAM untuk menghemat handshake CPU
Strict-Transport-Securityhttp/serverMemaksa browser selalu berkomunikasi via HTTPS (HSTS)
server_tokens offhttp/serverMenyembunyikan informasi versi NGINX dari publik
limit_req_zonehttpMembuat zona memori pelacak laju request per IP client
limit_reqserver/locationMenerapkan batas laju request (burst=N nodelay)
limit_connserver/locationMembatasi jumlah koneksi TCP simultan per alamat IP
gzip onhttp/server/locationMengaktifkan kompresi data teks untuk efisiensi bandwidth
sendfile onhttp/server/locationMengaktifkan transfer file langsung di kernel OS (Zero-Copy)
worker_rlimit_nofilemainMenaikkan batas file descriptor maksimal di sistem operasi

23. ⚡ Cheat Code NGINX Keamanan & SSL 10 Detik

# [1] Template Hardened SSL & Security Headers
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
server_tokens off;
 
# [2] Template Leaky Bucket Rate Limiting (HTTP 429)
limit_req_zone $binary_remote_addr zone=api_gate:10m rate=10r/s;
limit_req_status 429;

24. 🧭 Urutan Belajar yang Disarankan

Langkah 1: Aktifkan HTTPS & Otomatisasi Certbot
├── Pasang sertifikat SSL/TLS dan kunci port 443
└── Buat server block port 80 untuk 301 redirect permanen


Langkah 2: Terapkan SSL Hardening & Security Headers
├── Batasi hanya ke TLSv1.2 & TLSv1.3 dan aktifkan SSL session cache
└── Pasang HSTS preload, X-Frame-Options, dan matikan server_tokens


Langkah 3: Proteksi File Rahasia & Pasang Rate Limiting
├── Blokir akses ke /.env dan /.git dengan return 404
└── Lindungi endpoint login/API dengan limit_req_zone burst nodelay


Langkah 4: Optimasi Kecepatan dengan Gzip & Kernel Zero-Copy
├── Aktifkan gzip compression level 5 pada file JSON/CSS/JS
└── Terapkan sendfile on, tcp_nopush on, dan tuning worker_connections


Langkah 5: Selamat! Server NGINX Anda Siap Produksi dengan Standar Bank-Grade A+!

25. 🏗️ Mini Project: Production-Ready Bank-Grade NGINX Security Gateway with TLS 1.3, Strict HSTS, Leaky Bucket Rate Limiting, Gzip Compression, and Kernel Tuning

Berkas konfigurasi NGINX enterprise lengkap, modular, dan runnable: SSL Termination TLS 1.2/1.3, HSTS Preload, Full Security Headers, Rate Limiting per IP pada Endpoint Login & API, Gzip Compression, Penolakan File Rahasia, dan Kernel Zero-Copy.

# =========================================================================
# /etc/nginx/nginx.conf (Tingkat Sistem Global)
# =========================================================================
user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
 
events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}
 
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
 
    # [1] Sembunyikan Versi & Header Sensitif
    server_tokens off;
    proxy_hide_header X-Powered-By;
    fastcgi_hide_header X-Powered-By;
 
    # [2] Optimasi Kernel Jaringan Linux (Zero-Copy)
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
 
    # [3] Timeouts Ketat (Mitigasi Serangan DoS)
    client_body_timeout 10s;
    client_header_timeout 10s;
    keepalive_timeout 30s;
    send_timeout 10s;
 
    # [4] Kompresi Gzip
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
    gzip_min_length 256;
    gzip_types text/plain text/css application/json application/javascript text/xml image/svg+xml;
 
    # [5] SSL Session Caching Global
    ssl_session_cache shared:SSL_GLOBAL:20m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;
 
    # [6] Zona Rate Limiting (Leaky Bucket)
    limit_req_zone $binary_remote_addr zone=GENERAL_API:10m rate=20r/s;
    limit_req_zone $binary_remote_addr zone=AUTH_LIMIT:10m rate=5r/s;
    limit_req_status 429;
    limit_req_log_level warn;
 
    # [7] Zona Connection Limiting
    limit_conn_zone $binary_remote_addr zone=ADDR_CONN_LIMIT:10m;
 
    include /etc/nginx/conf.d/*.conf;
}
# =========================================================================
# /etc/nginx/conf.d/bank_grade_secure_site.conf
# =========================================================================
 
# -------------------------------------------------------------------------
# [1] HTTP PORT 80 REDIRECTOR (ALWAYS FORCE HTTPS)
# -------------------------------------------------------------------------
server {
    listen 80;
    server_name portal.perusahaan.com;
    return 301 https://$host$request_uri;
}
 
# -------------------------------------------------------------------------
# [2] HTTPS PORT 443 PRODUCTION HARDENED GATEWAY
# -------------------------------------------------------------------------
server {
    listen 443 ssl http2;
    server_name portal.perusahaan.com;
 
    root /var/www/portal/dist;
    index index.html;
 
    # SSL Certificates
    ssl_certificate /etc/letsencrypt/live/portal.perusahaan.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/portal.perusahaan.com/privkey.pem;
 
    # TLS Protocols & Ciphers Hardening
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
 
    # Bank-Grade Security Headers (Qualys A+ Rating)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
 
    # Batasi Koneksi TCP Simultan per IP
    limit_conn ADDR_CONN_LIMIT 20;
 
    # ---------------------------------------------------------------------
    # PROTEKSI FILE SENSITIF (.env, .git, .yaml, .config)
    # ---------------------------------------------------------------------
    location ~ /\.(env|git|svn|htaccess|htpasswd|DS_Store|bak|config) {
        deny all;
        return 404;
    }
 
    # ---------------------------------------------------------------------
    # RUTE 1: FRONTEND SPA (VUE/REACT)
    # ---------------------------------------------------------------------
    location / {
        try_files $uri $uri/ /index.html;
    }
 
    # ---------------------------------------------------------------------
    # RUTE 2: AUTHENTICATION API (RATE LIMIT KETAT 5 REQ/S)
    # ---------------------------------------------------------------------
    location /api/v1/auth/ {
        limit_req zone=AUTH_LIMIT burst=5 nodelay;
 
        proxy_pass http://127.0.0.1:4000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
 
    # ---------------------------------------------------------------------
    # RUTE 3: GENERAL RESOURCE API (RATE LIMIT 20 REQ/S)
    # ---------------------------------------------------------------------
    location /api/ {
        limit_req zone=GENERAL_API burst=20 nodelay;
 
        proxy_pass http://127.0.0.1:4000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Hasil Validasi Sintaks & Pengujian Terminal

sudo nginx -t

Output

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

26. 🔗 Referensi Resmi