Panduan Utama untuk Mengamankan, Memperkuat, dan Meningkatkan Kinerja Server Web Nginx


Berdasarkan hal-hal menakjubkan yang pernah Anda dengar tentang Nginx, mungkin Anda memutuskan untuk mencobanya. Anda mungkin sangat menyukainya sehingga mempertimbangkan untuk mengganti instalasi Apache Anda dengan Nginx setelah membaca beberapa artikel tentang topik yang telah kami terbitkan di situs ini.

Jika ya, saya yakin Anda akan menyambut panduan ini dengan tangan terbuka karena kami akan membahas 12 tips untuk meningkatkan keamanan server Nginx Anda (mulai dari selalu memperbarui Nginx hingga menggunakan TLS dan mengalihkan HTTP ke HTTPS), dan Anda akan melihat bahwa beberapa di antaranya sangat mirip dengan apa yang Anda lakukan dengan Apache.

Jangan Lewatkan:

13 Tips Keamanan dan Pengerasan Server Web Apache

25 Trik Apache Htaccess untuk Mengamankan Server Web Apache

Lingkungan Pengujian Nginx

Kami akan menggunakan lingkungan berikut dalam panduan ini:

  1. Debian GNU/Linux 8.1 (jessie).
  2. Alamat IP: 192.168.0.25 (tecmintlovesnginx.com) dan 192.168.0.26 (nginxmeanspower.com), seperti yang dijelaskan dalam virtual berbasis IP bagian tuan rumah di

    1. “Cara Mengatur Virtual Host Berbasis Nama dan IP (Blok Server) dengan Nginx“
  3. Versi Nginx: nginx/1.6.2.
  4. Demi kenyamanan Anda, berikut adalah file konfigurasi akhir (tautan Pastebin).

Dengan mengingat hal itu, mari kita mulai.

TIPS #1: Selalu perbarui Nginx

Pada saat penulisan ini, versi Nginx terbaru di CentOS (di EPEL) dan repositori Debian adalah 1.6.3 dan 1.6.2-5, masing-masing.

Jangan Lewatkan: Instal Nginx Versi Stabil Terbaru dari Repositori dan Sumber

Meskipun menginstal perangkat lunak dari repositori lebih mudah daripada mengkompilasi program dari kode sumber, opsi terakhir ini memiliki dua keuntungan: 1) opsi ini memungkinkan Anda membuat modul tambahan ke dalam Nginx (seperti mod_security), dan 2) opsi ini akan selalu menyediakan versi yang lebih baru dibandingkan repositori (1.9.9 saat ini). Catatan rilis selalu tersedia di situs web Nginx.

Jangan Lewatkan:

Lindungi Apache Terhadap Serangan Brute Force dan DDoS Menggunakan Mod_Security dan Mod_Evasive

TIPS #2: Hapus Modul yang Tidak Diperlukan di Nginx

Untuk menghapus modul dari Nginx secara eksplisit saat menginstal dari sumber, lakukan:

./configure --without-module1 --without-module2 --without-module3

Misalnya:

./configure  --without-http_dav_module --withouthttp_spdy_module 

Seperti yang mungkin Anda duga, menghapus modul dari instalasi Nginx sebelumnya dari sumber memerlukan kompilasi lagi.

Peringatan: Petunjuk konfigurasi disediakan oleh modul. Pastikan Anda tidak menonaktifkan modul yang berisi arahan yang Anda perlukan nanti! Anda harus memeriksa dokumen nginx untuk mengetahui daftar arahan yang tersedia di setiap modul sebelum mengambil keputusan untuk menonaktifkan modul.

TIPS #3: Nonaktifkan Petunjuk server_tokens di Nginx

Direktif server_tokens memberitahu Nginx untuk menampilkan versi saat ini pada halaman kesalahan. Hal ini tidak diinginkan karena Anda tidak ingin membagikan informasi tersebut kepada dunia untuk mencegah serangan pada server web Anda yang disebabkan oleh kerentanan yang diketahui pada versi spesifik tersebut.

Untuk menonaktifkan direktif server_tokens, setel if ke off di dalam blok server:

server {
    listen       192.168.0.25:80;
    server_tokens        off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    access_log  /var/www/logs/tecmintlovesnginx.access.log;
    error_log  /var/www/logs/tecmintlovesnginx.error.log error;
        root   /var/www/tecmintlovesnginx.com/public_html;
        index  index.html index.htm;
}

Mulai ulang nginx dan verifikasi perubahannya:

