LinuxSec Nginx Server Block Configuration

Jumat, 29 Juni 2018

LinuxSec Nginx Server Block Configuration - Kali ini saya akan sharing sedikit mengenai konfigurasi sederhana yang biasa saya pakai untuk server block untuk web server Nginx. Konfigurasi ini untuk website dengan CMS WordPress. Untuk CMS berbeda, bisa disesuaikan sendiri karena mungkin ada konfigurasi yang dihapus ataupun diganti.


Di tutorial ini server yang saya gunakan adalah Ubuntu. 

Oke Berikut sedikit penjelasannya:
Konfigurasi ini memaksa situs untuk "always HTTPS". Artinya trafik HTTP di port 80 akan diredirect ke port 443. 
Pada baris
ssl_certificate /etc/nginx/ssl/news.pem;
ssl_certificate_key /etc/nginx/ssl/news.key;
Berisi sertifikat dan private key SSL mu.
Baris
include /etc/nginx/snippets/crypt.conf;
Berisi beberapa konfigurasi SSL yang akan saya jelaskan nanti dibawah.
Pada baris
if ($args ~ "^/?author=([0-9]*)"){
        set $rule_0 1$rule_0;
}

if ($rule_0 = "1"){
        return 301 https://www.pornhub.com/pornstar/akiho-yoshizawa;
}
Memungkinkan attacker yang ingin mengenumerasi username dengan cara mengakses link site.com/?author=1 diblokir dan diarahkan ke halaman PornHub Akiho Yoshizawa *lol

Pada bagian
#Block PHP Direct Access
location ~* /wp-content/.*.css$ {}
location ~* /wp-content/.*.xsl$ {}
location ~* /wp-content/.*.woff$ {}
location ~* /wp-content/.*.ttf$ {}
location ~* /wp-content/.*.php$ {
deny all;
return 404;
access_log /var/log/nginx/backdoor.log;
log_not_found off;
}
Adalah untuk memblokir direct akses ke file php di direktori wp-content. Jadi jika skenario terburuknya ada attacker yang berhasil mengakses halaman admin dari WordPressmu, shell yang dia upload akan mentah alias tidak bisa diakses karena menampilkan error code 404.

Pada baris berikutnya tentang tweaking php-fpm dan juga block file .htaccess tidak perlu dijelaskan ya karena memang sudah ada di default konfigurasi serverblock.

Baris
# Feed
location ~* \.(?:rss|atom)$ {
  expires 1h;
}
# media
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
  expires 30d;
  access_log off;
}
# css
location ~* \.(?:css|js)$ {
  expires 1y;
  access_log off;
}
Adalah konfigurasi caching. Penjelasan lebih lanjut disini


# Stop external direct calling of any .php files in WordPress sub directories.
location ~* /wp-includes/*.php$ {
    return 404;
}
location /wp-content/ {
        deny all;
        return 404;
}
Konfigurasi ndiatas untuk memblokir semua akses php di direktori wp-includes dan juga SEMUA akses file berekstensi apapun di direktori wp-content. Hal ini untuk menghindari attacker yang berhasil masuk ke server dan melakukan bypass ekstensi backdoor seperti php.jpg, php5 dll agar backdoor terupload. Itulah alasan kenapa pada baris sebelumnya saya membuat pengaturan khusus untuk mengecualikan .css, .xls, .woff, .ttf, dari akses block ini.

 location = /wp-settings.php {
        deny all;
return 404;
        access_log off;
        log_not_found off;
}
location = /wp-config.php {
        deny all;
        return 404;
        access_log off;
        log_not_found off;

Yang ini sebenernya buat gaya gayaan doang sih. Jadi ketika ada attacker yang mengakses wp-config.php secara langsung akan menampilkan halaman 404. Default nya adalah blank.

Nah ini adalah file crypt.conf yang saya janjikan diatas.

Baca juga:


Mungkin sekian sharing kali ini. Ya tentu saja contoh diatas hanya konfigurasi sederhana. Kalian bisa melakukan tweak sendiri. Dan jangan lupa pula ini hanya konfigurasi di bagian server block saja. Untuk memastikan server benar benar aman kalian juga harus mengatur firewall/iptables, fail2ban dll.

Sekian dan semoga bermanfaat.

Artikel Terkait Hardening ,Nginx ,Security