Panduan Terbaik untuk Mengamankan, Mengeraskan dan Meningkatkan Prestasi Pelayan Web Nginx
- 2490
- 744
- Noah Torp
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:
- Debian GNU/Linux 8.1 (Jessie).
- 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
- "Cara Menyiapkan Nama Berasaskan Nama dan Hos Maya Berasaskan IP (Blok Pelayan) dengan Nginx"
- Versi nginx: nginx/1.6.2.
- 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 nginxPetua #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 NginxMulakan 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.htmlBlok 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.htmlLumpuhkan 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 nginxAnda 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 = AutoPemantauan log Nginx
Begitu juga, anda boleh menapis log akses untuk maklumat yang menarik, seperti:
- IP Pelanggan
- Jenis penyemak imbas
- Jenis Permintaan HTTP
- Sumber yang diminta
- 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 NginxPerhatikan 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 nginxPetua #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 nginxRingkasan
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.
- « Cara Membuat Server IM/Sembang Anda Sendiri Menggunakan Openfire di Linux
- Cara Memperbaiki Sambungan Dikongsi ke x.x.ralat xx ditutup ansible »