TIPS #4: Tolak Agen Pengguna HTTP di Nginx

Agen pengguna HTTP adalah perangkat lunak yang digunakan untuk negosiasi konten terhadap server web. Ini juga termasuk bot dan perayap malware yang mungkin berdampak pada kinerja server web Anda dengan membuang-buang sumber daya sistem.

Agar lebih mudah mengelola daftar agen pengguna yang tidak diinginkan, buatlah sebuah file (misalnya /etc/nginx/blockuseragents.rules) dengan konten berikut:

map $http_user_agent $blockedagent {
        default         0;
        ~*malicious     1;
        ~*bot           1;
        ~*backdoor      1;
        ~*crawler       1;
        ~*bandit        1;
}

Selanjutnya, letakkan baris berikut sebelum definisi blok server:

include /etc/nginx/blockuseragents.rules;

Dan pernyataan if untuk mengembalikan respons 403 jika string agen pengguna ada dalam daftar hitam yang ditentukan di atas:

Mulai ulang nginx, dan semua agen pengguna yang stringnya cocok dengan yang di atas akan diblokir dari mengakses server web Anda. Ganti 192.168.0.25 dengan IP server Anda dan silakan pilih string lain untuk tombol --user-agent pada wget:

wget http://192.168.0.25/index.html
wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html 

TIPS #5: Nonaktifkan Metode HTTP yang Tidak Diinginkan di Nginx

Juga dikenal sebagai kata kerja, metode HTTP menunjukkan tindakan yang diinginkan untuk diambil pada sumber daya yang dilayani oleh Nginx. Untuk situs web dan aplikasi umum, Anda sebaiknya hanya mengizinkan GET, POST, dan HEAD dan menonaktifkan yang lainnya.

Untuk melakukannya, tempatkan baris berikut di dalam blok server. Respons HTTP 444 berarti respons kosong dan sering digunakan di Nginx untuk mengelabui serangan malware:

if ($request_method !~ ^(GET|HEAD|POST)$) {
   return 444;
}

Untuk mengujinya, gunakan curl untuk mengirim permintaan DELETE dan membandingkan hasilnya dengan saat Anda mengirim GET biasa:

curl -X DELETE http://192.168.0.25/index.html
curl -X POST http://192.168.0.25/index.html 

TIPS #6: Tetapkan Batasan Ukuran Buffer di Nginx

Untuk mencegah serangan buffer overflow terhadap server web Nginx Anda, atur perintah berikut dalam file terpisah (misalnya, buat file baru dengan nama /etc/nginx/conf.d/buffer.conf):

client_body_buffer_size  1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

Petunjuk di atas akan memastikan bahwa permintaan yang dibuat ke server web Anda tidak akan menyebabkan buffer overflow di sistem Anda. Sekali lagi, lihat dokumen untuk rincian lebih lanjut tentang apa yang dilakukan masing-masing dokumen.

Kemudian tambahkan direktif include di file konfigurasi:

