Nginx Web Sunucusu, dünyada en çok kullanılan iki web sunucusundan biridir. 15 Yıl önceki kuruluşundan bu yana mükemmel bir web sunucusu uygulaması olarak konumunu sağlamlaştırdı. Nginx, Apache’den yaklaşık 2,5 kat daha hızlı olan üstün performansı ile bilinir. Toplu miktarda statik varlıkla ilgilenen ancak genel amaçlı web siteleri için de kullanılabilen web siteleri için en uygunudur. Uzun zaman önce kullanım amacını aştı ve şimdi ters proxy, önbelleğe alma, yük dengeleme, medya akışı ve daha fazlası gibi birçok görev için kullanılıyor.
Nginx Web Sunucusu Hakkında
Nginx, Engine X olarak telaffuz edilir ve modern web sahnesinde çeşitli kullanım durumlarına sahiptir. Bir web sunucusu olarak standart rolünün yanı sıra mikro hizmetler, bulut bilişim ve API ağ geçitleri gibi çok çeşitli web hizmetlerine güç sağlamak için kullanılabilir. Nginx web sunucusunun Linux veya benzeri UNİX sistemlerinde çalıştığını varsayarak tartışmamıza devam edeceğiz.
1. Nginx’in Temelleri
Herhangi bir teknik konuya geçmeden hemen önce temel bilgileri edinmeniz gerekir. Yani, burada Nginx ile ilgili bazı temel şeyleri sunuyoruz. Ücretli ve ücretsiz varyasyonlar da dahil olmak üzere bu uygulamanın çeşitli lezzetleri vardır. Bununla birlikte, açık kaynaklı Nginx sunucusu, geliştiriciler tarafından en çok kullanılanıdır, çünkü aklınıza gelebilecek hemen hemen her işlevi sunar ve bir fiyat etiketi ile gelmez.
Kurulduktan sonra sunucunuzu çalıştırmaya başlamak için sudo hizmeti Nginx’i çalıştırabilirsiniz. Sunucu yapılandırma dosyaları /usr/local/nginx/conf/ veya /etc/nginx/ dizinlerinde saklanır. Web belgeleri /usr / local / nginx / html/veya/var / www / html dizinlerinde saklanır. Sudo nginx-s stop komutunu vererek çalışan bir sunucuyu durdurabilirsiniz.
2. Selinux’u Açmak
SELinux (Security-Enhanced Linux), erişim kontrolü güvenlik politikaları aracılığıyla sistem güvenliği üzerinde daha fazla kontrol sağlayan Linux çekirdeğinin zorlayıcı bir özelliğidir. Özel web sunucuları çalıştırmak isteyen sistemlerde selinux’u etkinleştirmek yaygın bir uygulamadır. Bunun için getsebool-a komutunu kullanmanız gerekir.
$ sudo getsebool -a | less $ sudo getsebool -a | grep off $ sudo getsebool -a | grep on
Yukarıdaki komutlar, hangi boolean ayarlarının açılıp kapatıldığı hakkında size bilgi sağlayacaktır. Maksimum güvenlik için, sisteminiz tarafından gerekli olmayan tüm varlıkları devre dışı bırakmalısınız. Bu ayarlar toplu olarak SELinux booleanları olarak bilinir. Bu değişkenler için uygun değerleri ayarlamak, standart web saldırılarını önlemek için sisteminizi çok daha güvenli hale getirecektir.
3. İstenmeyen Nginx Modüllerini Kaldırma
Nginx varsayılan sunucusunun hafif doğasına rağmen, sunucunuzun ihtiyaç duymadığı istenmeyen modülleri kaldırmak her zaman iyi bir fikirdir. Bu, bellek ayak izini önemli ölçüde en aza indirecek ve sunucunuzu normalden daha hızlı hale getirecektir. Ek olarak, sunucunuzun yeteneklerini sınırlar, bu nedenle kötü niyetli bir kullanıcı sunucunuza erişse bile, sistemin kendisinin tam kontrolünü ele geçirmek çok zaman ve beceri gerektirir.
Aşağıdaki komutlar, SSI’yı ve varsayılan olarak Nginx ikili dosyanızla yüklenen otomatik dizin modülünü nasıl devre dışı bırakacağınızı gösterir.
sudo ./configure --without-http_autoindex_module --without-http_ssi_module sudo make sudo make install
Nginx sunucunuzu derlerken kapatılabilen modülleri görüntülemek için aşağıdaki komutu kullanabilirsiniz.
sudo ./configure --help | less
4. Ağ Ayrıcalıklarını En Aza İndirme
Web sunucunuzun ağ ayrıcalığını en aza indirmek, güvenliği artırmaya da yardımcı olur. Bu iş için bağlama seçeneklerinden yararlanabilirsiniz. Esasen bu, tüm web sayfalarınızı ayrı bölümlerde sunabileceğiniz anlamına gelir. Bunu yapmak için ek bölümler oluşturmanız ve bunları /nginx konumuna monte etmeniz gerekir. Bunları noexec, nodev ve nosetuıd izinleriyle bağladığınızdan emin olun.
Bunu /etc/fstab dosyasını düzenleyerek yapabilirsiniz. Bunu favori düzenleyicinizle düzenleyin ve dosyanın sonuna aşağıdakileri ekleyin.
LABEL=/nginx /nginx ext3 defaults,nosuid,noexec,nodev 1 2
Sisteminiz farklı bir dosya sisteminde çalışıyorsa, ext3’ü bu dosya sisteminin adıyla değiştirin. Bunu yapmak için sudo ayrıcalıklarına ihtiyacınız olacak.
5. Nginx için Ağ Ayarlarını Sertleştirme
Bazı çekirdek ve ağ ayarlarını yapılandırarak sisteminizin güvenliğini daha da artırabilirsiniz. /Etc/sysctl dosyasını düzenleyin.sunucunuzun sistemini sertleştirmek için aşağıdaki satırları ekleyin.
# prevent smurf attacks net.ipv4.icmp_echo_ignore_broadcasts = 1 # stopping being a router net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # prevent alteration of routing tables net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0
Sisteminizi güvence altına almak için kullanabileceğiniz birçok seçenek vardır. Birisinin sunucunuzun güvenliğini ihlal etmesi durumunda kullanışlı olacaktır.
6. Nginx Sürüm Başlığını Değiştirme
Nginx varsayılan sunucunuzun sürüm başlığını değiştirmek, taklitçi bilgisayar korsanlarının sisteminize girmesini önlemenin harika bir yoludur. Birçok uygulama, sunucu yazılımının sürüm başlığını elde etmek için bulanık verilerle beslenebilir. Kötü niyetli kullanıcılar bunu genellikle tam sunucu bilgilerini bulmak için yaparlar, böylece kendileri için belirli güvenlik açıklarını hedefleyebilir ve kazabilirler.
Dosyadan aşağıdaki satırları bulun src/http/ngx_http_header_filter_module.c.
static char ngx_http_server_string[] = "Server: nginx" CRLF; static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
Bunları aşağıdaki satırlarla değiştirin.
static char ngx_http_server_string[] = "Server: Ninja Web Server" CRLF; static char ngx_http_server_full_string[] = "Server: Ninja Web Server" CRLF;
Bu, potansiyel saldırganlara sunucu sürümü hakkında yanlış bilgiler gösterir.
7. Arabellek Taşmalarını Önleme
Arabellek taşmaları, kod parçacıkları sınırının ötesine veri yazdığında oluşur. Bu, deneyimli bilgisayar korsanlarının kullandığı klasik bir yazılım mühendisliği sorunudur. Başarılı bir şekilde tasarlanırsa, arabellek taşması saldırıları istenmeyen tarafların sisteminize girmesine ve sisteminizin kontrolünü ele geçirmesine izin verebilir. Tüm istemciler için arabellek boyutlarını sınırlayarak bu saldırıları büyük ölçüde önleyebilirsiniz. Aşağıdakileri nginx.conf dosyasına ekleyin.
# limit buffer sizes client_body_buffer_size 1K; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k; # set timeouts client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send_timeout 10;
Bu seçenekler esasen bu parametrelerin varsayılan değerini değiştirir ve saldırı yüzeyini azaltır. Nginx Web Sunucunuza neyin uygun olduğunu bulmak için onlarla oynayabilirsiniz.
8. Eşzamanlı Bağlantıların Kontrolü
İster Nginx varsayılan sunucusunu ister başka bir şeyi çalıştırıyor olun, eşzamanlı bağlantı sayısını sınırlamak her zaman iyi bir uygulamadır. Hizmet Reddi saldırılarının önlenmesi ve daha iyi yük dengeleme gibi birçok durumda faydalı olabilir. NginxHttpLimitZone modülü, yöneticilerin belirli oturumlar veya IP adresleri için eşzamanlı bağlantıları sınırlamasına olanak tanır.
limit_zone slimits $binary_remote_addr 5m; limit_conn slimits 5;
Yukarıdaki satırları nginx.conf dosyanıza ekleyin. İzin verilen eşzamanlı bağlantı sayısını IP başına 5 ile sınırlar. Bu değeri gereksinimlerinize uyacak şekilde kolayca değiştirebilirsiniz.
9. Etki Alanı Erişimini Filtreleme
Modern Nginx Web Sunucularının karşılaştığı en yaygın sorun türlerinden biri botnet’lerdir. Genellikle sunucuları rastgele tararlar ve ilişkili tüm etki alanlarını bulmaya çalışırlar. Aşağıdaki satırları nginx.conf dosyanıza ekleyerek bunları kolayca reddedebilirsiniz.
# encompass client requests to specified domains if ($host !~ ^(url.domain|www.url.domain|url.subdomain.domain)$ ) { return 444; }
Bu satırların bu dosyaya eklenmesi, yalnızca belirtilen alan adları için istemci isteklerine izin verir. veya “|” işaretini kullanarak birden fazla alan adı belirleyebilirsiniz.
10. Mevcut Yöntemlerin Sınırlandırılması
Kullanıcı isteklerine göre web sayfalarını getirmek için kullanılan çeşitli HTTP yöntemleri vardır. Bunlardan bazıları GET, POST, PUT ve DELETE’dir. Ancak bir sürü ek yöntem var. Bir kullanıcı için bu yöntemleri kısıtlamak her zaman iyi bir fikirdir. Bu, istenmeyen veri ihlallerinin azaltılmasına yardımcı olacak ve ekstra bir güvenlik katmanı ekleyecektir. Aşağıdaki satırları Nginx yapılandırmanıza ekleyin.
# allow only GET && HEAD && POST if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }
Artık kullanıcılar sunucunuzda silme veya arama isteği gerçekleştiremez. Yalnızca GET, HEAD ve POST yöntemleri kullanılabilir.
11. Kullanıcı Aracılarını Kısıtlama
Kullanıcı aracıları, kullanıcıların bir hizmetle etkileşime girmesine olanak tanıyan bilgisayar programlarıdır. Ubuntu web tarayıcıları sistemimdeki birincil web kullanıcı aracılarıdır.
Bazen, sürekli olarak web sitenizden veri toplamaya çalışan başsız tarayıcılar gibi belirli kullanıcı aracılarının sunucunuza erişmesini kısıtlamak isteyebilirsiniz. Bu, genellikle aynı kullanıcı aracısını kullandıklarından botnet’leri engellerken de kullanışlıdır.
# block download agents if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; }
Bunları Nginx yapılandırmanıza eklemek, wget ve BBBike gibi bilinen indirme aracılarını engelleyecektir. Aşağıdaki satırlar msnbot ve scrapbot adı verilen bilinen bazı robotları engelleyecektir.
#block robots if ($http_user_agent ~* msnbot|scrapbot) { return 403; }
İstediğiniz kullanıcı aracısını engelleyebilirsiniz. Ancak dikkatli olun, aksi takdirde Nginx web sunucunuza gelen meşru trafiği engelleyebilirsiniz.
12. Yönlendirme Spamını Engelleme
Yönlendirme Spam’i günümüzde birçok web sunucusunun karşılaştığı yaygın bir sorundur. Belirli web sitelerinin arama motoruna reklamını yapmak ve böylece sitelerine daha fazla trafik çekmek için kullanılan bir tekniktir. Bir sitenin sıralamasında ciddi hasara neden olabileceğinden, yüksek yüklü web sunucuları için özellikle tehlikelidir. Neyse ki, Nginx yapılandırmanıza yalnızca birkaç satır ekleyerek bu spam’lerin çoğunu engelleyebilirsiniz.
#deny certain referers if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) ) { # return 404; return 403; }
En yaygın yönlendirme spam’larından bazılarını engellemek için yukarıdaki satırları nginx.conf dosyanıza ekleyin. Gerektiğinde bu satırlara daha fazla kelime ekleyebilirsiniz.
13. Görüntü Bağlantısının Engellenmesi
Görüntülerin sıcak bağlanması birçok web yöneticisi için yaygın bir uygulama haline geldi. Bu uygulamada yöneticiler, müşterilerinin isteklerini yerine getirmek için sıklıkla web sunucunuzdaki kişiselleştirilmiş görselleri kullanır. Web sunucunuz, başka bir web sunucusunun kullanıcıları tarafından talep edilen görüntü varlıklarının teslim edilmesinden sorumlu olabileceğinden, bu durum dikkate alınmazsa ciddi şekilde zararlı olabilir. Aşağıda gösterildiği gibi bunu kolayca önleyebilir ve değerli bant genişliğinizden tasarruf edebilirsiniz.
# stop deep linking or image hotlinking location /images/ { valid_referers none blocked www.example.com example.com; if ($invalid_referer) { return 403; } }
Bu satırları Nginx yapılandırma dosyanıza eklemek, söz konusu web sunucusundan gelen görüntü isteklerini engelleyecektir. Bu şekilde, Nginx varsayılan sunucunuz görüntüleri yalnızca orijinal istemci isteklerine iletecektir. Ek olarak, çok sayıda alan adı için görüntü bağlantılarını engellemek için Nginx haritasını kullanmak isteyebilirsiniz.
14. Dizin Erişimini Kısıtlama
Genellikle dizinlerini kısıtlamayan tonlarca web sayfası bulabilirsiniz. Sitede istedikleri gibi gezinmelerine izin verdikleri için kötü niyetli kullanıcılara karşı son derece savunmasızdırlar ve bu da genellikle site ayrıcalıklarının daha da artmasına neden olur. Aşağıdaki kod parçası size belirli kullanıcıları nasıl engelleyeceğinizi, belirli IP aralıklarına nasıl izin vereceğinizi ve diğerlerini /docs/ dizinine nasıl reddedeceğinizi gösterecektir.
location /docs/ { # block one user deny 192.168.1.1; # allow anyone in 192.168.1.0/24 allow 192.168.1.0/24; # drop rest deny all; }
Bunları Nginx yapılandırmanıza ekleyin ve /docs/ dosyasını hassas bilgiler içeren dizinlerle değiştirin. Ayrıca dizinlerinizi aşağıda gösterildiği gibi şifrelerle de koruyabilirsiniz. Öncelikle bir şifre dosyası oluşturun ve bir KULLANICI ekleyin
$ sudo mkdir /usr/local/nginx/conf/.htpasswd/ $ sudo htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd USER
Şimdi bu satırları nginx.conf dosyasına ekleyin.
# password rotect /personal-images/ and /delta/ directories location ~ /(personal-images/.*|delta/.*) { auth_basic "Restricted"; auth_basic_user_file /usr/local/nginx/conf/.htpasswd/passwd; }
15. Nginx Web Sunucusu için SSL’yi Yapılandırma
SSL (Güvenli Yuva Katmanı), modern web sunucularının fiili güvenlik standardı haline geldi. Bu teknolojiyi uygulamayan herhangi bir site, birçok güvenlik uzmanı tarafından güvensiz kabul edilmektedir. Neyse ki Nginx sunucuları için SSL güvenliğini yapılandırmak ve sürdürmek kolaydır.
Bir web sitesi için SSL ayarlamanın birçok yolu vardır. Yöneticiler kendinden imzalı SSL sertifikaları oluşturabilir, popüler sertifika yetkililerini kullanabilir veya SSL ters proxy’leri ayarlayabilir. Web sunucusu yönetiminde nispeten yeniyseniz, popüler Let’s Encrypt sertifikasyonunu kullanmanızı tavsiye ederiz. Güvenli SSL/TLS sertifikaları sağlayan ücretsiz ve kullanımı kolay bir sertifika yetkilisidir.
16. PHP Güvenliğini Artırma
PHP, en çok kullanılan sunucu tarafı dillerinden biridir ve internette önemli miktarda web sayfasına hizmet verir. Ancak oldukça eskidir ve çeşitli güvenlik açıklarına açıktır. Bu nedenle, Nginx sunucunuzda PHP kullanıyorsanız her zaman dikkatli olmalı ve belirli güvenlik standartlarını uygulamalısınız. Örneğin, /etc/php.ini dosyanıza aşağıdaki satırları eklemek güvenliği önemli ölçüde artıracaktır.
# reject crucial functions disable_functions = phpinfo, system, mail, exec # max execution time for scripts, in seconds max_execution_time = 30 # max memory limit for scripts, in MB memory_limit = 4M # max allowable POST data post_max_size = 4M # restrict PHP information expose_php = Off # log errors log_errors = On # enable SQL safe mode sql.safe_mode = On
Sunucunuzu zararlara karşı dayanıklı hale getirmek için bu dosyaya ekleyebileceğiniz güvenliği artırıcı daha birçok talimat vardır.
17. Nginx Varsayılan Sunucusunun Güvenliğini Artırma
Linux kullanıcıları, manuel yapılandırmayı kullanarak Nginx sunucularının genel güvenliğini kolayca artırabilir. Daha önce de belirttiğimiz gibi, optimum koruma için Nginx çalıştıran herhangi bir makinede SELinux’u açmalısınız. /nginx üzerinde doğru izinlerin ayarlanması da son derece önemlidir. Kullanıcıların Nginx belgelerinizde hangi izinlere sahip olduğunu bulmak için aşağıdaki komutu çalıştırın.
$ sudo find /nginx -user nginx $ sudo find /usr/local/nginx/html -user nginx
Bu belgelerin yalnızca kökünün veya sahibinin bunlara yazma erişimine sahip olduğundan emin olun. Saldırganların makineye daha fazla ayrıcalık kazandırmak için daha fazla zamana ve uzmanlığa ihtiyaç duyması nedeniyle, gelecekteki izinsiz girişler durumunda bu bir cankurtaran olabilir. Vi veya diğer Linux metin düzenleyicileri tarafından oluşturulan istenmeyen arşivleri kaldırmak için aşağıdaki komutu kullanın.
$ sudo find /nginx -name '.?*' -not -name .ht* -or -name '*~' -or -name '*.bak*' -or -name '*.old*' $ sudo find /usr/local/nginx/html/ -name '.?*' -not -name .ht* -or -name '*~' -or -name '*.bak*' -or -name '*.old*'
18. Nginx Günlüklerini Denetleme
Nginx sunucunuzun günlük dosyalarını kontrol etmek size kullanıcıların ilgi alanları, istenmeyen kimlik doğrulama girişimleri vb. gibi değerli bilgiler sağlayacaktır. Sunucu günlüklerini uygun şekilde izleme yeteneği, bu nedenle web yöneticileri için yararlı bir varlıktır.
Sunucunuzun log dosyalarını /usr/local/nginx/logs dizininde bulabilirsiniz. Aşağıdaki komutlar bize hassas bilgiler için bunları nasıl grepleyeceğimizi gösterir.
$ sudo grep "/login.php??" /usr/local/nginx/logs/access_log $ sudo grep "...etc/passwd" /usr/local/nginx/logs/access_log $ sudo egrep -i "denied|error|warn" /usr/local/nginx/logs/error_log
Ayrıca Nginx günlüklerini gerçek zamanlı olarak kontrol edecek ve sunucunuzda olup bitenler hakkında sizi bilgilendirecek özel denetim uygulamaları da kurabilir veya oluşturabilirsiniz.
19. Nginx’i Konteynerlerde Çalıştırmak
Çoğu profesyonel, kullanıcılara Nginx sunucularını özel bir konteynerin içinden çalıştırmalarını tavsiye eder. Konteynerler, sunucu makinelerinde süreçleri birbirinden ayrı tutmak için oluşturulmuş izole ortamlardır. Nginx sunucunuzu LXD, Docker, FreeBSD hapishaneleri, XEN ve diğer Linux sanal emülatörleri gibi konteynerlere kolayca kurabilir ve çalıştırabilirsiniz.
Sunucunuz için ayrılmış bir kapsayıcı, sunucuyu çalıştırmak ve istemci isteklerini işlemek için gereken tüm kaynakları içerecektir. Elde ettiğiniz avantaj, bu sunucunun makinenizin geri kalanından yalıtılmasıdır. Yani birisi bazı açıklardan sunucunuza yetkisiz erişim sağlasa bile sistem çekirdeğinizi kontrol edemeyecek.
20. Bazı Yararlı Öneriler
Merkezi yapılandırma dosyasını değiştirerek Nginx web sunucunuzun farklı yönlerini kolayca yapılandırabilirsiniz. Yapılacak pek çok şey var. Örneğin, tıklama hırsızlığını önlemek için aşağıdakileri kullanın.
add_header X-Frame-Options SAMEORIGIN;
Bir sonraki satır, bazı tarayıcılar tarafından koklanan içerik türlerini devre dışı bırakacaktır.
add_header X-Content-Type-Options nosniff;
Siteler arası komut dosyası çalıştırma (XSS) filtrelerini etkinleştirmek için şunları kullanabilirsiniz:
add_header X-XSS-Protection "1; mode=block";
Nginx belgelerinde çok sayıda yararlı özellik bulabilirsiniz. Ancak herhangi bir şeyi uygulamadan önce ne yaptıklarını anladığınızdan emin olun. Aksi takdirde siteniz yanlış yapılandırma nedeniyle kesintilerle karşı karşıya kalabilir.
Yazının orijinalini buradan okuyabilirsiniz.
Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım.
Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum.
Son 6 yıldır sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum.
Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.