Bu makalemde sizlere Citrix Netscaler ürünün application firewall kısmını detaylı olarak anlatacağım. Daha önce HTTP Load Balancing kısmı forumda yayınlandığı için Load Balancing kısmından çok bahsetmeyip direk application firewall kısmına geçeceğim. İlk önce W12R2 sunucuya IIS kurup uygulamayı sunucuya kurarak başlıyorum.Sunucu üzerinde uygulama çalıştıktan sonra sunucuyu netscaler cihazı üzerinden hizmet verecek şekilde konfigüre etmeye başlıyoruz.
İlk o larak Traffic Management-Load Balancing-Servers menüsünde Add’e tıklayarak IIS kurduğumuz sunucuyu Netsclaer cihazına server olarak ekliyoruz.
Sunucu ismi ve ipsi girdikten sonra Create butonuna tıklayarak sunucuyu oluşturuyoruz. IIS kurduğumuz sunucunun ip’si 10.10.172.33
Oluşturmuş olduğumuz sunucunun hangi portundan hizmet alıyorsak, o portu belirtmek için Traffic Management-Load Balancing-Services menüsünden service oluşturuyoruz.
Sunucumuz 80 portundan hizmet verdiği için service portunu 80 seçiyoruz.
Şimdi ise dış dünyaya gerçek sunucu yerine oluşturacağımız sanal sunucu ayarlarını yapıyoruz. Traffic Management-Load Balancing-Virtual Servers menüsünden Add buyonunu tıklayıp virtual server oluşturuyoruz.
Virtual Server’ın sunucu ile aynı vlan’da olması gerekmiyor. Sadece netscaler cihazının iki vlanda da snip’sinin olması gerekmektedir. Bu ipler birbirlerini oldukları vlandaki snipler üzerinden gideceği için trafik netsclaer cihazı üzerinden çıkmamaktadır. Dış dünyaya 10.10.171.102 ipsinden ve 80 portundan hizmet verecek şekilde konfigürasyonumuzu yaptık. Burada detay bir husus sunucu ve ve virtual server aynı porttan hizmet vermek zorunda değildir. Örneğin virtual server 80 portundan istekleri karşılayıp arkada sunucunun 8080 portuna istekleri iletebilir. Veya günlük hayatta daha çok kullandığımız Netscaler cihazının en güzel özelliklerinden biri olan SslOffloading ile Client ile Virtual server arası trafik ssl ile şifrelenip ssl’i Citrix üzerinde sonlandırıp sunucuya 80 portundan iletebilirsiniz. Bu sayede SSL decrypte ve encrypte için sunucu CPU’sunu yormamış oluruz.
Virtual Server oluşmuş durumda, sıra geldi oluşturmuş olduğumuz virtual server ‘a yine oluşturmuş olduğumuz service’yi bind etmeye. No Load Balancing Virtual Service Binding’e tıklayıp oluşturmuş olduğumuz servisi ekliyoruz.
Oluşturmuş olduğumuz servisi seçip Bind butonuna tıklayıp atama işlemini yapıyoruz.
Gördüğünüz üzere Virtual Server çalışır hale gelmiş durumda.
Kontrolümüzü yapalım.
Kontrolümüzü yaptıktan sonra Load Balance Method ve Persistance özelliğinden bahsetmek istiyorum .
Method : Load Balance’ın hangi yöntemle yapılacağını seçebiliriz. Netscaler üzerinde birçok yöntem var fakat ben en çok kullanılan üç tanesinden bahsedeceğim.
Roundrobin : Gelen istekleri bir one bir ona şeklinde dağıtır.
Leastresponsetime : Herbir sunucuyu ping atar ve en kısa sürede cevap verene gönderir trafiği.
Leastconnection : Aktif connection sayısı en za olan sunucuya gönderir.
Persistance: Kullanıcıyı hep hizmet aldığı sunucuya gönderir. Netsclaer cihazı persistance kontrolü için isteği yapan kullanıcıya bir persistance cookie iletir ve ilettiği cookienin sessionı bitene kadar hep aynı sunucudan hizmet almasını sağlar.
Persistance özelliği eklenmeden önce sadece PHPSESSID cookiesi var.
Persistance özelliği eklenince kullanıcıya birde persistance cookisi ekliyor.
Eklemiş olduğu cookie herbir service için farklı bir değerdir.
Kısaca Load Balancing kısmını anlattıktan sonra Application Firewall kısmına geçiyoruz. İlk olarak Security-Application Firewall-Profile menülerinden profile oluşturuyoruz.
Profile ismi girip Web Application tipini seçtikten sonra Ok butonuna basıp profile oluşturuyoruz.
İkinci olarak Policy oluşturup daha önce oluşturduğumuz profile’ımızı bu policy’e bind ediyoruz.
Burada Policy için bir isim girip oluşturduğumuz profile’ı seçiyoruz. Expression kısmına TRUE değerini yazıyoruz.
Sıra geldi oluşturduğumuz Policy’i Virtual Server ‘a atama işine. Traffic Management-Load Balancer menüsünden oluşturduğumuz olduğumuz Virtual Server’a edit deyip içine girip Policies kısmında + işaretine basıp oluşturduğumuz policy’i bind ediyoruz.
Burada oluşturduğumuz policy’nin bir application firewall policy’si olduğunu belirtiyoruz.
Burada oluşturmuş olduğumuz policy’i bind ediyoruz.
Artık application firewall özelliğini aktif ettik. Şimdi yine Virtual Server üzerinden 1 App Firewall Policy üzerine tıklayıp policy’mizi düzenleyebiliriz.
Bu şekilde policymizi düzenliyoruz. Security checklerde Block işaretli ise bu kurallara uymayan istekler bloklanır.
Burada app firewall’a takılan istekleri hata.php sayfasına yönlendiriyoruz.
Start URL özelliğimiz aktif olduğu için direk hata sayfasına yönleniyor
. Aşağıdaki isteklere izin verdikten sorna sayfamız açılıyor.
Şimdi sizlere tüm menülerin ne işe yaradıklarını anlatacağım. Sırayla başlıyorum.
START URL :
1- Enforce URL Closure : Start URL kısmında deploy ettiğimiz yani izin verdiğimiz bir sayfadan diğer bir sayfaya hyperlink var ise o sayfa start URL’de deploy edilmese bile izin verir. Aşağıdaki örnek sadece kisi-liste sayfası start url’de ekli olmasına rağmen Enforce URL Closure işaretlendiği için kisi_ara sayfasınada erişebilinmektedir.
2- Sessionless URL Closure : Bu özellik sayesinde Netscaler cihazı URL’lerin sonuna uniq bir id ekleyerek kullancı aktivitelerini toplamaya yardımcı olur. Özelliğin çalışabilmesi için Enforce URL Closure tikinin işaretli olması gerekmektedir. As_url_id değeri netscaler cihazının eklediği id’dir.
3-Enable Validate Header : Bu özellik sayesinde başka bir uygulama üzerinde sitenin çalışmasını engeller.
-Off: Herhangi bir header kontrolü yapmaz
-If Present : Eğer header bilgisi var ise adresin doğruluğunu kontrol eder doğru ise trafik akışına izin verir, eğer header içinde adres bilgisi yok ise yine trafiğe izin ver, eğer header bilgisi start url içinde ekli değil ise izin vermez.
-Always Except Start URLs : Headerde gelen adres bilgisinin start urlde ekli olması gerekir, eğer yanlış bir adresten geliyor ise ve header içerisinde adres bilgisi yok ise bloklar.
-Always Except First Request : Start URL’de ekli olmayan ve header bilgisinde adres olmayan ilk isteklere cevap verir sonraki istekleri bloklar.
DENY URL : Bu özellik bilinen programlama dillerinde bilinen atakları engellemek için bazı url’lere ve son kullanıcının erişmemesi gereken yerleri engellemek içindir. Aşağıdaki kriterlere uyan linkler bloklanır.
-Cookie Consinstency : Bu özellik sayesinde kullanıcının gönderdiği cookieler engellenir, sadece legal olan cookilere izin verilir. Bloklanmasının sebebi server’a büyük boyutlarda cookie gönderip server’i hizmet dışı bırakmak isteyen kötü niyetli kullanıcıları engellemektir. Transform kısmında izin verilen cookilerin transformu yapılır.
-Encrypt Server Cookies : Sadece citrix netscaler cihazının verdiği cookileri encrypt eder. Örneğin persistance cookie ve netscaler session cookie.
-None: Seçiliyken hiçbir şekilde encrypt ve decrypt işlemi yapılmaz.
-Decrypt Only : Sadece encrypt edilmiş cookie varsa decrypt eder.
-Encrypt Session Only : Sadece netscaler session cookisine decrypt ve encrypt eder.
-Encrypt All : Netsclaer cihazının session ve persistance cookilerini encrypt ve decrypt eder.
Proxy Server Cookies : Netscaler cihazının proxy olduğu nda cookie encrypt işlemi yapar. Örneğin 2 adet web sunucu var ve web sunucular netscaler üzerinden load balance ediliyor. Bu durumda web sunucu cookie bilgisini ilk netscaler cihazına iletir, netscaler cihazıda son kullanıcıya iletir. Web sunucunun ilettiği cookie burada encrypt edilir.
-None: Sunucunun verdiği cookie encrypt edillmez.
-Session Only: Sunucudan alınan sadece session cookie son kullanıcıya ulaştırılırken encrypt edilir ve son kullanıcıdan gelen cookie değeri arkadaki web sunucuya decrypt edilip clear text gönderilir.
-Flags To Add in Cookies : Bu özellik özellik sayesinde cookie değerlerinin sadece yeni nesil web tarayıcılara verilmesi sağlanmıştır. Kötü niyetli kişilerin scriptlerle cookie alması engellenmiştir ve browser desteği var ise network dinleme olasılığna karşı netscaler ve client arasında cookiler ssl üzerinden gönderilir.
-None : Defaultdur. Herhangibir flag eklenmez
-HttpOnly : Sadece browserlardan gelen kullanıcıya cookiler iletilir.
-Secure : Cookiler SSL üzerinden güvenli bir şekilde gönderilir.
-All : Hem HttpOnly hemde secure flagi eklenir bu sayede cookiler ssl üzerinden gönderilir ve sadece browserdan gelen isteklere cevap verilir.
Burada dikkat edeceğimiz husus htttp olarak yani ssl sertifikası kullanılmadan oluşturulan virtual serverlar için secure tagı eklenmemelidir. Eklendiği takdirde ssl connection kurulmadığı için cookie son kullanıcıya iletilemez.
Görüldüğü üzere persistance cookie Encrypte edilmiş şekilde.
-Buffer Overflow : Bu özellik sayesinde boyutu büyük header, cookie ve URL göndererek web sunucuyu devre dışı bırakma ataklarına karşı koruma sağlanmıştır.
-Maximum URL Length : URL maximum karakter sayısı
-Maximum Cookie Length : Cookie maximum karakter sayısı
-Maximum Header Length : Header maximum karakter sayısı
-Credit Card : Bu sayede isteklere cevap verirken sunucudan gelen cevap paketindeki kredi kartı bilgilerini siler veya ilk 12 hanesini saklayıp son 4 hanesini döner örneğin; xxxx-xxxx-xxxx-1234 gibi.
X-Out : Bu özellik sayesinde responsede yer alan kredi kartı bilgilerinin ilk 12 hanesi yerine x konularak son 4 hanesi açık şekilde gönderilir.
Maximum credit cards allowed per page : Responseda 1 sayfa içerinde ne kadar maskelenmeyen (xxxx-xxxx-xxxx-1234) izin verilen kredi kartı sayısını belirler. Örneğin 3 değeri girilirse responseda 1 sayfada en fazla maskelenmeyen 3 kredi kartı değerine izin verilir diğerleri bloklanır.
Protected Credit Card : Hangi kart bilgilerinin silinip veya maskeleneceğini seçmeye yarar. Kart tipini hepsinin farklı algoritmasından çıkarıyıor.
-Content Type : Bu özellik sayesinde sadece belirlediğimiz türlerin üzerinden geçmesine izin verir . Hem son kullanıcıdan gelen isteği hem de web serverdan gelen isteği bloklar. Fakat typelar arayüzden girilmez aşağıdaki örnekteki gibi ssh üzerinden komutla girilir. Gerçek hayatta çok kullanılmayan bir özelliktir.
Content-type ekleme :
set appfw profile profile1 -requestContentType “text/html”
save ns config
Content-type silme :
unset appfw profile profile1 -requestContentType "text/html"
save ns config
Form Field Consistency : Bu özellik sayesinde kullanıcı tarafından gönderilen web formlarların yani input alanlarının özelliklerinin değiştirilip değiştirilmediği kontrol edilir. Eğer değiştirilmişse bloklanır. Örneğin adres idsinde bir input değeri user’a gönderilmediyse adres idsinde olan bir input değerini göndermek isteyen user’ın isteğini web server’a uğramadan bloklar. Başka bir örnek bir input alanı read only veya hidden ise değerin değiştirilip değiştirilmediğini kontrol eder. Başka bir örnek input alanı radio button veya list box ise yani sadece bir değer seçilip gönderebiliyor ise gönderilen datanın 1 tane olup olmadığını kontrol eder. Fakat bu işi sadece HTML fieldlar için yapabilir xml requestlerde geçerli değildir. Web servisler için kullanılamaz. Web serverdan gelen kullanıcıya gönderilen tüm fieldları session bazında tutarak gelen trafikte ek bir field eklenip eklenmediğini kontrol eder.
-Sessionless Field Consistency : Session bazlı fieldlere kontrol etmek veya kontrol etmeden çıkarmak için ayrılmıştır.
OFF: Session bazlı fieldleri kontrol etmez.
ON : Bütün hepsini kontrol eder.
PostOnly : Sadece HTTP Post metoduyla post edilen input değerlerini kontrol eder.
-Field Formats Check : Field içerik türlerine göre maximum ve minumum değerler belirlenir. Listede yok ise ssh üzerinden değişik formatlar eklenebilir.
-CSRF Form Tagging : User a her field için unique ve önceden bilinmeyen bir formid değeri gönderilir. Bu değer ile userden gelen id kontrol edilip doğru ise trafiğin geçmesi sağlanır. Bu zararlı kişilerin kendi formlarını oluştururak sizin değerleriniz dışında yüksek miktarda veri post etmesini engeller. Ek olarak başka sayfalardan login işleme vb işlemler gerçekleştirilmesini engeller.
-Kullanmak için Netscaler integrated cache özelliğinin kapalı olması gerekir.
-Start url referrer header aktif olması gerekir.
HTML Cross Site Scripting : Bu özellik sayesinde cross site scripting ataklarından korur. Kısaca cross site scripting atağı <script> </script>tagları arasında sitedeki inputlardan ve url’e eklenerek zararlı kodu içeriye gönderir veya almak istediği bilgiye ulaşır.
-Transform sross-site scripts: Bunu işaretlediğimizde < işaretini < ve > işaretini > şeklinde değiştirip web server a kodun çalışmayacak şekilde gitmesini sağlıyor. Bunu işaretlersek güvenle block kısmını kaldırabiliriz bu şekilde istek web server a gider ama değişmiş olarak gider ve zarar vermez.
-Check complete URLs for cross.site scripting : Bunu işaretlersek URL üzerinde de cross-site scripting kontrolü yapıyor. Örneğin (?id=<script>zararlı_script</script>) bu tür zararlı işlemlerde engellenmiş oluyor.
-HTML SQL Injection : Bu özellik sayesinde sql injection açıklığı korunmuş olur. SQL Injection sql kodlarını input alanında vs çalıştırarak kullanıcı bilgileri vs gibi verileri izinsiz alabilirler. SQL injection netscaler tarafında 3 alanda kontrol edilir cookie, post body ve header.
-Transform SQL Special Characters : Özel SQL karakterlerini değiştirir. Örneğin ‘ bu işareti “ bu şekilde iletir. \ işaretini web server’a \\ bu şekilde iletir. ; işaretini droplar. Diğer sembollere dokunmaz fakat bu 3 işaret olmadan sql sorgusu hiçbir işe yaramaz. Check for SQL Wildcard Characters ile select querylerdeki like dislike gibi komutlar çalışmaz.