Nginx Web Sunucusunun Güvenliğini Sağlamak, Güçlendirmek ve Performansını Artırmak için En İyi Kılavuz


Nginx hakkında duyduğunuz harika şeylere dayanarak belki de denemeye karar verdiniz. Bu siteyi o kadar beğenmişsinizdir ki, bu sitede konuyla ilgili yayınladığımız bazı yazıları inceledikten sonra Apache kurulumlarınızı Nginx ile değiştirmeyi düşünebilirsiniz.

Eğer öyleyse, Nginx sunucularınızın güvenliğini artırmak için (Nginx'i güncel tutmaktan, TLS kullanma ve HTTP'yi HTTPS'ye yönlendirme) ve bunlardan bazılarının Apache ile yapacağınıza çok benzediğini fark edeceksiniz.

Kaçırmayın:

13 Apache Web Sunucusu Güvenliği ve Sağlamlaştırma İpuçları

Apache Web Sunucusunu Güvenli Hale Getirmek için 25 Apache Htaccess Püf Noktası

Nginx Test Ortamı

Bu kılavuzda aşağıdaki ortamı kullanacağız:

  1. Debian GNU/Linux 8.1 (jessie).
  2. IP adresi: IP tabanlı sanal ortamda açıklandığı gibi 192.168.0.25 (tecmintlovesnginx.com) ve 192.168.0.26 (nginxmeanspower.com) ana bilgisayarlar bölümü

    1. “Nginx ile İsim Tabanlı ve IP Tabanlı Sanal Ana Bilgisayarlar (Sunucu Blokları) Nasıl Kurulur”
  3. Nginx sürümü: nginx/1.6.2.
  4. Size kolaylık sağlamak için son yapılandırma dosyasını burada bulabilirsiniz (Pastebin bağlantısı).

Bunu aklımızda tutarak başlayalım.

İPUCU #1: Nginx'i güncel tutun

Bu yazının yazıldığı sırada CentOS (EPEL'de) ve Debian depolarındaki en son Nginx sürümleri 1.6.3 ve 1.6.2-5'dir. sırasıyla güçlü>.

Kaçırmayın: Depolardan ve Kaynaktan Nginx'in En Son Kararlı Sürümünü Yükleyin

Depolardan yazılım yüklemek, programı kaynak kodundan derlemekten daha kolay olsa da, bu son seçeneğin iki avantajı vardır: 1) Nginx'e ekstra modüller (mod_security gibi) oluşturmanıza olanak tanır ve 2) her zaman daha yeni bir sürüm sağlar depolardan daha fazladır (bugün itibariyle 1.9.9). Sürüm notları her zaman Nginx web sitesinde mevcuttur.

Kaçırmayın:

Apache'yi Mod_Security ve Mod_Evasive Kullanarak Kaba Kuvvet ve DDoS Saldırılarına Karşı Koruyun

İPUCU #2: Nginx'teki Gereksiz Modülleri Kaldır

Kaynaktan kurulum sırasında modülleri Nginx'ten açıkça kaldırmak için şunları yapın:

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

Örneğin:

./configure  --without-http_dav_module --withouthttp_spdy_module 

Muhtemelen tahmin edeceğiniz gibi, önceki bir Nginx kurulumundaki modülleri kaynaktan kaldırmak, derlemenin yeniden yapılmasını gerektirir.

Bir uyarı: Yapılandırma yönergeleri modüller tarafından sağlanır. İleride ihtiyaç duyacağınız bir yönergeyi içeren modülü devre dışı bırakmadığınızdan emin olun! Modülleri devre dışı bırakmaya karar vermeden önce her modülde bulunan yönergelerin listesi için nginx belgelerini kontrol etmelisiniz.

İPUCU #3: Nginx'te server_tokens Yönergesini devre dışı bırakın

server_tokens yönergesi Nginx'e mevcut sürümünü hata sayfalarında göstermesini söyler. Bu, belirli bir sürümdeki bilinen güvenlik açıklarının web sunucunuza neden olduğu saldırıları önlemek amacıyla bu bilgiyi dünyayla paylaşmak istemediğiniz için arzu edilen bir durum değildir.

server_tokens yönergesini devre dışı bırakmak için, bir sunucu bloğunun içinde if'i kapalı olarak ayarlayın:

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;
}

Nginx'i yeniden başlatın ve değişiklikleri doğrulayın:

