Nginx Hardening

Nginx Hardening

Son zamanlarda Apache’yi geride bırakan en popüler web sunucularından olan, hafif, hızlı, sağlam ve tüm büyük işletim sistemlerini destekleyen nginx, Netflix ve WordPress.com gibi bir çok yüksek trafikli siteler için tercih edilmektedir. Bir nginx sunucusu, 2,5 MB kadar küçük bir bellekle 10.000 etkin olmayan HTTP bağlantısını kolayca işleyebilir. Bu makalede, nginx kurulumunun nasıl güvenli hale getirilinebileceğini gösteren nginx hardening konusu ile ilgili ipuçları vereceğim.

Nginx Hakkında

Kısaca nginx, reverse proxy, load balancer, mail proxy ve HTTP önbelleği olarak da kullanılabilen bir web sunucusudur. Yazılım, Igor Sysoev tarafından oluşturulmuş ve 2004 yılında halka açık olarak yayınlanmıştır. Nginx, 2 maddeli BSD lisansı hükümleri altında yayınlanan ücretsiz ve açık kaynaklı bir yazılımdır. Web sunucularının büyük bir bölümü, genellikle bir load balancer olarak NGINX kullanmaktadır.

Nginx, düşük bellek kullanımı ve yüksek eşzamanlılık sunmak için tasarlanmıştır. Her web isteği için yeni süreçler oluşturmak yerine, isteklerin tek bir iş parçacığında işlendiği zaman uyumsuz, olay temelli bir yaklaşım kullanır.

Nginx ile, bir ana süreç birden çok çalışan işlemi kontrol edebilir. Eşzamansız olduğundan, her bir istek, diğer istekleri engellemeden eşzamanlı olarak yürütülebilir.

Nginx’te görülen bazı  özellikler şunlardır:

  • Önbelleğe alma ile reverse proxy
  • IPv6
  • Yük Dengeleme (Load Balancing)
  • Önbelleğe alma ile FastCGI desteği
  • WebSockets
  • Statik dosyaların, dizin dosyalarının ve otomatik indekslemenin işlenmesi
  • SNI ile TLS / SSL

Nginx Hardening

Nginx hardening işlemini gerçekleştirmek için ilk olarak host olarak seçtiğimiz Ubuntu üzerine nginx kuruyoruz.

$ sudo apt install nginx

Kurulum işlemini tamamladıktan sonra nginx servisini başlatıyoruz ve çalıştığını kontrol ediyoruz.

$ sudo systemctl start nginx
$ sudo systemctl status nginx

Ayağa kaldırdığımız nginx servisine istekte bulunarak test ediyoruz.

$ curl –I http://127.0.0.1

Bulunduğumuz istekten dönen yanıtta görüldüğü üzere Server kısmında  ayrıntılı olarak nginx bilgileri verilmekte. Bilgi toplama aşamasında bu kısımdan fayda sağlanmasının önüne geçmek için config dosyası içerisinde “ server_tokens off “ seçeneğini yorum olmaktan kurtararak aktif ediyoruz.

Yorum etiketini kaldırıp seçeneği aktif ettikten sonra nginx servisini yeniden başlatıyoruz ve tekrar istekte bulunup kontrol ediyoruz.

Server kısmında nginx’e ait ayrıntıları böylelikle sınırlamış olduk. İkinci adım olarak, /etc/nginx/nginx.conf dosyası içerisinde XSS koruması header’ını ekliyoruz.

Böylelikle XSS koruma modunu aktif ederek XSS için bir adım koruma önlemi almış olduk. Bir diğer adım ise http methodları. İstenilen HTTP methodları arasında POST, HEAD, GET bulunurken istenmeyenler DELETE veya TRACE’dir. Bunlar, cross-site tracking saldırıları yoluyla cookie bilgilerinin çalınmasını sağladıkları için oldukça risklidir. İstenmeyen methodların pasif edilmesi için /etc/nginx/sites-available/default config dosyasını aşağıdaki gibi düzenliyoruz.

