25 Eylül 2016 Pazar

Encrypt / Decrypt Connection String in Web.Config

Giriş


Bu ipucu, Web.Config içinde bulunan connection stringin nasıl encrypt edileceği hakkında bilgi içermektedir. Böylece güvenlik artırılacak, database bağlantısının daha güvenilir olmasını sağlayacaktır. Web.Config, connection string dışında daha bir çok şifrelenmesi gereken farklı hassas bilgiler barındırabilir. Bu makalede öncelikle ConnectionString'in encrypt edilmesinden bahsedilecektir.

Neden Önemli?

Web.Config içerisinde bulunan, gizliliği yüksek bilgiler içeren sectionların şifrelenmesi önemlidir. Bu bilgilere açık bir şekilde erişilmesi muhtemel açıkları doğurur. Örneğin production serverda bulunan bir Web.Config dosyasını düşünelim.Web uygulamasının çalışması için gerekli tüm bilgilere sahip olabilir. SQL Database bağlantı şifreleri, SMTP server, API keys vb. diğer tüm hassas bilgiler bunlara örnek verilebilir. Bu kadar önemli bilgiler içermesine rağmen Web.Config dosyasına genellikle bir kaynak kod dosyası olarak davranılır. Bunun anlamı şudur. Takımınızdaki herhangi bir yazılım geliştirici veya kaynak kodlara erişim yetkisine sahip herhangi bir kişi Web.Config içerisinde bulunan hassas bilgileri görebilir ve okuyabilir.

Connection String'in Şifrelenmesi

Örneğimizde Web.Config içerisinde bulunan connectionStrings bölümünün şifrelenmesini gerçekleştireceğiz. Diğer bölümler de aynı yöntem kullanılarak şifrelenebilmektedir.

Web.Config Şifrelemeden Önce

Aşağıdaki örnekte bir bölümü bulunan Config dosyasını incelerseniz kolaylıkla okunabildiğini görebilirsiniz. Bu kaynak kodlara erişebilecek kişiler düşünüldüğünde, çok da güvenli bir yöntem olmadığı açıktır.
<configuration>
  <connectionStrings>
    <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=TestCtlg;" />
  </connectionStrings>
</configuration>

Web.Config Şifreleme

  1. Command Promptu Yönetici olarak açın.
  2. Aşağıda belirtilen klasör konumuna gidin. Bu konumda Aspnet_regiis.exe isimli çalıştırılabilir dosyanın olduğunu kontrol edin.
    cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
  3. Örneğin Web.Config dosyanızın "D:\Projects\TestProject" içinde bulunduğunu varsayalım. Şifrelemek için aşağıdaki komutu kullanın.
  4. ASPNET_REGIIS -pef "connectionStrings" "D:\Projects\TestProject"
    Aspnet_regiis.exe toolu pef seçeneği ile Web.Config klasör yolu verilerek üstteki gibi kullanılır.
    Not : "connectionStrings" case sensitive bir parametredir.

Web.Config Şifrelemeden Sonra

Connection string şifrelendikten sonra aşağıdaki gibi artık okunabilir bir formatta olmayacaktır.
<configuration>
  <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
      xmlns="http://www.w3.org/2001/04/xmlenc#">
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <KeyName>Rsa Key</KeyName>
          </KeyInfo>
          <CipherData>
            <CipherValue>ZbDTF00MYzUUW5U3w3PU0rfiAH1UKhvuLSNWPmB/YifBKne6HAWfVc3CnKVimyP8SFyamaR5oAIAxj/xavfpox8EOYXNI+afsksiuA5huSDupCZKNuXq+VCZrdIyn6YOq+W7s3Ojlu7q9VwKcoKurl28l2hcPvWkBk11KYB7hr0=</CipherValue>
          </CipherData>
        </EncryptedKey>
      </KeyInfo>
      <CipherData>
        <CipherValue>42IPPRUjJxCNDHEBLCAJI4/NyLpLueZSBzUXO69lVdZU8+nLpxO+opnbZNxqddyzNnbCO1Uk2Da3ljExkqnLIxT2zs90JAhZvJ5ljIgCipq7ZEp7zHOpvTH9fBGoZJJWhgdddOrHZsLDE9mILjlvBHDhPQrYcMHtY6oLIbxJq92it82iBJv0fS7v1S/o0p4hAtfky+6hXCZWSKUJHr88NDrKe2EEK3mazD2QD5Ozf/w=</CipherValue>
      </CipherData>
    </EncryptedData>
  </connectionStrings>
</configuration>

Decrypt Edilmiş Configuration Ayarlarına Erişim

ASP.NET'in Web.Config dosyasını işleme koyduğunda otomatik olarak içeriğini decrypt ettiğini bilmek çok güzel. Bu yüzden encrypted dosyayı decrypt etmek için herhangi bir ekstra adıma ihtiyacımız yok.Var olan uygulamanızı şifrelenmiş Web.Config olmasına rağmen herhangi bir değişikliğe ihtiyaç duymadan çalıştırmaya devam edebilirsiniz. Uygulamanız sorunsuz bir şekilde çalışacaktır. Bu ilginç değil mi?
string appConnString = ConfigurationManager.ConnectionStrings[1].ToString();

Web.Config Şifresini Çözme

Peki Web.Config şifresini çözüp orjinal formatı tekrar okumak mümkün müdür? Sorunun cevabı EVET. Basitçe aşağıdaki komut satırı çalıştırılarak Web.Config içindeki connectionStrings bölümü decrypt edilebilir.
ASPNET_REGIIS -pdf "connectionStrings" "D:\Projects\TestProject"
Not : "connectionStrings" case sensitive bir parametredir.

Soru ve Cevap

  1. En basitçe şöyle bir soru sorulabilir. Madem ASPNET_REGIIS kullanılarak Web.Config şifrelenebiliyor ve çözülebiliyor. Bu durumda Web.Config'e erişen bir kişi aynı yöntemi kullanarak şifreyi çözüp gizlenen bilgilere ulaşabilir.
    • Bu soruya cevabım kesinlikle hayır. Web.Config'i şifrelediğinizde, işlemi yaptığınız makineye özel anahtar ile şifrelenir. Şifrelenmiş dosyayı başka bir sistemde çözmeye kalkışırsanız, bulunduğunuz makinenin anahtarı ile uyuşmayacağından hata alacaksınız.
  2. Web.Config içeriği şifrelendikten sonra okunabilir bir formatta değildir. Bu bilgilere nasıl ulaşacağım.
    • Bunun için kodunuzda herhangi bir değişiklik yapmanıza gerek yoktur. ASP.NET otomatik olarak config dosyasını decrypt edip işleme koymaktadır.
  3. Şifrelenmiş config dosyası üzerinde nasıl değişiklik yapacağım.
    • Bunu yapmanız imkansız. On the fly olarak bir değişiklik gerçekleştiremezsiniz. Eğer bir değişiklik gerçekleştirebilmek için ilk önce decrypt etmeniz gerekecektir.
  4. Serverda işlem yapma yetkisine sahip kişi bu işlemleri yapabilir. Bu durumda ne yapacağım?
    • Web.Config şifreleme sadece birkaç saniye süren bir işlemdir. Açık yazılmış bir text dosyasından daha güvenilir olduğu kesindir. Çalışılan serverda full işlem yapma yetkisine sahip bir hacker için güvenlik sağlamamaktadır.