include /etc/nginx/conf.d/*.conf;

TIPS #7: Batasi Jumlah Koneksi berdasarkan IP di Nginx

Untuk membatasi koneksi berdasarkan IP, gunakan arahan limit_conn_zone (dalam konteks http atau setidaknya di luar blok server) dan limit_conn (dalam http, blok server, atau konteks lokasi).

Namun, perlu diingat bahwa tidak semua koneksi dihitung – tetapi hanya koneksi yang permintaannya diproses oleh server dan seluruh header permintaannya telah dibaca.

Sebagai contoh, mari kita atur jumlah maksimum koneksi ke 1 (ya, ini berlebihan, tetapi dalam kasus ini akan berfungsi dengan baik) di zona bernama addr (Anda dapat mengaturnya ke apa pun nama yang Anda inginkan):

limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 1;

Tes sederhana dengan Apache Benchmark (Lakukan Pemuatan Nginx) di mana total koneksi 10 dibuat dengan permintaan simultan 2 akan membantu kami menunjukkan maksud kami:

ab -n 10 -c 2 http://192.168.0.25/index.html

Lihat tip berikutnya untuk rincian lebih lanjut.

TIPS #8: Siapkan Log Monitor untuk Nginx

Setelah Anda melakukan pengujian yang dijelaskan pada tip sebelumnya, periksa log kesalahan yang ditentukan untuk blok server:

Anda mungkin ingin menggunakan grep untuk memfilter log permintaan gagal yang dibuat ke zona tambahan yang ditentukan dalam TIP #7:

grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto

Demikian pula, Anda dapat memfilter log akses untuk informasi yang menarik, seperti:

  1. IP klien
  2. Jenis peramban
  3. Jenis permintaan HTTP
  4. Sumber daya diminta
  5. Blok server menjawab permintaan (berguna jika beberapa host virtual masuk ke file yang sama).

Dan ambil tindakan yang tepat jika Anda mendeteksi aktivitas yang tidak biasa atau tidak diinginkan.

TIPS #9: Cegah Hotlinking Gambar di Nginx

Hotlinking gambar terjadi ketika seseorang menampilkan gambar yang dihosting di situs Anda di situs lain. Hal ini menyebabkan peningkatan penggunaan bandwidth Anda (yang Anda bayar) sementara orang lain dengan senang hati menampilkan gambar tersebut seolah-olah itu adalah miliknya. Dengan kata lain, ini merupakan kerugian ganda bagi Anda.

Misalnya, Anda memiliki subdirektori bernama img di dalam blok server tempat Anda menyimpan semua gambar yang digunakan dalam host virtual tersebut. Untuk mencegah situs lain menggunakan gambar Anda, Anda perlu memasukkan blok lokasi berikut ke dalam definisi host virtual Anda:

location /img/ {
  valid_referers none blocked 192.168.0.25;
   if ($invalid_referer) {
     return   403;
   }
}

Kemudian modifikasi file index.html di setiap virtual host sebagai berikut:

192.168.0.26 192.168.0.25
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Nginx means power</title>
</head>
<body>
<h1>Nginx means power!</h1>
<img src=”http://192.168.0.25/img/nginx.png” />
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Tecmint loves Nginx</title>
</head>
<body>
<h1>Tecmint loves Nginx!</h1>
<img src=”img/nginx.png” />
</body>
</html>

Sekarang jelajahi setiap situs dan seperti yang Anda lihat, gambar ditampilkan dengan benar di 192.168.0.25 namun digantikan oleh respons 403 di 192.168.0.26:

Perhatikan bahwa tip ini bergantung pada browser jarak jauh yang mengirimkan bidang Referer.

TIPS #10: Nonaktifkan SSL dan hanya Aktifkan TLS di Nginx

Jika memungkinkan, lakukan apa pun untuk menghindari SSL di salah satu versinya dan gunakan TLS sebagai gantinya. ssl_protocols berikut harus ditempatkan di server atau konteks http di file host virtual Anda atau merupakan file terpisah melalui direktif include (beberapa orang menggunakan file bernama ssl.conf , tapi itu sepenuhnya terserah Anda):

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

Misalnya:

TIPS #11: Buat Sertifikat di Nginx

Pertama, buat kunci dan sertifikat. Jangan ragu untuk menggunakan jenis enkripsi lain jika Anda ingin:

openssl genrsa -aes256 -out tecmintlovesnginx.key 1024
openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr
cp tecmintlovesnginx.key tecmintlovesnginx.key.org
openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key
openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt

Kemudian tambahkan baris berikut di dalam blok server terpisah sebagai persiapan untuk tip berikutnya (pengalihan http --> https) dan pindahkan juga arahan terkait SSL ke blok baru:

server {
    listen 192.168.0.25:443 ssl;
    server_tokens off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    root   /var/www/tecmintlovesnginx.com/public_html;
    ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt;
    ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
}

Pada tip berikutnya kami akan memverifikasi bagaimana situs kami sekarang menggunakan sertifikat dan TLS yang ditandatangani sendiri.

TIPS #12: Alihkan lalu lintas HTTP ke HTTPS di Nginx

Tambahkan baris berikut ke blok server pertama:

return 301 https://$server_name$request_uri;

Arahan di atas akan mengembalikan respons 301 (Dipindahkan secara permanen), yang digunakan untuk pengalihan URL permanen setiap kali permintaan dibuat ke port 80 host virtual Anda, dan akan mengalihkan permintaan ke blok server tempat kami ditambahkan di tip sebelumnya.

Gambar di bawah menunjukkan pengalihan dan mengonfirmasi fakta bahwa kami menggunakan TLS 1.2 dan AES-256 untuk enkripsi:

Ringkasan

Pada artikel ini kami telah membagikan beberapa tips untuk mengamankan server web Nginx Anda. Kami akan sangat senang mendengar pendapat Anda dan, jika Anda memiliki kiat lain yang ingin Anda bagikan dengan komunitas lainnya, silakan beri tahu kami dengan mengirimkan catatan kepada kami menggunakan formulir komentar di bawah.