Makale Özeti

.NET Framework 1.0 ve 1.1 sürümleri sınırlı şekilde yapılandırma dosyalarını şifreleme desteği sağlıyor. Buna rağmen .NET Framework 2.0 bize yapılandırma dosyalarında bilgileri command line kullanarak (Command Promt) şifreleme imkanı vermektedir.

Makale

Asp.Net 2.0 Ve Şifrelenmiş Web.Config Düğümleri

Genel Bakış

Web.config gibi yapılandırma dosyaları genellikle “hassas” bilgileri tutarlar, kullanıcı adı, şifre, veritabanı bağlantısı ve şifrelenmiş anahtarlar gibi. Eğer bu bilgileri korumazsanız uygulamanız çeşitli saldırılardan etkilenir ki bu etki yapılandırma dosyasının erişilmesi sebebi ile çok büyük olur. Aşağıdaki yapılandırma düğümleri sıklıkla hassas bilgileri içerirler ve bu yüzden şifrelenmeleri gerekmektedir.

 

· <appSettings>. Özelleştirilmiş ayarlar yapmanızı sağlar.

· <connectionStrings>. Bağlantılarınızı belirlemenizi sağlar.

· <identity>. Kişiselleştirme yapılmasını olanak sağlar.

· <sessionState>. Oturum bilginisinin ne şekilde saklanacağını belirlemenizi sağlar.

 

Şifreleme ve şifrelenmiş bilgiyi çözme performans bakımından yorucu bir işlemdir. Bu performans yoğunluğunu minimunda tutmak için sadece gerekli, özel bilgiler içeren yapılandırma düğümlerini şifrelemek gerekir.

2.0 ile Gelen Yenilikler

.NET Framework 1.0 ve 1.1 sürümleri sınırlı şekilde yapılandırma dosyalarını şifreleme desteği sağlıyor. Buna rağmen .NET Framework 2.0 bize yapılandırma dosyalarında bilgileri command line kullanarak (Command Promt) şifreleme imkanı vermektedir. Kendi özelleştirilmiş provider’larınızı da kullanabileceğiniz bu destek bize standart olarak iki provider ile destek sunur. Bunlar :

 

· RSAProtectedConfigurationProvider. Verileri şifrelemek ve şifreyi çözmek için kullanılan standart şifreleme anahtarıdır ve bu anahtar RSA genel anahtarını kullanmaktadır.

· DataProtectionConfigurationProvider. DPAPI kullanarak verileri şifreleme ve şifreyi çözme işlemi yapmaktadır.

 

Bu makalede Aspnet_Regiis.exe aracını kullanarak verileri DataProtectionConfigurationProvider ile verileri şifreleyeceğiz ve şifreyi çözüp okuyacağız

Not : ASP.NET otomatik olarak yapılandırma düğümlerinde şifrelenmiş dosyaların şifrelerini çözmektedir. Sizin ayrıca bir işlem yapmanıza veya ek kod yazmanıza gerek yok.

Adımlar

Bağlantı düğümlerini DPAPI ile şifrelemek için aşağıdaki adımları izlememiz gerekiyor.

 

· Adım 1. Şifrelenecek Düğümü Belirleme

· Adım 2. Makine veya kullanıcı bazlı depolama

· Adım 3. Yapılandırma dosyasını şifreleme

Adım 1. Şifrelenecek Düğümü Belirleme

Şifreleme ve şifrelenmiş bilgiyi çözme performans bakımından yorucu bir işlemdir. Bu performans yoğunluğunu minimumda tutmak için sadece gerekli, özel bilgiler içeren yapılandırma düğümlerini şifrelemek gerekir.

Şifreleme yapılamayacak düğümler

Eğer aşağıdaki düğümlerde “hassas” bilgiler tutuyorsanız , o verileri korumak için aspnet_regiis.exe aracı ile şifreleme yapamazsınız:

 

· <processModel>

· <runtime>

· <mscorlib>

· <startup>

· <system.runtime.remoting>

· <protectedData>

· <satelliteassemblies>

· <cryptographySettings>

· <cryptoNameMapping>

· <cryptoClasses>

 

Not : Bağlantı düğümlerini listelemek için Aspnet_setreg.exe aracını kullanabilirsiniz. Bu araç diğer sürümler için de mevcuttur.

Not : Bu bağlantı düğümlerini Aspnet_setreg.exe aracını kullanarak şifrelemek için daha fazla bilgi almak için bu makaleden yararlanabilirsiniz. How to use the ASP.NET utility to encrypt credentials and session state connection strings.

Adım 2. Makine veya kullanıcı bazlı depolama

DataProtectionConfigurationProvider makine bazlı veya kullanıcı bazlı anahtar depolanmasını olanak verir. Bu seçim sizin kullandığınız uygulamanın büyüklüğüne, kendi sunucunuz veya paylaşılan (shared hosting) kullanıp kullanmamanıza göre seçilmelidir Örneğin paylaşılan bir hosting planlamasında makine bazlı değil, kullanıcı bazlı anahtar kullanılmalıdır çünkü her uygulama için gizli bilgi tutulmalıdır.

Not: Kullanıcı anahtarlarının nerede depolandığını görmek için : Windows Data Protection.

Makinede Depolama

