25 Ağustos 2014

IIS & Asp.Net Sıkılaştırma Ayarları

Nisan 2014 itibarıyla Netcraft tarafından  958.919.789 web sitesinden bilgi toplanarak yapılan araştırmaya göre interneteki sitelerin yüzde %31.10’u Microsoft IIS  kullanmaktadır. Bu blog yazımızda Microsoft IIS sunucu güveliğini sağlamak için yapılması gerekenlerden bahsedeceğiz.


Sunucu Bilgilerinin Gizlenmesi


Kullanılan sunucu teknolojisi ve versiyonunun bilinmesi saldırganların etkili saldırı yöntemleri bulmasını kolaylaştıracaktır.


Resim 1 ‘de görülebileceği üzere IIS sunucusuna yapılan isteklere dönen yanıtların içerisinde HTTP başlık(header) bölümünde sunucu bilgileri yer almakta.

 
Resim 1

Yanıt (Response) başlığında yer alan sunucu bilgilerini gizlemek için url rewrite modülünün sunucuya kurulması gerekmetedir. Url rewrite modülünü http://www.iis.net/downloads/microsoft/url-rewrite bu adresten indirebilirsiniz.

ISS Manager üzerinde url rewrite modülü üzerinde ayarları aşağıdaki resimlerde olduğu gibi yapalım.




Sunucu başlığının aşağıdaki gibi engellenmesi sağlanır.


Clickjacking Saldırılarına Karşı Önlem Alınması

Öncelikle Clickjacking konusundan bahsedelim. Clickjacking hedef sisteme görünmez(opacity değeri sıfır ) bir iframe nesnesini yükleyip, yüklenen sayfada kurbanın tıklaması istenen linklerin üzerine ilgisini çekecek tuzak linkler veya html nesneleri ekleyerek kurbanın farkında olmadan iframe içindeki linkle tıklamasını sağlamak olarak ifade edebiliriz.
1.IIS Yöneticisini başlatın
2. HTTP Response Headers ikonuna çif tıklayın.
3.Açılan alanın sağında bunan Actions kısmından Add linkine tıklayın.
4. Name kısmına X-Frame-Options yazın Value kısmına SAMEORIGIN yazıp kaydedin.

  

HTTP İstek (Request) Metotlarının Düzenlenmesi

HTTP 1.1 protokol birden fazla istek(request) metodunu destekler fakat bunların bir çoğu potansiyel riskler doğurmaktadır. Potansiyel risklerden kaçınmak için IIS Manager  Request Filtering uygulamasında HTTP Verbs sekmesine gelip OPTIONS, Put, Delete, Trace, metotlarına izin verilmesini engelleyebilirsiniz.
1.IIS yöneticisini başlatın
2.Request Filtering ikonuna çift tıklayınız
3.HTTP Verbs sekmesine geliniz
4.Açılan alanın sağında bunan Actions kısmından Deny Verb linkine tıklayın.
5.Verb kısmına örneğin TRACE yazın.
Engellemek istediğiniz metotları bu şekilde ekleyiniz. Ayrıca POST,GET,HEAD metotlarınada sayfanın sağında bulunan Action kısmından Allow Verb linkine tıklayıp Verb kısmına ekleyin.




Kullanılmayan Dosya Uzantılarının Engellenmesi

IIS tarafından güvenli kabul edilen bir çok uzantıya varsayılan olarak izin verilir.  Uygulamanızda kullanmadığınız dosya uzantıları aşağıdaki gibi engelleyebilirsiniz.
1.IIS yöneticisini başlatın
2.Request Filtering ikonuna çift tıklayınız
3.File Name Extensions sekmesine tıklayın
4.Açılan alanın sağında bunan Actions kısmından Deny File Name Extensions linkine tıklayıp kullanmadığınız dosya uzantısı türlerini File Name Extensions kısmına giriniz.


Yukarıdaki adımlara uyarak yine aynı şekilde istediğiniz dosya uzantılarına sayfanın sağında bulunan Action kısmındaki Allow File Name Extensions linkine tıklayarak gerçekleştirebilirsiniz.

