Windows Azure Cloud Service Web.config Dosyası Şifreleme

Standard

Bir web servis için web.config dosyası gerekli yapılandırma ayarlarını içerir. Bu yapılandırma ayarlarından bazıları hassas bilgiler içerebilir, örneğin web servis bir veritabanına bağlanıyor ise bu veritabanı için gerekli bağlantı dizesi (connection string) web.config içerisinde plain text olarak durur ve veritabanının bulunduğu sunucu için gerekli kullanıcı adı ve şifreyi içerir. Bu durum tabi ki olası bir güvenlik açığıdır; eğer web servisi bir üçüncü parti sunucuda tutmayı planlıyorsak, ya da kaynak koduna bu bilgiye sahip olmasını istemediğiniz kişilerin erişmesi gerekiyorsa, ekstra bir güvenlik katmanı sağlamak için bu bilgiyi şifreleyebiliriz.

  <connectionStrings>
    <add name="DatabaseConnectionString" connectionString="Data Source=blablabla.database.windows.net;Initial Catalog=BlaBlaDB;User ID=kullaniciadi;Password=sifre"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

.NET Framework, bilgilerimizin yukarıdaki gibi gözükmemesini sağlamak için “protected configuration” adı verilen bir özellik ile şifreleme imkanı sağlar ve bu şifrelemeyi DpapiProtectedConfigurationProvider veya RsaProtectedConfigurationProvider sınıflarını kullanarak gerçekleştirir. Ancak bu iki yöntemde de şifrelemenin web servisin bulunacağı sunucu üzerinde uygulanması gerekir, çünkü şifreleme için makineye özel bir anahtar değeri kullanılır ve bu durum da Azure üzerinde bu özelliği kullanamayacağımız anlamına gelir.

Azure üzerinde web.config dosyasını şifrelemek istiyorsak özel bir “protected configuration provider” kullanmamız gerekli. Bu yazımda, şifreleme için bir “.pfx” uzantılı sertifika ve Windows Azure Certificate Store kullanarak şifreleme yapan özel “Pkcs12 Protected Configuration Provider” ile Azure üzerindeki web servisimizin web.config dosyasını şifreleyeceğiz.

Önemli Not: Sonradan gelen bir güncelleme nedeniyle aşağıdaki komutları çalıştırırken dosya isimleri artık tırnak işaretleri arasına alınmayarak belirtiliyor. Yani, isimleri “CN=azureconfig” gibi kullanmaktansa doğrudan CN=azureconfig şekilde yazmanız gerekli, aksi halde adlandırma hatası alırsınız.

İlk önce kullanacağımız sertifikayı oluşturarak başlayacağız. Bunun için Visual Studio developer komut satırını yönetici olarak çalıştırarak aşağıdaki komutu çalıştıracağız:

makecert -r -pe -n “CN=azureconfig” -sky exchange “azureconfig.cer” -sv “azureconfig.pvk”

1

1_2

2

Bu komutu çalıştırdığımızda bizden bir şifre isteyecek, ve ardından da onaylamak için şifreyi tekrar girmemizi isteyecek. Bu şifreyi ileride de kullanacağız, ben bu yazı için test amacıyla şifreyi “sifre” olarak giriyorum, siz de dilediğiniz şifreyi girebilirsiniz.

3

4

Ardından, .pfx uzantılı dosyayı oluşturmak için aşağıdaki komutu çalıştırıyoruz:

pvk2pfx -pvk “azureconfig.pvk” -spc “azureconfig.cer” -pfx “azureconfig.pfx” -pi onceki-adimdaki-girilen-sifre

5

Ardından, .pfx dosyamızın oluşturulduğunu kontrol etmek için komut satırının o anda bulunduğu klasöre giderek dosyanın olup olmadığına bakabiliriz. 64 bit işletim sisteminiz var ise varsayılan olarak “C:\Windows\SysWOW64” klasörü altında bulunuyor.

6

Gördüğümüz üzere sertifikamız oluşturuldu. Sırada bu sertifikayı yerel makinemizin sertifika deposuna eklemek var. Bunun için Microsoft Management Console kullanacağız. MMC’yi açarak başlıyoruz, bunun için Windows 8’de “mmc” diye aratabilirsiniz.

7

MMC’yi açtıktan sonra, File menüsü altından Add/Remove Snap-ins seçeneğini seçin.

8

Açılan ekranda Certificates’ı seçerek Add düğmesine tıklayın, sonrasında Computer account seçeneğini ve Local computer’ı seçin, ardından Finish’e tıklayın.

9

10

11

OK’e tıklayarak MMC’ye geri dönün. Eklediğimiz Certificates bölümü altında, Personal’a sağ tıklayın ve All Tasks altındaki Import’a tıklayın. Oluşturduğumuz .pfx dosyasını seçin, ve oluştururken kullandığımız şifreyi girin.

12

13

14

15