Aşağıdaki durumlarda makine bazlı anahtar depolaması kullanılmalıdır:

· Eğer uygulamanız sizin kendi sunucunuzda başka bir uygulama olmadan çalışıyor ise,

· Kullanılan sunucudaki tüm uygulamaların aynı “hassas” bilgileri kullanılmasını istendiğinde.

Kullanıcı Bazlı Depolama

Kullanıcı Bazlı anahtar depolamasını paylaşılan bir hosting kullanıldığında uygulamanızın “hassas” bilgilerinin başka bir uygulama tarafından erişilememesi için kullanmalısınız.

Adım 3. Yapılandırma dosyasını şifreleme

Bu adım Web.Config dosyası içerisindeki <connectionStrings> düğümünü makine bazlı ve kullanıcı bazlı anahtar depolaması kullanılarak nasıl şifreleyebileceğinizi içermektedir.

Bağlantı düğümünü makine bazlı anahtar depolaması kullanarak DPAPI ile şifreleme

Standart olarak DataProtectionConfigurationProvider makine bazlı anahtar kullanarak şifreleme yapmaktadır.

 

Web.Config içindeki connectionStrings düğümünün şifrelenmesi

1. Yeni bir web uygulaması oluşturun ve adını da MachineDPAPIOrnegi olarak belirleyin.

2. Web.config yapılandırma dosyasını ekleyin.

3. connectionString etiketi içine örnek bir bağlantı cümlesi ekleyin.

<connectionStrings>

<add name="Baglantim"

connectionString="Initial Catalog=veritabanim;

data source=localhost;Integrated Security=SSPI;"

providerName="System.Data.SqlClient"/>

</connectionStrings>

4. ConnectionStrings etiketini şifrelemek için aşağıdaki komutu yürütün. (Komutun yürütüleceği araç VS 2005 Command Promt)

5. aspnet_regiis -pe "connectionStrings" -app "/MachineDPAPI" -prov "DataProtectionConfigurationProvider"

aspnet_regiis.exe -pef "connectionStrings" C:\inetpub\wwwroot\MachineDPAPIOrnegi

Not: Aspnet_regiis.exe aracının bulunduğu klasör:

%WinDir%\Microsoft.NET\Framework\<versionNumarasir>

· -pe komutu sanal dizinde belirlediğiniz Etiketi Şifrelemeyi sağlar (Sadece bir sanal dizine yani uygulamaya yönelik)

 

· -pef komutu da tıpkı –pe komutu gibi uıygulama yöneliktir ve belirlenen etiketi şifreler. Tek farkı fiziksel yol üzerinden uygulama erişir.

 

· -app hangi uygulamanın web.config dosyasında şifreleme yapılacağını belirler. Parametre olarak sanal dizin adı verilir; örneğin, "/test/aspnet/MachineDPAPI".

 

· -prov şifrelemede kullanılacak provider belirler

 

Eğer komut yürütümü başarılı ise çıktı şu şekilde olacaktır:

Encrypting configuration section...

Succeeded!

 

Note DPAPI anahtarı bilgisayarınızda aşağıdaki adreste bulunmaktadır .

%windir%\system32\Microsoft\Protect\S-1-5-18

1. Web.Config dosyamızın yeni haline bakalım. Birkaç etiketin yeni oluşturulduğunu görüyoruz.

· <protectedData>

· <protectedDataSections>

· <EncryptedData>

· <CipherData><CipherValue>

 

 Şifreleme işleminden sonra Web.config uygulamanızın yeni hali aşağıdaki gibi olmalıdır.

 

...

<protectedData>

<protectedDataSections>

<add name="baglantim"

provider="dataprotectionconfigurationprovider"

inheritedByChildren="false" />

</protectedDataSections>

</protectedData>

...

<connectionStrings>

<EncryptedData>

<CipherData>

<CipherValue>AQAAANCMnd8BFdERjH
oAwE/Cl+sBAAAAexuIJ/8oFE+sGTs7jBKZdgQAAAACAAAAAAADZgAAqAAAABAAAAAKms84dyaCPAeaSC1dIMIBAAAAAA
SAAACgAAAAEAAAAKaVI6aAOFdqhdc6w1Er3HMwAAAAcZ00MZOz1dI7kYRvkMIn/BmfrvoHNUwz
6H9rcxJ6Ow41E3hwHLbh79IUWiiNp0VqFAAAAF2sXCdb3fcKk
gnagkHkILqteTXh</CipherValue>

</CipherData>

</EncryptedData>

</connectionStrings>

...

2. Ve bakalım bizim şifrelemeyi web uygulamamız nasıl algılıyor ve şifrelenmiş bilginin çıktısı nasıl oluyor. Bu şifreleme işleminin güzel yönlerinden biri de şifreyi bizim yerimize asp.net çözüyor biz hiçbir ek kod yazmıyoruz.

<%@ Page Language="C#" %>

<script runat="server">

protected void Page_Load(object sender, EventArgs e)

{

Response.Write("Bağlantımızın Çıktısı: " +

ConfigurationManager.ConnectionStrings

["MyLocalSQLServer"].ConnectionString);

}

</script>

<html>

<body/>

</html>

İyi Çalışmalar

Okan Tekeli

okan.tekeli@bilgeadam.com

okan@okantekeli.com