Panduan Terbaik untuk Mengamankan, Mengeraskan dan Meningkatkan Prestasi Pelayan Web Nginx

Panduan Terbaik untuk Mengamankan, Mengeraskan dan Meningkatkan Prestasi Pelayan Web Nginx
Petua Pengerasan Keselamatan Nginx

Berdasarkan perkara indah yang anda dengar Nginx, Mungkin anda memutuskan untuk mencubanya. Anda mungkin sangat menyukainya yang mempertimbangkan untuk menggantikan pemasangan Apache anda dengan nginx setelah melalui beberapa artikel mengenai topik yang telah kami diterbitkan di laman web ini.

Jika ya, saya pasti anda akan mengalu -alukan panduan ini dengan tangan terbuka kerana kami akan menutup 12 petua untuk meningkatkan keselamatan nginx anda pelayan (mulai dari menjaga nginx sehingga kini untuk menggunakan menggunakan TLS dan mengalihkan HTTP ke HTTPS), dan anda akan perhatikan bahawa sesetengah daripada mereka sangat mirip dengan apa yang akan anda lakukan dengan Apache.

Jangan ketinggalan:

13 Apache Web Security and Hardening Tips

25 Apache HTACCESS TRICKS UNTUK MENCARI APACHE WEB Server

Persekitaran ujian nginx

Kami akan menggunakan persekitaran 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 diterangkan dalam bahagian tuan rumah maya berasaskan IP di
    1. "Cara Menyiapkan Nama Berasaskan Nama dan Hos Maya Berasaskan IP (Blok Pelayan) dengan Nginx"
  3. Versi nginx: nginx/1.6.2.
  4. Untuk kemudahan anda, inilah fail konfigurasi terakhir (pautan pastebin).

Dengan itu, mari kita mulakan.

Petua #1: Pastikan nginx terkini

Pada masa penulisan ini, versi nginx terkini di CentOS (IN Epel) dan repositori debian adalah 1.6.3 dan 1.6.2-5, masing -masing.

Jangan ketinggalan: Pasang versi stabil nginx terbaru dari repositori dan sumber

Walaupun memasang perisian dari repositori lebih mudah daripada menyusun program dari kod sumber, pilihan terakhir ini mempunyai dua kelebihan: 1) ia membolehkan anda membina modul tambahan ke dalam nginx (seperti mod_security), dan 2) ia akan sentiasa menyediakan versi yang lebih baru daripada repositori (1.9.9 Sehingga hari ini). Nota Siaran sentiasa tersedia di laman web Nginx.

Jangan ketinggalan:

Lindungi Apache daripada serangan kekerasan dan serangan DDOS menggunakan mod_security dan mod_evasive

Petua #2: Keluarkan modul yang tidak perlu dalam nginx

Untuk menghapuskan modul dari Nginx secara eksplisit semasa memasang dari sumber, lakukan:

# ./Konfigurasi-Without-Module1-Without-Module2-Without-Module3 

Sebagai contoh:

# ./Konfigurasi --without-http_dav_module --withouthttp_spdy_module 

Seperti yang anda mungkin akan meneka, mengeluarkan modul dari pemasangan nginx sebelumnya dari sumber memerlukan melakukan kompilasi lagi.

Perkataan berhati -hati: Arahan konfigurasi disediakan oleh modul. Pastikan anda tidak melumpuhkan modul yang mengandungi arahan yang anda perlukan di jalan! Anda harus menyemak dokumen nginx untuk senarai arahan yang terdapat dalam setiap modul sebelum mengambil keputusan untuk melumpuhkan modul.

Petua #3: Lumpuhkan Arahan Server_Tokens di nginx

The server_tokens Arahan memberitahu Nginx untuk memaparkan versi semasa pada halaman ralat. Ini tidak diingini kerana anda tidak mahu berkongsi maklumat tersebut dengan dunia untuk mengelakkan serangan di pelayan web anda yang disebabkan oleh kelemahan yang diketahui dalam versi tertentu.

Untuk melumpuhkan server_tokens Arahan, tetapkan jika dimatikan di dalam blok pelayan:

pelayan dengar 192.168.0.25:80; server_token off; server_name tecmintlovesnginx.com www.tecmintlovesnginx.com; Access_log/var/www/log/tecmintlovesnginx.akses.log; error_log/var/www/log/tecmintlovesnginx.ralat.ralat log; root/var/www/tecmintlovesnginx.com/public_html; Indeks indeks.Indeks HTML.htm;  

Mulakan semula nginx dan sahkan perubahan:

Menyembunyikan maklumat versi nginx

Petua #4: Menolak Ejen Pengguna HTTP di Nginx

Ejen Pengguna HTTP adalah perisian yang digunakan untuk rundingan kandungan terhadap pelayan web. Ini juga termasuk bot malware dan crawler yang mungkin memberi kesan kepada prestasi pelayan web anda dengan membuang sumber sistem.