Kritik İçeriklerin Filtrelenmesi

IIS varsayılan olarak web.config, bin, App_Data gibi önemli bilgileri içeren klasör ve dosyaları gizler. Bunlara ek olarak gizlemek istediğiniz klasör veya dosyalarınız  aşağıdaki adımları takip ediniz:
1.IIS yöneticisini başlatın.
2.Request Filtering ikonuna çift tıklayınız.
3.Açılan sayfanın sağında bulunan Action bölümünden Add Hidden Segment linkinden gizlemek istediğiniz klasör ve dosya adlarını yazınız. 



IIS Konfigürasyonlarının Başka Bir Sunucuya Aktarımı

Localde yaptığınız ve test ettiğiniz sunucu ayarlarınızın veya sunucu üzerinde tutuğunuz ayarların başka sunucu bir sunucuya aktaramı için aşağıdaki adımları uygulayınız:
1.IIS Yöneticisini başlatın
2.Management altındaki Shared Configuration çift tıklayın
3.Açılan  Shared Configuration  ekranın sağında yer alan Action bölümünden   “Export Configuration linkine tıklayınız
4.IIS konfigürasyon dosyalarının kaydedileceği dizinin seçin ve parola oluşturun.
Ayarları aktarmak istediğiniz sunucunuz üzerinde IIS yöneticisine açın ve Shared Configuration”  bölümünden “Enable shared configuration” tik işareti koyarak konfigurasyon dosyalarınızın dizinini seçin.
ASP.Net Uygulama Güvenliği

ASP.Net projelerinizi yayınladığınız sunucu kontrolünüzde değilse veya IIS yöneticisine erişiminiz yoksa bazı önlemleri web.config üzerinden alabilirisiniz.

Hata Sayfalarına Yönlendirme

Web sunucu tarafından kullanıcıya görüntülenen ön tanımlı teknik hata mesajları saldırganların işini kolaylaştırıcı bilgiler (ör: web sunucu versiyonu, veritabanı hataları ile tablo yapıları ve verileri, kod parçaları, v.b.) sızdırabilir. Backend kaynaklara yapılacak kaba kuvvet saldırıları (yani kullanıcıların eriştiği sayfalardan linklenmemiş kaynaklar için isim tahmini ile yapılan istekler) HTTP yanıt kodlarındaki farklılıklardan yola çıkılarak daha kolay yapılabilir. Tüm isteklere HTTP 200 OK yanıt kodunun dönmesi durumunda söz konusu saldırıların başarısı azaltılabilecektir. Hata durumlarına göre özel hata sayfaları oluşturmanız önerilmektedir. Oluşturduğunuz size özel hata sayfalarına web.cofig içerisinde yönledirme yapabilirsiniz.
Aşağıdaki kod ile bütün hataları tek bir sayfaya yönlendirme işlemini gerçekleştirebilirsiniz.

<system.web>
    <customErrors defaultRedirect=”ErrorPage.aspx” mode=”RemoteOnly”></customErrors>
</system.web>

Ayrıca,  aşağıdaki gibi yapılan isteklere karşılık gelen yanıt içerisinde  görünen hata kodlarına göre kendinize özel hata sayfaları oluştura bilirsiniz

<system.web>
<customErrors mode="RemoteOnly"defaultRedirect="GenericErrorPage.htm">
  <error statusCode="403" redirect="NoAccess.htm" />
  <error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
</system.web>


Gereksiz  Http Başlıklarının Engellenmesi