İPUCU #4: Nginx'te HTTP Kullanıcı Aracılarını Reddet

HTTP kullanıcı aracısı, bir web sunucusuna karşı içerik anlaşması için kullanılan bir yazılımdır. Buna aynı zamanda sistem kaynaklarını boşa harcayarak web sunucunuzun performansını etkileyebilecek kötü amaçlı yazılım botları ve tarayıcılar da dahildir.

İstenmeyen kullanıcı aracılarının listesini daha kolay tutmak için aşağıdaki içeriğe sahip bir dosya (örneğin /etc/nginx/blockuseragents.rules) oluşturun:

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

Daha sonra, sunucu bloğu tanımının önüne aşağıdaki satırı yerleştirin:

include /etc/nginx/blockuseragents.rules;

Kullanıcı aracısı dizesi yukarıda tanımlanan kara listedeyse 403 yanıtı döndürecek bir if ifadesi:

Nginx'i yeniden başlattığınızda dizesi yukarıdakiyle eşleşen tüm kullanıcı aracılarının web sunucunuza erişimi engellenecektir. 192.168.0.25'i sunucunuzun IP'siyle değiştirin ve wget'in --user-agent anahtarı için farklı bir dize seçmekten çekinmeyin:

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

İPUCU #5: Nginx'te İstenmeyen HTTP Yöntemlerini Devre Dışı Bırakın

Fiiller olarak da bilinen HTTP yöntemleri, Nginx tarafından sunulan bir kaynak üzerinde gerçekleştirilmesi istenen eylemi belirtir. Yaygın web siteleri ve uygulamalar için yalnızca GET, POST ve HEAD'e izin vermeli ve diğerlerini devre dışı bırakmalısınız.

Bunu yapmak için aşağıdaki satırları bir sunucu bloğunun içine yerleştirin. 444 HTTP yanıtı, boş yanıt anlamına gelir ve genellikle Nginx'te kötü amaçlı yazılım saldırılarını yanıltmak için kullanılır:

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

Test etmek amacıyla, DELETE isteği göndermek için curl kullanın ve çıktıyı normal bir GET gönderdiğiniz zamankiyle karşılaştırın:

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

İPUCU #6: Nginx'te Arabellek Boyutu Sınırlamalarını Ayarlayın

Nginx web sunucunuza yönelik arabellek taşması saldırılarını önlemek için aşağıdaki yönergeleri ayrı bir dosyaya ayarlayın (örneğin, /etc/nginx/conf.d/buffer.conf adında yeni bir dosya oluşturun):

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

Yukarıdaki yönergeler, web sunucunuza yapılan isteklerin sisteminizde arabellek taşmasına neden olmayacağını garanti edecektir. Her birinin ne yaptığı hakkında daha fazla ayrıntı için bir kez daha dokümanlara bakın.

Daha sonra yapılandırma dosyasına bir include yönergesi ekleyin:

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

İPUCU #7: Nginx'te Bağlantı Sayısını IP'ye Göre Sınırlayın

Bağlantıları IP'ye göre sınırlamak için limit_conn_zone (http bağlamında veya en azından sunucu bloğunun dışında) ve limit_conn (bir http, sunucu bloğu veya konum bağlamında) yönergelerini kullanın.

Ancak, tüm bağlantıların sayılmadığını, yalnızca sunucu tarafından işlenen bir isteği olan ve istek başlığının tamamının okunduğunu unutmayın.

Örneğin, addr adlı bir bölgede maksimum bağlantı sayısını 1 olarak ayarlayalım (evet, abartı ama bu durumda işini gayet iyi yapacaktır) (bunu istediğiniz herhangi bir değere ayarlayabilirsiniz) İstediğiniz isim):

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

Apache Benchmark (Perform Nginx Load) ile 2 eşzamanlı istekle toplam 10 bağlantının yapıldığı basit bir test, amacımızı göstermemize yardımcı olacaktır:

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

Daha fazla ayrıntı için sonraki ipucuna bakın.

İPUCU #8: Nginx için İzleme Günlüklerini Ayarlayın

Önceki ipucunda açıklanan testi gerçekleştirdikten sonra sunucu bloğu için tanımlanan hata günlüğünü kontrol edin:

İPUCU #7'de tanımlanan ekleme bölgesine yapılan başarısız isteklere ilişkin günlükleri filtrelemek için grep'i kullanmak isteyebilirsiniz:

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