Untuk lebih mudah mengekalkan senarai ejen pengguna yang tidak diingini, buat fail (/etc/nginx/blockuseragents.peraturan Contohnya) dengan kandungan berikut:

peta $ http_user_agent $ blockedagent default 0; ~*Berbuah 1; ~*bot 1; ~*Backdoor 1; ~*Crawler 1; ~*Bandit 1;  

Seterusnya, letakkan baris berikut sebelum definisi blok pelayan:

termasuk/etc/nginx/blockuseragents.peraturan; 

Dan pernyataan jika mengembalikan tindak balas 403 jika rentetan ejen pengguna berada dalam senarai hitam yang ditakrifkan di atas:

Lumpuhkan Ejen Pengguna di Nginx

Mulakan semula nginx, dan semua ejen pengguna yang rentetan sepadan dengan di atas akan disekat daripada mengakses pelayan web anda. Menggantikan 192.168.0.25 dengan IP pelayan anda dan berasa bebas untuk memilih rentetan yang berbeza untuk --ejen pengguna suis wget:

# wget http: // 192.168.0.25/indeks.html # wget --User-Agent "I Am Bandit Haha" http: // 192.168.0.25/indeks.html 
Blok ejen pengguna di nginx

Petua #5: Lumpuhkan kaedah HTTP yang tidak diingini di Nginx

Juga dikenali sebagai kata kerja, kaedah HTTP menunjukkan tindakan yang dikehendaki diambil pada sumber yang disampaikan oleh nginx. Untuk laman web dan aplikasi web biasa, anda hanya perlu membenarkan Dapatkan, Jawatan, dan Kepala dan melumpuhkan semua yang lain.

Untuk berbuat demikian, letakkan baris berikut di dalam blok pelayan. A 444 Respons HTTP bermaksud tindak balas kosong dan sering digunakan dalam nginx untuk menipu serangan malware:

jika ($ request_method !~ ^(Get | kepala | pos) $) return 444;  

Untuk menguji, menggunakan curl untuk menghantar a Padam meminta dan membandingkan output apabila anda menghantar biasa Dapatkan:

# curl -x padam http: // 192.168.0.25/indeks.html # curl -x post http: // 192.168.0.25/indeks.html 
Lumpuhkan permintaan HTTP yang tidak diingini di nginx

Petua #6: Tetapkan batasan saiz penampan di nginx

Untuk mengelakkan serangan limpahan penampan terhadap pelayan web nginx anda, tetapkan arahan berikut dalam fail berasingan (buat fail baru bernama /etc/nginx/conf.D/Buffer.Conf, sebagai contoh):

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 permintaan yang dibuat ke pelayan web anda tidak akan menyebabkan limpahan penampan dalam sistem anda. Sekali lagi, rujuk dokumen untuk butiran lanjut mengenai apa yang mereka lakukan.

Kemudian tambahkan arahan termasuk dalam fail konfigurasi:

