Implementasi Nginx security headers adalah langkah krusial untuk melindungi aplikasi web dari berbagai kerentanan umum seperti Cross-Site Scripting (XSS), clickjacking, penyadapan data, dan eksploitasi MIME-type. Dengan menambahkan direktif pengaman pada blok server Nginx, peramban (browser) web pengunjung akan dipaksa untuk menerapkan kebijakan keamanan yang ketat saat merender konten.
Konfigurasi dasar dilakukan di dalam blok server atau http pada berkas konfigurasi Nginx (biasanya terletak di /etc/nginx/nginx.conf atau di dalam direktori sites-available/). Setiap header memiliki fungsi spesifik yang dirancang untuk memperketat perimeter keamanan sisi klien.
Daftar Utama Nginx Security Headers
Berikut adalah tabel parameter header keamanan HTTP standar industri beserta fungsi dan rekomendasi nilainya:
| Header HTTP | Rekomendasi Nilai (Value) | Fungsi Utama |
|---|---|---|
| Strict-Transport-Security | max-age=63072000; includeSubDomains; preload |
Memaksa koneksi menggunakan HTTPS dan mencegah serangan SSL stripping. |
| Content-Security-Policy | default-src 'self' ...; |
Mencegah eksekusi skrip berbahaya dan membatasi sumber muatan aset (XSS mitigation). |
| X-Frame-Options | DENY atau SAMEORIGIN |
Melindungi situs dari serangan clickjacking dengan mencegah iframe eksternal. |
| X-Content-Type-Options | nosniff |
Mencegah browser melakukan MIME-sniffing di luar tipe konten yang dideklarasikan. |
| Referrer-Policy | strict-origin-when-cross-origin |
Mengontrol seberapa banyak informasi referer yang dikirim saat berpindah halaman. |
| Permissions-Policy | camera=(), microphone=(), geolocation=() |
Membatasi akses situs terhadap fitur perangkat keras sensitif. |
Contoh Konfigurasi Nginx Lengkap
Salin blok kode berikut ke dalam file konfigurasi virtual host Nginx Anda. Pastikan untuk menyesuaikan direktif Content-Security-Policy (CSP) dengan kebutuhan spesifik aplikasi Anda agar tidak memblokir aset yang sah.
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL Configuration (contoh)
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# 1. HTTP Strict Transport Security (HSTS)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 2. X-Frame-Options
add_header X-Frame-Options "SAMEORIGIN" always;
# 3. X-Content-Type-Options
add_header X-Content-Type-Options "nosniff" always;
# 4. Referrer-Policy
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 5. Permissions-Policy
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
# 6. Content Security Policy (CSP)
# Sesuaikan 'self' dengan domain aset eksternal jika ada (misal CDN, Google Fonts)
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;" always;
location / {
root /var/www/html;
index index.html index.htm;
}
}
# Redirect HTTP ke HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Langkah Penerapan dan Pengujian Teknis
- Uji validitas sintaks konfigurasi Nginx sebelum melakukan restart layanan dengan menjalankan perintah:
sudo nginx -t - Jika tidak ditemukan kesalahan (syntax is ok), terapkan perubahan dengan memuat ulang Nginx:
sudo systemctl reload nginx - Verifikasi penerapan header menggunakan perangkat lunak pihak ketiga seperti terminal curl (
curl -I https://example.com) atau pemindai keamanan online seperti Security Headers (securityheaders.com) untuk memastikan skor A+.
Troubleshooting Umum
Kesalahan paling sering terjadi adalah penerapan aturan CSP yang terlalu ketat sehingga merusak fungsionalitas JavaScript atau memblokir pemuatan font eksternal. Gunakan mode laporan saja (Content-Security-Policy-Report-Only) terlebih dahulu untuk memantau pelanggaran di konsol peramban sebelum menerapkan blokade penuh.