Sertifikamızı ekledikten sonra, sıra bu sertifikayı Azure projemize eklemeye geldi. Bunun için öncelikle Azure Cloud Service projemizin içindeki rolümüze sağ tıklayarak Properties’i seçiyoruz. Ardından açılan sayfadan Certificates sekmesine gelerek Add Certificate düğmesine tıklıyoruz.

16

17

Add Certificate düğmesine tıklayınca eklenen sertifikanın “Thumbprint” bölümünün yanındaki “…” işaretine tıklayarak açılan listeden oluşturduğumuz “azureconfig” sertifikasını seçiyoruz. Burada isterseniz sertifikaya bir isim de verebilirsiniz.

18

19

Sırada şifrelemeyi sağlayacak Pkcs12 Protected Configuration Provider’ın bulunduğu dll dosyasını eklemek var. Bunun için, buradan projenin kaynak kodunu (PKCS12ProtectedConfigurationProvider.zip) indirip derleyerek dll dosyasını oluşturmamız gerekiyor.

Lakin, ben bunu zaten yaptığım için isterseniz buradan bu dll dosyasını indirebilirsiniz. 🙂

Şimdi de Azure Cloud Service içinde tutacağımız web service projesine bu dll’yi eklememiz dgerekli. Bunun için References’a sağ tıklayarak “Add Reference” diyoruz ve alttaki Browse düğmesine tıklayarak dll dosyamızı seçiyoruz.

20

Şimdi de web.config dosyasını açıp aşağıdaki kodu ekleyerek bunu kullanmasını sağlıyoruz (thumbprint bölümüne kendi sertifikanızın önceki adımlarda gördüğünüz thumbprint’ini eklemeniz gerekli):

<configProtectedData>
    <providers>
      <add name="CustomProvider" thumbprint="86050A6EDF846DC3F58422F8F8F8380A2A477E97"
           type="Pkcs12ProtectedConfigurationProvider.Pkcs12ProtectedConfigurationProvider, PKCS12ProtectedConfigurationProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=34da007ac91f901d"/>
    </providers>
</configProtectedData>

Visual Studio developer komut satırını açarak Web.config dosyasının bulunduğu klasöre gidip aşağıdaki komutu çalıştırarak şifreleme işlemini tamamlıyoruz:

aspnet_regiis -pef “connectionStrings” “.” -prov “CustomProvider”

21

22

Web.config dosyamızı başarıyla şifreledik. Eğer şimdi dosyayı açıp bakarsanız, connection string bölümünün şifrelendiğini görebilirsiniz:

  <connectionStrings configProtectionProvider="CustomProvider">
    <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#aes192-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>rsaKey</KeyName>
          </KeyInfo>
          <CipherData>
            <CipherValue>bWrpsznvy5CXkuzvoR+v5tIQdCsqHC2wWkpw3IsyMf4+p/43LSsTdvkGUbUYevkRhb6EMgrTgPqBqs0bZJLkGiMxVxCDXpwWDVt7JusQUX58TnvgUtS/EmTg3CQt+lkgV3715VCybroYFKW53UL79jYqJM/mbC8aEj0KofnKY6shq8f8iP8KGrAGG8yl44BcMVnGGzm6fvfJOUs96/lqwbNcYEaAMX178OdIOXiiFi9Pf1JaqbjZtVJB4svlNztIflF1eF9bQt+Sey20Ppw8A6jN+sXycYV4zCts+j65KrpzMf7MqUs3lU1ayoQyegZShoYHGa81D+bhaSb9QSrCgQ==</CipherValue>
          </CipherData>
        </EncryptedKey>
      </KeyInfo>
      <CipherData>
        <CipherValue>mNPx+85tLgwnWk5C56jJS+MEE+CVhoB9dBFEDj5f4USIlI2vYwPTcicONNysFCpMc7jYjKvPl3k9Do9qqHdJCMR8h42QQ3W0OCsDPGRgbNDfh7afCcRzv/Oc6KYJnuTm1nMybs5HdntMHhKky7U5gvqpF8z9JbPAe4wHmvKzy4ORV67HW2m0HYZXRE4RG24IOcnsoKTu2HVy592QVSUa7/TCWZZ1qbmebEqzNR2cxYqIrAY4ZqEfrANZb+da756Pzonf/87QdP3q+LHzqcXDe3YYBm/3dv+Sh7IjJGTJPyrMQkDNHyVNW2R7UMECZgmaMUoT3WQMJgZWJQUZQcKRR0gDFSE0MHLyhNktUyk1jjw=</CipherValue>
      </CipherData>
    </EncryptedData>
  </connectionStrings>

Bu projenin Azure üzerinde çalışmasını sağlamak için, son olarak Azure portalı içinde Cloud Service’imize giderek, “Certificates” sekmesi altında şifreleme işleminde kullandığımız sertifikayı yüklememiz gerekli.

23

24

Artık Web.config dosyası şifrelenmiş web servisimizi Azure üzerine yükleyerek kullanabiliriz. 🙂

Gelecek yazılarımda görüşmek üzere.

Advertisements

3 thoughts on “Windows Azure Cloud Service Web.config Dosyası Şifreleme

Comment

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s