Kullanılan sunucu teknolojisi ve versiyonunun bilinmesi söz konusu altyapıdaki zafiyetlerin bulunarak kötü niyetli kullanımına imkan tanıyabilir. Bu ayarlar <configuration> taglerinin arasında aşağıdaki gibi yer alır.

 <system.webServer>
    <httpProtocol>
      <customHeaders>
        <remove name=”X-Powered-By” /> // Teknoloji bilgisinin döndürülmesini engeller (Örnek: ASP.Net)
        <remove name=”Server” /> // Sunucu bilgisinin döndürülmesini engeller. (Örnek: IIS 7.5)
        <remove name=”X-AspNet-Version” /> //ASP.Net versiyon bilgisinin döndürülmesini engeller.
        <add name=”X-FRAME-OPTIONS” value=”DENY” /> // Clickjack’den kaçınmak için iframe’leri reddeder. *
      </customHeaders>
    </httpProtocol>
  </system.webServer>

Asp.Net Versiyon Bilgisinin Gizlenmesi

Kullanıla Asp.Net versiyonunun bilinmesi söz konusu altyapıdaki zafiyetlerin bulunarak kötü niyetli kullanımına imkan tanıyabilir.

<system.web>  
  <httpRuntime enableVersionHeader=”false” />   //Asp.Net versiyon bilgisinin görünmemesini sağlar.
</system.web>  

Trace Metodunun Kapatılması

Web sitesinin hata ve işlemlerini uzaktan takip etmeye yarayan trace metodu sistemle ilgili ciddi bilgileri açığa vurabilmektedir. Trace metodunu kapatmak için aşağıdaki kodu web.config dosyası içersine eklenmesi gerekmektedir.
  <system.web>
     <trace enabled=”false” localOnly=”true” />
  </system.web>

Debug Modunun Kapatılması

Geliştirme halinde varsayılan olarak açık bulunan debug  modu projenizin yayınlama (publish) ayarları yapılmadan yayınlandığında açık kalır. Debug modunu kapatmak için aşağıdaki kodun web.config dosyası içerisine eklenmesi gerekmektedir.

 <system.web>
     <compilation debug=”false” targetFramework=”4.5”>
  </system.web>

Gereksiz İstek (Request) Metotlarının Engellenmesi

ASP.Net uygulamalrı genellikle POST ve GET komutlarını kullanmaktadır. Bunların dışında kalanlar uygulama gerektirmedikçe kullanılmaz. MOVE ve DELETE gibi seçeneklerin açık olması sayfa değişimi gibi açıklara neden olabilir. Bu sebeplerden sadece kullandığınız metotları açmanız önerilmektedir.

<system.webServer>
    <security>
      <requestFiltering>
        <verbs allowUnlisted=”false”> //listelenmeyenlerin hepsini kapatır.
          <add verb=”GET” allowed=”true” />
          <add verb=”POST” allowed=”true” />
        </verbs>
      </requestFiltering>
    </security>
  </system.webServer>

Kritik İçeriklerin Filtrelenmesi

IIS varsayılan olarak web.config, bin, App_Data gibi önemli bilgileri içeren klasör ve dosyaları gizler bunlara ek olarak klasör veya dosyalarınız var ise aşağıdaki kodu kullanarak gizleyebilirsiniz.

 <system.webServer>
    <security>
      <requestFiltering>
        <hiddenSegments>
          <add segment=”Dosyanızın veya klasörünüzün adı” />
        </hiddenSegments>
      </requestFiltering>
    </security>
  </system.webServer>

Gereksiz / Kullanılmayan Dosya Uzantılarının Kısıtlanması

IIS tarafından güvenli kabul edilen bir çok uzantıya varsayılan olarak izin verilir. Eğer uygulamanızda çok fazla dosya çeşitliliği yok ise bunları kısıtlayabilirsiniz.
<system.webServer>
    <security>
      <requestFiltering>
        <fileExtensions allowUnlisted=”false”>
        <add fileExtension=”.html” allowed=”true” />
          <add fileExtension=”.aspx” allowed=”true” />
          <add fileExtension=”.jpg” allowed=”true” />
          <add fileExtension=”.png” allowed=”true” />
          <add fileExtension=”.js” allowed=”true” />
          <add fileExtension=”.css” allowed=”true” /
      </fileExtensions>
      </requestFiltering>
    </security>
  </system.webServer>