Panduan Utama untuk Mengamankan, Mengeraskan, dan Meningkatkan Kinerja Server Web Nginx
- 2262
- 8
- Darryl Ritchie
Berdasarkan hal -hal indah yang telah Anda dengar Nginx, Mungkin Anda memutuskan untuk mencobanya. Anda mungkin sangat menyukainya sehingga mempertimbangkan untuk mengganti instalasi Apache Anda dengan Nginx setelah melalui beberapa artikel tentang topik yang telah kami terbitkan di situs ini.
Jika demikian, saya yakin Anda akan menyambut panduan ini dengan tangan terbuka karena kami akan menutupi 12 tips untuk meningkatkan keamanan nginx Anda Server (mulai dari menjaga agar Nginx tetap terkini hingga menggunakan TLS dan mengarahkan ulang HTTP ke HTTPS), dan Anda akan mencatat bahwa beberapa dari mereka sangat mirip dengan apa yang akan Anda lakukan dengan Apache.
Jangan lewatkan:
13 APACHE Web Server Keamanan dan Tips Pengerasan
25 trik htaccess apache untuk mengamankan server web apache
Lingkungan pengujian nginx
Kami akan menggunakan lingkungan berikut dalam panduan ini:
- Debian GNU/Linux 8.1 (Jessie).
- Alamat IP: 192.168.0.25 (Tecmintlovesnginx.com) dan 192.168.0.26 (NginxmeanSpower.com), seperti yang dijelaskan di bagian host virtual berbasis IP di
- “Cara Mengatur Nama Berbasis Nama dan Host Virtual Berbasis IP (Blok Server) dengan Nginx“
- Versi Nginx: Nginx/1.6.2.
- Untuk kenyamanan Anda, berikut adalah file konfigurasi akhir (tautan pastebin).
Dengan mengingat hal itu, mari kita mulai.
Kiat #1: teruskan Nginx
Pada saat penulisan ini, versi Nginx terbaru di Centos (IN Epel) dan repositori Debian adalah 1.6.3 Dan 1.6.2-5, masing -masing.
Jangan lewatkan: Instal versi stabil terbaru Nginx dari repositori dan sumber
Meskipun menginstal perangkat lunak dari repositori lebih mudah daripada menyusun program dari kode sumber, opsi terakhir ini memiliki dua keunggulan: 1) memungkinkan Anda untuk membangun modul tambahan ke Nginx (seperti mod_security), dan 2) itu akan selalu memberikan versi yang lebih baru dari repositori (1.9.9 Sampai hari ini). Catatan rilis selalu tersedia di situs web nginx.
Jangan lewatkan:
Lindungi Apache dari serangan brute force dan ddoS menggunakan mod_security dan mod_evasive
Tip #2: Hapus modul yang tidak perlu di nginx
Untuk secara eksplisit menghapus modul dari nginx saat menginstal dari sumber, lakukan:
# ./configure --without-module1-dengan-module2-dengan-modul3
Misalnya:
# ./configure --without-http_dav_module --withouthttp_spdy_module
Seperti yang mungkin akan Anda tebak, menghapus modul dari instalasi nginx sebelumnya dari sumber memerlukan melakukan kompilasi lagi.
Kata Perhatian: Arahan konfigurasi disediakan oleh modul. Pastikan Anda tidak menonaktifkan modul yang berisi arahan yang Anda perlukan di jalan! Anda harus memeriksa dokumen nginx untuk daftar arahan yang tersedia di setiap modul sebelum mengambil keputusan tentang menonaktifkan modul.
Tip #3: Nonaktifkan Petunjuk Server_Tokens di Nginx
Itu server_tokens
Petunjuk memberi tahu Nginx untuk menampilkan versi saat ini di halaman kesalahan. Ini tidak diinginkan karena Anda tidak ingin membagikan informasi itu dengan dunia untuk mencegah serangan di server web Anda yang disebabkan oleh kerentanan yang diketahui dalam versi spesifik itu.
Untuk menonaktifkan server_tokens
Petunjuk, atur jika ke dalam blok server:
server dengarkan 192.168.0.25:80; Server_tokens Off; server_name tecmintlovesnginx.com www.Tecmintlovesnginx.com; Access_log/var/www/logs/tecmintlovesnginx.mengakses.catatan; ERROR_LOG/VAR/WWW/LOGS/TECMINTLOVESNGINX.kesalahan.kesalahan log; root/var/www/tecmintlovesnginx.com/public_html; Indeks Indeks.Indeks HTML.htm;
Restart nginx dan verifikasi perubahan:
Sembunyikan Informasi Versi NginxTip #4: Deny HTTP Agen Pengguna di Nginx
Agen Pengguna HTTP adalah perangkat lunak yang digunakan untuk negosiasi konten terhadap server web. Ini juga termasuk bot malware dan crawler yang mungkin berakhir memengaruhi kinerja server web Anda dengan membuang -buang sumber daya sistem.
Untuk lebih mudah mempertahankan daftar agen pengguna yang tidak diinginkan, buat file (/etc/nginx/blockuseragents.aturan
misalnya) dengan konten berikut:
peta $ http_user_agent $ blockedagent default 0; ~*jahat 1; ~*bot 1; ~*Backdoor 1; ~*Crawler 1; ~*Bandit 1;
Selanjutnya, tempatkan baris berikut sebelum definisi blok server:
termasuk/etc/nginx/blockuseragents.aturan;
Dan pernyataan IF untuk mengembalikan respons 403 jika string agen pengguna ada dalam daftar hitam yang ditentukan di atas:
Nonaktifkan agen pengguna di nginxRestart nginx, dan semua agen pengguna yang stringnya cocok dengan di atas akan diblokir dari mengakses server web Anda. Mengganti 192.168.0.25 dengan IP server Anda dan jangan ragu untuk memilih string yang berbeda untuk --Agen pengguna
beralih wget:
# wget http: // 192.168.0.25/indeks.html # wget --user-agent "I Am a Bandit haha" http: // 192.168.0.25/indeks.htmlMemblokir agen pengguna di nginx
Tip #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 dan aplikasi web umum, Anda hanya boleh mengizinkan MENDAPATKAN, POS, Dan KEPALA dan nonaktifkan yang lainnya.
Untuk melakukannya, tempatkan baris berikut di dalam blok server. A 444 Respons HTTP berarti respons kosong dan sering digunakan dalam Nginx untuk membodohi serangan malware:
if ($ request_method !~ ^(Dapatkan | head | post) $) return 444;
Untuk menguji, gunakan keriting untuk mengirim a MENGHAPUS meminta dan membandingkan output dengan saat Anda mengirim reguler MENDAPATKAN:
# curl -x hapus http: // 192.168.0.25/indeks.html # curl -x posting http: // 192.168.0.25/indeks.htmlNonaktifkan permintaan HTTP yang tidak diinginkan di Nginx
Tip #6: Tetapkan batasan ukuran buffer di nginx
Untuk mencegah serangan overflow buffer terhadap server web Nginx Anda, atur arahan berikut dalam file terpisah (buat file baru bernama /etc/nginx/conf.D/buffer.conf
, Misalnya):
client_body_buffer_size 1k; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k;
Arahan di atas akan memastikan bahwa permintaan yang dibuat ke server web Anda tidak akan menyebabkan luapan buffer di sistem Anda. Sekali lagi, lihat dokumen untuk perincian lebih lanjut tentang apa yang dilakukan masing -masing dari mereka.
Kemudian tambahkan arahan sertakan di file konfigurasi:
termasuk/etc/nginx/conf.D/*.conf;Atur ukuran buffer di nginx
Tip #7: Batasi jumlah koneksi berdasarkan IP di Nginx
Untuk membatasi koneksi berdasarkan IP, gunakan Limit_conn_zone
(Dalam konteks HTTP atau setidaknya di luar blok server) dan arahan Limit_Conn (dalam HTTP, Blok Server, atau Konteks Lokasi) Arahan.
Namun, perlu diingat bahwa tidak semua koneksi dihitung - tetapi hanya mereka yang memiliki permintaan yang diproses oleh server dan seluruh header permintaannya telah dibaca.
Misalnya, mari atur jumlah maksimum koneksi ke 1
(Ya, ini berlebihan, tetapi akan melakukan pekerjaan dengan baik dalam kasus ini) di zona bernama Addr (Anda dapat mengatur ini untuk nama apa pun yang Anda inginkan):
limit_conn_zone $ binery_remote_addr zona = addr: 5m; Limit_conn addr 1;Batas Jumlah Permintaan HTTP di Nginx
Tes sederhana dengan patokan apache (lakukan beban nginx) di mana 10
Total koneksi dibuat dengan 2
Permintaan simultan akan membantu kami menunjukkan poin kami:
# ab -n 10 -c 2 http: // 192.168.0.25/indeks.html
Lihat tip berikutnya untuk detail lebih lanjut.
Kiat #8: Setup Log Monitor untuk Nginx
Setelah Anda melakukan tes yang dijelaskan di tip sebelumnya, periksa log kesalahan yang didefinisikan untuk blok server:
Log kesalahan nginxAnda mungkin ingin menggunakan grep Untuk memfilter log untuk permintaan gagal yang dibuat ke menambahkanz zona didefinisikan Kiat #7:
# grep addr/var/www/logs/tecmintlovesnginx.kesalahan.log - -color = autoPemantauan log nginx
Demikian juga, Anda dapat memfilter log akses untuk informasi yang menarik, seperti:
- IP Klien
- Jenis browser
- Jenis Permintaan HTTP
- Sumber daya diminta
- Blok server menjawab permintaan (berguna jika beberapa host virtual masuk ke file yang sama).
Dan mengambil tindakan yang tepat jika Anda mendeteksi aktivitas yang tidak biasa atau tidak diinginkan.
Tip #9: Cegah Image Hotlinking di Nginx
Image Hotlinking terjadi ketika seseorang menampilkan di situs lain gambar yang dihosting di Anda. Ini menyebabkan peningkatan penggunaan bandwidth Anda (yang Anda bayar) sementara orang lain dengan senang hati menampilkan gambar seolah -olah itu adalah propertinya. Dengan kata lain, ini adalah kerugian ganda untuk Anda.
Misalnya, katakanlah Anda memiliki namanya subdirektori img
Di dalam blok server Anda tempat Anda menyimpan semua gambar yang digunakan dalam host virtual itu. Untuk mencegah situs lain menggunakan gambar Anda, Anda harus memasukkan blok lokasi berikut di dalam definisi host virtual Anda:
Lokasi / img / valid_referers tidak ada yang diblokir 192.168.0.25; if ($ invalid_referer) return 403;
Lalu ubah indeks.html
File di setiap host virtual sebagai berikut:
192.168.0.26 | 192.168.0.25 |
Nginx berarti kekuatan Nginx berarti kekuatan! | Tecmint mencintai Nginx Tecmint mencintai Nginx! |
Sekarang telusuri setiap situs dan seperti yang Anda lihat, gambar ditampilkan dengan benar 192.168.0.25 tetapi digantikan oleh a 403 respons di 192.168.0.26:
Nonaktifkan Nginx Image HotlinkingPerhatikan bahwa tip ini tergantung pada browser jarak jauh yang mengirim bidang referensi.
Tip #10: Nonaktifkan SSL dan hanya mengaktifkan TLS di Nginx
Jika memungkinkan, lakukan apa pun yang diperlukan untuk menghindari SSL dalam salah satu versi dan penggunaannya Tls alih-alih. Pengikut ssl_protocols
harus ditempatkan di server atau konteks http dalam file host virtual Anda atau merupakan file terpisah melalui arahan sertakan (beberapa orang menggunakan file bernama SSL.conf
, Tapi itu sepenuhnya terserah Anda):
SSL_PROTOCOLS TLSV1 TLSV1.1 TLSV1.2;
Misalnya:
Nonaktifkan SSL dan Aktifkan TLS di NginxKiat #11: Buat sertifikat di nginx
Pertama, hasilkan kunci dan sertifikat. Jangan ragu untuk menggunakan jenis enkripsi yang berbeda jika Anda mau:
# OpenSSL GENRSA -AES256 -Out Tecmintlovesnginx.Kunci 1024 # OpenSSL Req -new -Key Tecmintlovesnginx.KUNCI -out tecmintlovesnginx.CSR # CP Tecmintlovesnginx.Kunci Tecmintlovesnginx.kunci.org # openssl rsa -in tecmintlovesnginx.kunci.org -out tecmintlovesnginx.Kunci # OpenSSL X509 -REQ -days 365 -in Tecmintlovesnginx.CSR -SIGNKEY TECMINTLOVESNGINX.KUNCI -out tecmintlovesnginx.crt
Kemudian tambahkan baris berikut di dalam blok server terpisah dalam persiapan untuk tip berikutnya (http -> https
pengalihan) dan pindahkan arahan terkait SSL ke blok baru juga:
server dengarkan 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/Situs-Enabled/Certs/Tecmintlovesnginx.CRT; ssl_certificate_key/etc/nginx/Situs-Enabled/Certs/Tecmintlovesnginx.kunci; SSL_PROTOCOLS TLSV1 TLSV1.1 TLSV1.2;
Di tip berikutnya kami akan memverifikasi bagaimana situs kami sekarang menggunakan sertifikat dan TLS yang ditandatangani sendiri.
Tip #12: Redirect HTTP Traffic ke HTTPS di Nginx
Tambahkan baris berikut ke blok server pertama:
return 301 https: // $ server_name $ request_uri;Redirect http ke https di nginx
Petunjuk di atas akan mengembalikan a 301 (Dipindahkan secara permanen) Respons, yang digunakan untuk pengalihan URL permanen setiap kali permintaan dibuat ke port 80 dari host virtual Anda, dan akan mengarahkan kembali permintaan ke blok server yang kami tambahkan di tip sebelumnya.
Gambar di bawah ini menunjukkan pengalihan dan mengkonfirmasi fakta yang kami gunakan TLS 1.2 Dan AES-256 untuk enkripsi:
Verifikasi enkripsi tls nginxRingkasan
Di artikel ini kami telah berbagi beberapa tips untuk mengamankan server web nginx Anda. Kami akan senang mendengar apa yang Anda pikirkan dan, jika Anda memiliki tip lain yang ingin Anda bagikan dengan anggota komunitas lainnya, jangan ragu untuk memberi tahu kami dengan mengirimkan catatan kepada kami menggunakan formulir komentar di bawah ini.
- « Cara membuat server IM/obrolan Anda sendiri menggunakan OpenFire di Linux
- Cara memperbaiki “koneksi bersama ke x.X.xx Tertutup ”Kesalahan Ansible »