Clickjacking saldırısı, sitedeki normal bir butonun altına gizli bir bağlantı yerleştirilemesi ve kullanıcının bilmeden zararlı bağlantıya tıklayarak saldırganın amacına ulaşması olarak tanımlanabilir. Çoğu durumda bu, iframe’ler kullanılarak yapılır. Bu nedenle nginx’te, tarayıcının kaynakları yalnızca web sunucusundan yüklemesini sınırlamak için hearder bilgisine X-FRAME-OPTIONS “SAMEORIGIN” ekliyoruz.

Ek bir önlem olarak, fuzzing, enumeration gibi işlemler için kullanılan hacking araçlarının oluşturdukları user-agent bilgisinin tespiti halinde istek engellenebilir. /etc/nginx/sites-available/default config dosyasını aşağıdaki gibi düzenliyoruz.

if ($http_user_agent ~* (^w3af.sourceforge.net|dirbuster|nikto|wpscan|SF|sqlmap|fimap|nessus|whatweb|Openvas|jbrofuzz|libwhisker|webshag)) {
return 444;
}

Son bir adım olarak Client-Server arası iletişimi şifrelemek için custom bir TLS/SSL sertifikası oluşturarak imzalamak. Bunun için ilk olarak “/etc/ssl/certs” ve “/etc/ssl/private” dizinlerini oluşturuyoruz.  Ardından “sudo chmod 700 /etc/ssl/private” komutu ile dizin izinlerini yetkisiz erişim olmaması için kısıtlıyoruz. Dizinleri oluşturduktan sonra ise OpenSSL ile kendinden imzalı bir sertifika oluşturuyoruz.

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

Gerekli bilgileri sırasıyla girdikten sonra sertifika oluşmuş olacaktır. Ardından daha iyi güvenilirlik için bir Diffie-Helman grubu oluşturuyoruz.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Biraz bekledikten sonra işlem tamamlanacaktır. Son olarak SSL ile ilgili konfigürasyonları gerçekleştiriyoruz. İlk olarak “ /etc/nginx/conf.d/ssl.conf” dosyasını oluşturuyoruz ve SSL  ile ilgili gerekli  tanımlamaları yapıyoruz.

Gerekli tanımlamaları yaptıktan sonra güvenliği arttırmak adına bazı eklemeler yapıyoruz. Burada tercih edilen DNS çözümleyici , session ayarları ve header girdileri ekliyoruz.

Kendinden tanımlı bir sertifika olduğundan dolayı ssl stapling kullanılmayacağından pasif hale getirilebilir.  Son olarak ise document root ve hata sayfaları eklemelerini yapıyoruz.

Hardenin işlemini böylelikle tamamlamış olduk. Son olarak “ sudo systemctl reload nginx “ komutunu çalıştırarak nginx servisini yeniden yükleyerek ayarların aktif olmasını sağlıyoruz. Ardından 80 portunu ziyaret ederek siteyi kontrol ediyoruz.

Görüldüğü üzere sertifika başarı ile yüklenmiş fakat kendinden imzalı sertifika olduğundan dolayı güvenirlik onayı teşkil etmemekte bu nedenle de güvenli sertifika olmadığına dair uyarı vermekte.

Sertifika içeriği ise aşağıdaki gibidir.

Bunlara ek olarak ise, gelen verinin büyüklüğü ile ilgili kapsama uygun olarak tercihen edilen şekilde ayarlamalar potensiyel Dos saldırılarına karşın önlem alınabilir ve bunlarla birlikte sunucuyu düzenli olarak güncelleyerek de bir çok potansiyel zafiyetin önüne geçilebilir.

Kaynak:

https://en.wikipedia.org/wiki/Nginx

https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-on-centos-7

https://hostadvice.com/how-to/how-to-harden-nginx-web-server-on-ubuntu-18-04/

Related Posts

Leave a Reply