Adım Adım Asp.net Güvenliği

ASP.Net projelerinizi yayınlarken özellikle IIS sizin kontrolünüzde değilse bazı önlemleri web.config tarafında veya gerekli yerlerde kod dosyalarında almanız önemlidir. Bu aşamada kodunuza müdahale etmeden web.config’de hızlıca ne gibi önlemler alabilirsiniz onu inceleyeceğiz.

1-      Debug’ı kapatın.

Development halinde default olarak açık bulunan debug opsiyonu publish ayarları yapılmadan yayınlandığında açık kalır. Bunu kapatın.

  <system.web>

     <compilation debug=“false” targetFramework=“4.0”>

  </system.web>

2-      Trace’i kapatın.

Web sitesini,n hata ve işlemlerini uzaktan takip etmeye yarayan trace komutu sistemle ilgili ciddi bilgileri açığa vurabilmektedir. Zorunlu hallerde kısa süreliğine açık tutmanın  yanı sıra bu özellik kapalı olmalıdır.

  <system.web>

     <trace enabled=“false” localOnly=“true” />

  </system.web>

3-      http Runtime Değerleri

Uygulamanın çalışmasıyla ilgili bir çok farklı ayarı barındıran <httpRuntime/> elementinde aşağıdaki ayarları uuygulayın.

<system.web>  

    <httpRuntime enableVersionHeader=“false” />   //Asp.Net versiyon bilgisini gizler.

</system.web>

Diğer attiribute’ler:

enableHeaderChecking=”true” // ASP.Net Request Header’larını kontrol ederek zararlı requestlerde hata döndürür.

executionTimeout=”110” // 110 varsayılan değeri ile çalışan bu attiribute debug’ın false olduğu durumlarda ASP.Net’in bir request’te hataya düşmeden önce kaç saniye beklemes gerektiğini ayarlar.

maxRequestLength=”4096” //4096 varsayılan değeri ile çalışan bu attiribute Dos ataklarına bir önlem olarak da kullanılabilir. Kullanıcıların post ettikleri veriyi KB cinsinden sınırlar. FileUpload kontrolü de buradaki değere göre upload yapar.

maxUrlLength=”260” //260 varsayılan değeri olan attiribute adres satırındaki karakterlerin uzunluğunu belirler. Gereksiz ise sayı düşürülmelidir.

4-      Hata Sayfaları

Mutlaka uygulama bilgisi içermeyen özel hata sayfaları üretin ve hata durumlarına göre bunlara yönlendirin. En azından tek bir hata sayfanız olsun.

<system.web>

    <customErrors defaultRedirect=“hata.aspx” mode=“RemoteOnly”></customErrors>

</system.web>

5-      Gereksiz Http Header’ları Engelleyin.

 Uygulamanız ve sunucunuz hakkında bilgi gönderen http headerlarını engelleyin. 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 Örn: ASP.Net

        <remove name=“Server” /> // Sunucu bilgisinin döndürülmesini engeller. Örn 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>

6-       Gereksiz http Verb’leri Engelleyin.

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 metodları açın.

<system.webServer>

    <security>

      <requestFiltering>

        <verbs allowUnlisted=“false”>

          <add verb=“GET” allowed=“true” />

          <add verb=“POST” allowed=“true” />

        </verbs>

      </requestFiltering>

    </security>

  </system.webServer>

7-       Mümkünse Kullanılmayan MIME-Type’ları Engelleyin.

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=“.cfm” allowed=“true” />

          <add fileExtension=“.js” allowed=“true” />

          <add fileExtension=“.css” allowed=“true” />

          <add fileExtension=“.html” allowed=“true” />

          <add fileExtension=“.aspx” allowed=“true” />

          <add fileExtension=“.jpg” allowed=“true” />

          <add fileExtension=“.png” allowed=“true” />

          <add fileExtension=“.gif” allowed=“true” />

          <add fileExtension=“.axd” allowed=“true” />

        </fileExtensions>

      </requestFiltering>

    </security>

  </system.webServer>

8-       Kritik İçeriği Filtreleyin

IIS varsayılan olarak web.config, bin, App_Data gibi önemli bilgileri içeren klasör ve dosyaları gizler bunlara ek klasör veya dosyalarınız var ise gizleyin.

  <system.webServer>

    <security>

      <requestFiltering>

        <hiddenSegments>

          <add segment=“configuration_folder” />

        </hiddenSegments>

      </requestFiltering>

    </security>

  </system.webServer>

9-       URL’leri Kontrol Edin. Zararlı Dizileri Engelleyin.

“\”, “..” gibi dizinler arası geçişi tanımlayan karakterler kullanılarak URL’ler üzerinden yetkisiz klasörlere erişim denenbilir. Bu durumdan korunmak için:

   <system.webServer>

      <security>

         <requestFiltering>

            <denyUrlSequences>

               <add sequence=“..” />

               <add sequence=“:” />  //varsayılanlar dışında  port kullanılan siteler için bu ayar sorun yaratabilir

               <add sequence=“” />

            </denyUrlSequences>

         </requestFiltering>

      </security>

   </system.webServer>

10-   ConnectionString’leri Şifreleyin

Web.config’de yer alan ConnectionString’ler veritabanı bilgilerini düz text formatında sakladığından sunucuya fiziksel erişim sağlanması durumunda veritabanı güvenliği açısından büyük sıkıntı yaratacaktır.

Bu bilgileri şifreli olarak saklayın. Şifreleme işlemi için

Öncelikle uygulamanızın kullanıcısnı tespit edin. Bu Default Application Pool için

IIS APPOOL\DefaultAppPool şeklindedir. “\” işaretinin sağ tarafı application pool identity’e tekabül eder.

Veya küçük bir web uygulaması yaparak merak ettiğiniz sitenin altında çalıştırmak kaydıyla

Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);

Komutunu kullanabilirsiniz.

2. adımda Sunucuda Commad Promt açarak,

Cd komutu ile Framework versiyonunuzun klasörüne geçin. Örn: C:\Windows\Microsoft.NET\Framework64\v4.0.30319

Burada aspnet_regiis -pe “connectionStrings” -app “/UygulamaAdi” komutunu çalıştırın

Son adımda ise aynı komut satırında

aspnet_regiis -pa "NetFrameworkConfigurationKey" " IIS APPOOL\DefaultAppPool "

komutunu çalıştırarak 1. Adımda belirlediğiniz uygulamayı çalıştıran kullanıcının şifrelenmiş bilgiye erişimini sağlayın. Bu işlem varsayılan olarak RSA Encryption kullanır.

ConnectionString’i decrypt etmek için 2. Adımdaki komutu –pe parametresi yerine –pd parametresi ile kullanmanız yeterlidir.

 * Bu işlemi Global.asax dosyasında yaparsanız daha verimli sonuç elde edebilirsiniz.

void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.Response.AddHeader("x-frame-options", "DENY");
}

Paylaştıkça Artan Tat...

Bir yorum ekleyin

E-posta hesabınız yayımlanmayacak.