termasuk/etc/nginx/conf.d/*.Con; 
Tetapkan saiz penampan di nginx

Petua #7: Hadkan bilangan sambungan melalui IP di nginx

Untuk menghadkan sambungan melalui IP, gunakan had_conn_zone (dalam konteks HTTP atau sekurang -kurangnya di luar blok pelayan) dan arahan HTTP, blok pelayan, atau konteks lokasi).

Walau bagaimanapun, perlu diingat bahawa tidak semua sambungan dikira - tetapi hanya mereka yang mempunyai permintaan yang diproses oleh pelayan dan header permintaan keseluruhannya telah dibaca.

Contohnya, mari kita tetapkan bilangan maksimum sambungan ke 1 (Ya, itu adalah keterlaluan, tetapi ia akan melakukan pekerjaan dengan baik dalam kes ini) di zon bernama Addr (anda boleh menetapkan ini kepada apa sahaja nama yang anda mahukan):

had_CONN_ZONE $ BINARY_REMOTE_ADDR ZONE = ADDR: 5M; had_conn addr 1; 
Hadkan bilangan permintaan HTTP di nginx

Ujian mudah dengan penanda aras Apache (melakukan beban nginx) di mana 10 Jumlah sambungan dibuat dengan 2 Permintaan serentak akan membantu kami menunjukkan maksud kami:

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

Lihat petua seterusnya untuk maklumat lanjut.

Petua #8: Log Monitor Persediaan untuk Nginx

Sebaik sahaja anda telah melakukan ujian yang diterangkan di hujung sebelumnya, periksa log ralat yang ditakrifkan untuk blok pelayan:

Log ralat nginx

Anda mungkin mahu menggunakan grep untuk menapis kayu balak untuk permintaan gagal yang dibuat ke Tambahz zon ditakrifkan dalam Petua #7:

# grep addr/var/www/log/tecmintlovesnginx.ralat.Log -Color = Auto 
Pemantauan log Nginx

Begitu juga, anda boleh menapis log akses untuk maklumat yang menarik, seperti:

  1. IP Pelanggan
  2. Jenis penyemak imbas
  3. Jenis Permintaan HTTP
  4. Sumber yang diminta
  5. Blok Pelayan Menjawab Permintaan (Berguna jika beberapa tuan rumah maya sedang log masuk ke fail yang sama).

Dan mengambil tindakan yang sesuai jika anda mengesan aktiviti yang tidak biasa atau tidak diingini.

Petua #9: Cegah Hotlinking Imej di Nginx

Hotlinking imej berlaku apabila seseorang memaparkan di laman web lain gambar yang dihoskan pada anda. Ini menyebabkan peningkatan penggunaan jalur lebar anda (yang anda bayar) sementara orang lain dengan senang hati memaparkan imej seolah -olah ia adalah harta miliknya. Dengan kata lain, ia adalah kerugian berganda untuk anda.

Contohnya, katakan anda mempunyai subdirektori yang dinamakan img di dalam blok pelayan anda di mana anda menyimpan semua imej yang digunakan dalam tuan rumah maya itu. Untuk mengelakkan laman web lain daripada menggunakan imej anda, anda perlu memasukkan blok lokasi berikut di dalam definisi tuan rumah maya anda:

lokasi / img / valid_referers tiada yang disekat 192.168.0.25; jika ($ invalid_referer) return 403;  

Kemudian ubah suai indeks.html Fail dalam setiap tuan rumah maya seperti berikut:

192.168.0.26

192.168.0.25





Nginx bermaksud kuasa


Nginx bermaksud kuasa!








Tecmint suka nginx


Tecmint suka nginx!




Sekarang semak imbas ke setiap laman web dan seperti yang anda lihat, imej dipaparkan dengan betul 192.168.0.25 tetapi digantikan oleh a 403 respons dalam 192.168.0.26:

Lumpuhkan Hotlinking Imej Nginx

Perhatikan bahawa hujung ini bergantung pada penyemak imbas jauh yang menghantar medan rujukan.

Petua #10: Lumpuhkan SSL dan hanya membolehkan TLS di nginx

Bila mungkin, lakukan apa sahaja yang diperlukan untuk mengelakkan SSL dalam mana -mana versi dan penggunaannya TLS sebaliknya. Yang berikut ssl_protocols harus diletakkan dalam konteks pelayan atau http dalam fail hos maya anda atau merupakan fail berasingan melalui arahan termasuk (sesetengah orang menggunakan fail bernama SSL.Conf, Tetapi ia terpulang kepada anda):

SSL_PROTOCOLS TLSV1 TLSV1.1 TLSV1.2; 

Sebagai contoh:

Lumpuhkan SSL dan aktifkan TLS di nginx

Petua #11: Buat sijil di nginx

Pertama, menghasilkan kunci dan sijil. Jangan ragu untuk menggunakan jenis penyulitan yang berbeza jika anda mahu:

# openssl genrsa -aes256 -out tecmintlovesnginx.kunci 1024 # openssl req -new -key tecmintlovesnginx.Key -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.Key -out tecmintlovesnginx.Crt 

Kemudian tambahkan baris berikut di dalam blok pelayan yang berasingan sebagai persediaan untuk hujung seterusnya (http -> https pengalihan semula) dan gerakkan arahan yang berkaitan dengan SSL ke blok baru juga:

pelayan dengar 192.168.0.25: 443 SSL; server_token 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.kunci; SSL_PROTOCOLS TLSV1 TLSV1.1 TLSV1.2;  

Di hujung seterusnya, kami akan mengesahkan bagaimana laman web kami kini menggunakan sijil dan TLS yang ditandatangani sendiri.

Petua #12: Mengalihkan trafik HTTP ke HTTPS di nginx

Tambahkan baris berikut ke blok pelayan pertama:

kembali 301 https: // $ server_name $ request_uri; 
Redirect http ke https di nginx

Arahan di atas akan mengembalikan a 301 (Digerakkan secara kekal), yang digunakan untuk pengalihan URL tetap setiap kali permintaan dibuat ke port 80 tuan rumah maya anda, dan akan mengalihkan permintaan ke blok pelayan yang kami tambahkan di hujung sebelumnya.

Imej di bawah menunjukkan pengalihan semula dan mengesahkan hakikat bahawa kami menggunakan TLS 1.2 dan AES-256 untuk penyulitan:

Sahkan penyulitan TLS nginx

Ringkasan

Dalam artikel ini kami telah berkongsi beberapa petua untuk menjamin pelayan web nginx anda. Kami ingin mendengar apa yang anda fikirkan dan, jika anda mempunyai petua lain yang ingin anda kongsi dengan seluruh masyarakat, jangan ragu untuk memberitahu kami dengan menghantar nota kami menggunakan borang komen di bawah.