Parolaların ve diğer hassas verilerin ASP.NET ve Azure App Service’e dağıtılması için en iyi yöntemler

tarafından Rick Anderson

Bu öğretici, kodunuzun güvenli bilgileri nasıl güvenli bir şekilde depolayıp bunlara erişebileceğini gösterir. En önemli nokta, parolaları veya diğer hassas verileri asla kaynak kodunda depolamamanız ve üretim gizli dizilerini geliştirme ve test modunda kullanmamanız gerektiğidir.

Örnek kod basit bir Web İşi konsol uygulaması ve bir veritabanı bağlantı dizesi parolası, Twilio, Google ve SendGrid güvenli anahtarlarına erişmesi gereken ASP.NET bir MVC uygulamasıdır.

Şirket içi ayarlardan ve PHP'den de bahsedilmektedir.

Geliştirme ortamında parolalarla çalışma

Öğreticiler sık sık kaynak kodunda hassas verileri gösterir ve umarım hassas verileri asla kaynak kodunda depolamamanızı sağlar. Örneğin, SMS ve e-posta 2FA ile ASP.NET MVC 5 uygulamamweb.config dosyasında aşağıdakileri gösterir:

</connectionStrings>
   <appSettings>
      <add key="webpages:Version" value="3.0.0.0" />
      <!-- Markup removed for clarity. -->
      
      <!-- SendGrid-->
      <add key="mailAccount" value="account" />
      <add key="mailPassword" value="my password" />
      <!-- Twilio-->
      <add key="TwilioSid" value="My SID" />
      <add key="TwilioToken" value="My Token" />
      <add key="TwilioFromPhone" value="+12065551234" />

      <add key="GoogClientID" value="1234.apps.googleusercontent.com" />
      <add key="GoogClientSecret" value="My GCS" />
   </appSettings>
 <system.web>

web.config dosyası kaynak kodu olduğundan bu gizli diziler hiçbir zaman bu dosyada depolanmamalıdır. Neyse ki öğesi, <appSettings> hassas uygulama yapılandırma ayarlarını içeren bir file dış dosya belirtmenize olanak tanıyan bir özniteliğine sahiptir. Dış dosya kaynak ağacınıza iade edilmediği sürece tüm gizli dizilerinizi bir dış dosyaya taşıyabilirsiniz. Örneğin, aşağıdaki işaretlemede dosya AppSettingsSecrets.config tüm uygulama gizli dizilerini içerir:

</connectionStrings>
   <appSettings file="..\..\AppSettingsSecrets.config">      
      <add key="webpages:Version" value="3.0.0.0" />
      <add key="webpages:Enabled" value="false" />
      <add key="ClientValidationEnabled" value="true" />
      <add key="UnobtrusiveJavaScriptEnabled" value="true" />      
   </appSettings>
  <system.web>

Dış dosyadaki işaretleme (bu örnekteAppSettingsSecrets.config ), web.config dosyasında bulunan işaretlemeyle aynıdır:

<appSettings>   
   <!-- SendGrid-->
   <add key="mailAccount" value="My mail account." />
   <add key="mailPassword" value="My mail password." />
   <!-- Twilio-->
   <add key="TwilioSid" value="My Twilio SID." />
   <add key="TwilioToken" value="My Twilio Token." />
   <add key="TwilioFromPhone" value="+12065551234" />

   <add key="GoogClientID" value="1.apps.googleusercontent.com" />
   <add key="GoogClientSecret" value="My Google client secret." />
</appSettings>

ASP.NET çalışma zamanı, dış dosyanın içeriğini appSettings> öğesindeki <işaretlemeyle birleştirir. Belirtilen dosya bulunamazsa, çalışma zamanı dosya özniteliğini yok sayar.

Uyarı

Güvenlik - Gizli dizilerinizi .config dosyanızı projenize eklemeyin veya kaynak denetimine eklemeyin. Varsayılan olarak, Visual Studio öğesini olarak ContentayarlarBuild Action; bu, dosyanın dağıtıldığı anlamına gelir. Daha fazla bilgi için bkz. Proje klasörümdeki dosyaların tümü neden dağıtılamıyor?Gizli diziler .config dosyası için herhangi bir uzantıyı kullanabilirsiniz, ancak yapılandırma dosyaları IIS tarafından sunulmadığından.configtutmak en iyisidir. ayrıcaAppSettingsSecrets.config dosyasının web.config dosyasından iki dizin düzeyi olduğuna ve dolayısıyla çözüm dizininin tamamen dışında olduğuna dikkat edin. Dosyayı çözüm dizininden taşıyarak "git add *" dosyayı deponuza eklemez.

