Dokumen ini menjelaskan proses audit dan hardening NGINX pada server production yang menjalankan WordPress, PHP 8.3-FPM, mail server, dan DNS server dalam satu host.
Tujuan utama:
- Mengurangi attack surface
- Menyembunyikan informasi sensitif
- Mencegah eksploitasi umum WordPress
- Meningkatkan standar keamanan HTTP
1. Informasi Awal dari Hasil Scan Eksternal
Berdasarkan hasil pemindaian Nmap:
- Web Server: NGINX
- CMS: WordPress 6.9.1 (terdeteksi)
- Port 80 aktif (redirect ke HTTPS)
- Port 443 aktif dengan SSL valid
Temuan penting:
- Versi WordPress terdeteksi
- Informasi server kemungkinan masih terlihat
- Endpoint standar WordPress terbuka
Hal ini menunjukkan bahwa server berjalan normal, tetapi belum sepenuhnya hardened.
2. Audit Konfigurasi NGINX
Untuk menampilkan seluruh konfigurasi NGINX:
sudo nginx -T
Lokasi konfigurasi utama biasanya berada di:
/etc/nginx/nginx.conf
/etc/nginx/sites-available/
/etc/nginx/sites-enabled/
Audit dilakukan pada file utama (nginx.conf) dan file virtual host domain.
3. Menyembunyikan Versi NGINX
Secara default, NGINX dapat menampilkan versi pada HTTP header.
Tambahkan konfigurasi berikut di dalam blok http {} pada nginx.conf:
server_tokens off;
Fungsi:
- Menghilangkan informasi versi NGINX dari header HTTP.
- Mengurangi risiko eksploitasi berbasis versi.
Setelah perubahan:
sudo nginx -t
sudo systemctl reload nginx
Verifikasi:
curl -I https://domainanda.com
4. Menambahkan Security Headers
Tambahkan konfigurasi berikut di dalam blok server {} pada virtual host:
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 Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Penjelasan:
- X-Frame-Options
Mencegah clickjacking. - X-Content-Type-Options
Mencegah MIME sniffing. - X-XSS-Protection
Perlindungan tambahan terhadap XSS pada browser lama. - Referrer-Policy
Mengontrol informasi referer yang dikirim. - HSTS
Memaksa browser menggunakan HTTPS selama periode tertentu.
5. Menonaktifkan Directory Listing
Pastikan direktif berikut ada di dalam blok server:
autoindex off;
Fungsi:
- Mencegah listing direktori jika tidak terdapat file index.
6. Melindungi File Sensitif WordPress
Tambahkan konfigurasi berikut:
location ~* /wp-config.php {
deny all;
}
location ~* \.(env|log|conf)$ {
deny all;
}
Fungsi:
- Mencegah akses langsung ke file konfigurasi.
- Menghindari kebocoran kredensial database.
7. Membatasi Akses wp-login.php (Rate Limiting)
Tambahkan di dalam blok http {} pada nginx.conf:
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m;
Lalu di dalam blok server {}:
location = /wp-login.php {
limit_req zone=login_limit burst=10 nodelay;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
Fungsi:
- Membatasi maksimal 5 request per menit per IP.
- Mengurangi risiko brute force attack.
8. Menonaktifkan XML-RPC (Jika Tidak Digunakan)
location = /xmlrpc.php {
deny all;
}
Fungsi:
- Mencegah brute force massal melalui XML-RPC.
- Mengurangi permukaan serangan WordPress.
9. Mencegah Eksekusi PHP di Folder Upload
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}
Fungsi:
- Mencegah eksekusi web shell yang diunggah melalui celah plugin atau media upload.
10. Konfigurasi Eksekusi PHP yang Aman
Pastikan blok PHP memiliki konfigurasi seperti berikut:
location ~ \.php$ {
try_files $uri =404;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
Penjelasan:
- try_files $uri =404
Mencegah eksekusi file PHP yang tidak benar-benar ada.
Mengurangi eksploitasi path traversal.
11. Mencegah Akses File Tersembunyi
location ~ /\. {
deny all;
}
Fungsi:
- Mencegah akses ke file seperti
.git,.env, dan file tersembunyi lainnya.
12. Prosedur Verifikasi Setelah Hardening
Setiap perubahan konfigurasi harus diikuti dengan:
sudo nginx -t
sudo systemctl reload nginx
Kemudian lakukan pengujian:
- Cek header HTTP
- Coba akses
/xmlrpc.php - Coba akses
/wp-config.php - Coba akses file PHP palsu
13. Prinsip Keamanan yang Digunakan
Hardening ini mengikuti prinsip:
- Least Information Exposure
Jangan tampilkan informasi yang tidak diperlukan. - Least Privilege
Batasi akses hanya pada yang diperlukan. - Surface Reduction
Tutup endpoint yang tidak digunakan. - Input Limitation
Batasi jumlah request untuk mencegah brute force.
14. Metode Belajar dan Mengingat Konfigurasi
Agar konfigurasi ini benar-benar dipahami dan bukan sekadar disalin:
Gunakan metode berikut:
- Pahami Ancaman → Konfigurasi → Dampak
Setiap baris konfigurasi harus bisa dijelaskan:- Apa yang dilindungi?
- Dari serangan apa?
- Bagaimana mekanismenya?
- Praktik Tanpa Melihat Catatan
Coba tulis ulang konfigurasi dari ingatan. - Audit Berkala
Jalankannginx -Tsetiap minggu dan evaluasi ulang. - Gunakan Server Lab
Jangan melakukan eksperimen langsung di production.
Kesimpulan
Server yang menjalankan WordPress di atas NGINX memerlukan hardening tambahan untuk mengurangi risiko eksploitasi. Konfigurasi di atas:
- Menyembunyikan informasi sensitif
- Mengurangi permukaan serangan
- Membatasi brute force
- Mencegah kebocoran file konfigurasi
- Mengamankan eksekusi PHP