Benzer şekilde, aşağıdakiler gibi ilginizi çeken bilgiler için erişim günlüğünü filtreleyebilirsiniz:

  1. İstemci IP'si
  2. Tarayıcı türü
  3. HTTP istek türü
  4. Kaynak istendi
  5. İsteği yanıtlayan sunucu bloğu (birden fazla sanal ana bilgisayar aynı dosyaya giriş yapıyorsa kullanışlıdır).

Olağandışı veya istenmeyen herhangi bir etkinlik tespit ederseniz uygun eylemi gerçekleştirin.

İPUCU #9: Nginx'te Görüntü Bağlantısını Önleyin

Resim sıcak bağlantısı, bir kişi sizin sitenizde barındırılan bir resmi başka bir sitede görüntülediğinde gerçekleşir. Bu, bant genişliği kullanımınızda (ki bunun için ödeme yaparsınız) bir artışa neden olurken, diğer kişi görüntüyü sanki kendi malıymış gibi mutlu bir şekilde görüntüler. Başka bir deyişle, bu sizin için çifte kayıptır.

Örneğin, sunucu bloğunuzun içinde, o sanal konakta kullanılan tüm görüntüleri sakladığınız img adında bir alt dizininiz olduğunu varsayalım. Diğer sitelerin görsellerinizi kullanmasını önlemek için sanal ana makine tanımınıza aşağıdaki konum bloğunu eklemeniz gerekecektir:

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

Daha sonra her sanal konaktaki index.html dosyasını aşağıdaki gibi değiştirin:

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>

Şimdi her siteye göz atın ve görebileceğiniz gibi, resim 192.168.0.25'te doğru bir şekilde görüntüleniyor ancak 192.168.0.26'da 403 yanıtıyla değiştiriliyor. güçlü>:

Bu ipucunun Yönlendiren alanını gönderen uzak tarayıcıya bağlı olduğunu unutmayın.

İPUCU #10: SSL'yi devre dışı bırakın ve yalnızca Nginx'te TLS'yi etkinleştirin

Mümkün olduğunda, sürümlerinden herhangi birinde SSL'den kaçınmak için ne gerekiyorsa yapın ve bunun yerine TLS'yi kullanın. Aşağıdaki ssl_protocols, sanal ana makine dosyanızdaki bir sunucuya veya http bağlamına yerleştirilmelidir veya bir içerme yönergesi yoluyla ayrı bir dosya olmalıdır (bazı kişiler ssl.conf adlı bir dosya kullanır) , ancak bu tamamen size kalmış):

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

Örneğin:

İPUCU #11: Nginx'te Sertifikalar Oluşturun

Öncelikle bir anahtar ve sertifika oluşturun. İsterseniz farklı bir şifreleme türü kullanmaktan çekinmeyin:

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

Ardından, bir sonraki ipucuna (http --> https yönlendirme) hazırlık olarak aşağıdaki satırları ayrı bir sunucu bloğunun içine ekleyin ve SSL ile ilgili yönergeleri de yeni bloğa taşıyın:

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;
}

Bir sonraki ipucunda sitemizin artık nasıl kendinden imzalı bir sertifika ve TLS kullandığını doğrulayacağız.

İPUCU #12: Nginx'te HTTP trafiğini HTTPS'ye yönlendirin

İlk sunucu bloğuna aşağıdaki satırı ekleyin:

return 301 https://$server_name$request_uri;

Yukarıdaki yönerge, sanal ana makinenizin 80 numaralı bağlantı noktasına bir istek yapıldığında kalıcı URL yeniden yönlendirmesi için kullanılan bir 301 (Kalıcı olarak taşındı) yanıtı döndürecek ve isteği, belirlediğimiz sunucu bloğuna yönlendirecektir. önceki ipucuna eklendi.

Aşağıdaki resim yönlendirmeyi göstermekte ve şifreleme için TLS 1.2 ve AES-256 kullandığımızı doğrulamaktadır:

Özet

Bu yazıda Nginx web sunucunuzun güvenliğini sağlamak için birkaç ipucu paylaştık. Ne düşündüğünüzü duymak isteriz. Topluluğun geri kalanıyla paylaşmak istediğiniz başka ipuçlarınız varsa aşağıdaki yorum formunu kullanarak bize bir not göndererek bize bildirmekten çekinmeyin.