Geliştirme ortamında bağlantı dizeleriyle çalışma

Visual Studio , LocalDB kullanan yeni ASP.NET projeleri oluşturur. LocalDB, geliştirme ortamı için özel olarak oluşturulmuştur. Parola gerektirmez, bu nedenle gizli dizilerin kaynak kodunuzda iade edilmesini önlemek için herhangi bir işlem yapmanız gerekmez. Bazı geliştirme ekipleri parola gerektiren SQL Server (veya diğer DBMS) tam sürümlerini kullanır.

İşaretlemeyi configSource tamamen <connectionStrings> değiştirmek için özniteliğini kullanabilirsiniz. <appSettings>file İşaretlemeyi birleştirilen özniteliğin aksine, configSource özniteliği işaretlemenin yerini alır. Aşağıdaki işaretleme ,web.config dosyasındaki özniteliğini gösterirconfigSource:

<connectionStrings configSource="ConnectionStrings.config">
</connectionStrings>

Not

Bağlantı dizelerinizi bir dış dosyaya taşımak için yukarıda gösterildiği gibi özniteliğini kullanır configSource ve Visual Studio'nun yeni bir web sitesi oluşturmasını sağlarsanız, veritabanı kullandığınızı algılayamaz ve Visual Studio'dan Azure'da yayımladığınızda veritabanını yapılandırma seçeneğini elde etmezsiniz. özniteliğini configSource kullanıyorsanız, web sitenizi ve veritabanınızı oluşturmak ve dağıtmak için PowerShell'i kullanabilir veya yayımlamadan önce web sitesini ve veritabanını portalda oluşturabilirsiniz.

Uyarı

Güvenlik - AppSettingsSecrets.config dosyasından farklı olarak, dış bağlantı dizeleri dosyası kök web.config dosyasıyla aynı dizinde olmalıdır, bu nedenle kaynak deponuzda denetlemediğinizden emin olmak için önlemler almanız gerekir.

Not

Gizli dizi dosyasında Güvenlik Uyarısı: En iyi yöntem, test ve geliştirme aşamasında üretim gizli dizilerini kullanmamaktır. Test veya geliştirmede üretim parolalarını kullanmak bu gizli dizileri sızdırıyor.

Web İşleri konsol uygulamaları

Konsol uygulaması tarafından kullanılan app.config dosyası göreli yolları desteklemez, ancak mutlak yolları destekler. Gizli dizilerinizi proje dizininizin dışına taşımak için mutlak bir yol kullanabilirsiniz. Aşağıdaki işaretleme ,C:\secrets\AppSettingsSecrets.config dosyasındaki gizli dizileri ve app.config dosyasındaki hassas olmayan verileri gösterir.

<configuration>
  <appSettings file="C:\secrets\AppSettingsSecrets.config">
    <add key="TwitterMaxThreads" value="24" />
    <add key="StackOverflowMaxThreads" value="24" />
    <add key="MaxDaysForPurge" value="30" />
  </appSettings>
</configuration>

Gizli dizileri Azure'a dağıtma

Web uygulamanızı Azure'a dağıttığınızda ,AppSettingsSecrets.config dosyası dağıtılmaz (istediğiniz budur). Bunu yapmak için Azure Yönetim Portalı'na gidip bunları el ile ayarlayabilirsiniz:

  1. adresine https://portal.azure.comgidin ve Azure kimlik bilgilerinizle oturum açın.
  2. Web Apps Gözat'a >ve ardından web uygulamanızın adına tıklayın.
  3. Tüm ayarlar Uygulama ayarları'nı >tıklatın.

Uygulama ayarları ve bağlantı dizesi değerleri ,web.config dosyasındaki aynı ayarları geçersiz kılar. Örneğimizde bu ayarları Azure'a dağıtmadık, ancak bu anahtarlar web.config dosyasında yer alıyorsa portalda gösterilen ayarlar öncelikli olacaktır.

DevOps iş akışını izlemek ve Azure'da bu değerleri ayarlamayı otomatikleştirmek için Azure PowerShell (veya Chef veya Puppet gibi başka bir çerçeve) kullanmak en iyi uygulamadır. Aşağıdaki PowerShell betiği, şifrelenmiş gizli dizileri diske aktarmak için Export-CliXml kullanır:

param(
  [Parameter(Mandatory=$true)] 
  [String]$Name,
  [Parameter(Mandatory=$true)]
  [String]$Password)

$credPath = $PSScriptRoot + '\' + $Name + ".credential"
$PWord = ConvertTo-SecureString –String $Password –AsPlainText -Force 
$Credential = New-Object –TypeName `
System.Management.Automation.PSCredential –ArgumentList $Name, $PWord
$Credential | Export-CliXml $credPath

Yukarıdaki betikte 'Ad', gizli anahtarın adıdır(örneğin, '"FB_AppSecret" veya "TwitterSecret"). Betik tarafından oluşturulan ".credential" dosyasını tarayıcınızda görüntüleyebilirsiniz. Aşağıdaki kod parçacığı, kimlik bilgileri dosyalarının her birini test eder ve adlandırılmış web uygulaması için gizli dizileri ayarlar:

Function GetPW_fromCredFile { Param( [String]$CredFile )
  $Credential = GetCredsFromFile $CredFile
  $PW = $Credential.GetNetworkCredential().Password  
  # $user just for debugging.
  $user = $Credential.GetNetworkCredential().username 
  Return $PW
}	
$AppSettings = @{	
  "FB_AppSecret"     = GetPW_fromCredFile "FB_AppSecret.credential";
  "GoogClientSecret" = GetPW_fromCredFile "GoogClientSecret.credential";
  "TwitterSecret"    = GetPW_fromCredFile "TwitterSecret.credential";
}
Set-AzureWebsite -Name $WebSiteName -AppSettings $AppSettings

Uyarı

Güvenlik - PowerShell betiğine parolalar veya başka gizli diziler eklemeyin; bunu yaptığınızda, hassas verileri dağıtmak için PowerShell betiği kullanmanın amacını alt eder. Get-Credential cmdlet'i parola almak için güvenli bir mekanizma sağlar. Kullanıcı arabirimi istemi kullanmak parolanın sızmasını engelleyebilir.

VERITABANı bağlantı dizelerini dağıtma

VERITABANı bağlantı dizeleri uygulama ayarlarına benzer şekilde işlenir. Web uygulamanızı Visual Studio'dan dağıtırsanız, bağlantı dizesi sizin için yapılandırılır. Bunu portalda doğrulayabilirsiniz. bağlantı dizesi ayarlamanın önerilen yolu PowerShell'dir.

PHP notları

Hem uygulama ayarları hem de bağlantı dizeleri için anahtar-değer çiftleri Azure App Service ortam değişkenlerinde depolandığından, herhangi bir web uygulaması çerçevesini (PHP gibi) kullanan geliştiriciler bu değerleri kolayca alabilir. Uygulama ayarlarını ve bağlantı dizelerini okumak için php kod parçacığını gösteren Stefan Schackow'ın Windows Azure Web Siteleri: Uygulama Dizeleri ve Bağlantı Dizeleri Nasıl Çalışır blog gönderisine bakın.

Şirket içi sunucular için notlar

Şirket içi web sunucularına dağıtıyorsanız, yapılandırma dosyalarının yapılandırma bölümlerini şifreleyerek gizli dizilerin güvenliğini sağlamaya yardımcı olabilirsiniz. Alternatif olarak, Azure Web Siteleri için önerilen yaklaşımın aynısını kullanabilirsiniz: geliştirme ayarlarını yapılandırma dosyalarında tutun ve üretim ayarları için ortam değişkeni değerlerini kullanın. Ancak bu durumda, Azure Web Siteleri'nde otomatik olan işlevler için uygulama kodu yazmanız gerekir: ortam değişkenlerinden ayarları alın ve yapılandırma dosyası ayarları yerine bu değerleri kullanın veya ortam değişkenleri bulunamadığında yapılandırma dosyası ayarlarını kullanın.

Ek Kaynaklar

Bkz. Stefan Schackow'un Windows Azure Web Siteleri: Uygulama Dizeleri ve Bağlantı Dizeleri Nasıl Çalışır?

İnceleme için Barry Dorrans ( @blowdart ) ve Carlos Farre'ye özel teşekkürler.