Sdílet prostřednictvím


Doporučené postupy nasazení hesel a dalších citlivých dat do ASP.NET a služby Azure App Service

Rick Anderson

Tento kurz ukazuje, jak může kód bezpečně ukládat a přistupovat k zabezpečeným informacím. Nejdůležitějším bodem je, že byste nikdy neměli ukládat hesla nebo jiná citlivá data ve zdrojovém kódu a neměli byste používat produkční tajné kódy ve vývojovém a testovacím režimu.

Ukázkový kód je jednoduchá konzolová aplikace webové úlohy a aplikace ASP.NET MVC, která potřebuje přístup k databázi připojovací řetězec heslem, zabezpečeným klíčům Twilio, Google a SendGrid.

Zmiňují se také místní nastavení a PHP.

Práce s hesly ve vývojovém prostředí

Kurzy často zobrazují citlivá data ve zdrojovém kódu, snad s upozorněním, že byste nikdy neměli citlivá data ukládat do zdrojového kódu. Například můj kurz aplikace ASP.NET MVC 5 se sms a e-mailem 2FA ukazuje v souboruweb.config následující:

</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>

Souborweb.config je zdrojový kód, takže tyto tajné kódy by v takovém souboru nikdy neměly být uložené. Naštěstí má file element atribut, <appSettings> který umožňuje zadat externí soubor, který obsahuje nastavení konfigurace citlivých aplikací. Všechny tajné kódy můžete přesunout do externího souboru, pokud externí soubor není vrácen do zdrojového stromu. Například v následujícím kódu AppSettingsSecrets.config souboru obsahuje všechny tajné kódy aplikace:

</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>

Kód v externím souboru (AppSettingsSecrets.config v této ukázce) je stejný kód, který se nachází v souboruweb.config :

<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>

Modul runtime ASP.NET sloučí obsah externího souboru se značkami v <elementu appSettings> . Pokud zadaný soubor nelze nalézt, modul runtime atribut souboru ignoruje.

Upozornění

Zabezpečení – Nepřidávejte tajné kódy .config soubor do projektu ani ho nekontrolujte ve správě zdrojového kódu. Ve výchozím nastavení sada Visual Studio nastaví Build Action hodnotu na Content, což znamená, že se soubor nasadí. Další informace najdete v tématu Proč se nenasadí všechny soubory ve složce projektu? I když můžete pro tajné kódy .config soubor použít libovolnou příponu, je nejlepší zachovat ji .config, protože konfigurační soubory nejsou obsluhovány službou IIS. Všimněte si také, že souborAppSettingsSecrets.config má oproti souboruweb.config dvě úrovně adresáře, takže je zcela mimo adresář řešení. Když soubor přesunete z adresáře řešení, git add *ho nepřidá do vašeho úložiště.

Práce s připojovacími řetězci ve vývojovém prostředí

Visual Studio vytvoří nové ASP.NET projekty, které používají LocalDB. LocalDB byla vytvořena speciálně pro vývojové prostředí. Nevyžaduje heslo, proto nemusíte dělat nic, abyste zabránili kontrole tajných kódů ve zdrojovém kódu. Některé vývojové týmy používají plné verze SQL Server (nebo jiné dbms), které vyžadují heslo.

Atribut můžete použít configSource k nahrazení celého <connectionStrings> kódu. Na rozdíl od atributu <appSettings>file , který slučuje značky, configSource atribut nahrazuje značky. Následující kód ukazuje configSource atribut v souboruweb.config :

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

Poznámka

Pokud pomocí atributu configSource uvedeného výše přesunete připojovací řetězce do externího souboru a visual studio vytvoří nový web, nebude moct zjistit, že používáte databázi, a při publikování do Azure ze sady Visual Studio nebudete mít možnost nakonfigurovat databázi. Pokud používáte configSource atribut, můžete web a databázi vytvořit a nasadit pomocí PowerShellu nebo můžete web a databázi vytvořit na portálu před publikováním.

Upozornění

Zabezpečení – Na rozdíl od souboruAppSettingsSecrets.config musí být soubor externích připojovacích řetězců ve stejném adresáři jako kořenový souborweb.config , takže budete muset přijmout opatření, abyste ho nezaškrtli do zdrojového úložiště.

Poznámka

Upozornění zabezpečení pro soubor tajných kódů: Osvědčeným postupem je nepoužívat produkční tajné kódy při testování a vývoji. Použití produkčních hesel při testování nebo vývoji tyto tajné kódy nevrací.

Konzolové aplikace WebJobs

Souborapp.config používaný konzolovou aplikací nepodporuje relativní cesty, ale podporuje absolutní cesty. K přesunutí tajných kódů z adresáře projektu můžete použít absolutní cestu. Následující kód zobrazuje tajné kódy v souboru C:\secrets\AppSettingsSecrets.config a data, která nejsou citlivá v souboruapp.config .

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

Nasazení tajných kódů do Azure

Když nasadíte webovou aplikaci do Azure, souborAppSettingsSecrets.config se nenasadí (to je to, co chcete). Můžete přejít na portál pro správu Azure a nastavit je ručně. Uděláte to takhle:

  1. Přejděte na https://portal.azure.coma přihlaste se pomocí svých přihlašovacích údajů Azure.
  2. Klikněte na Procházet > Web Apps a pak klikněte na název vaší webové aplikace.
  3. Klikněte na Všechna nastavení > Nastavení aplikace.

Nastavení aplikace a hodnoty připojovací řetězec přepíší stejná nastavení v souboruweb.config. V našem příkladu jsme tato nastavení nenasazovali do Azure, ale pokud by tyto klíče byly v souboruweb.config , měla by přednost nastavení zobrazená na portálu.

Osvědčeným postupem je použít pracovní postup DevOps a k automatizaci nastavení těchto hodnot v Azure použít Azure PowerShell (nebo jinou architekturu, jako je Chef nebo Puppet). Následující skript PowerShellu používá Export-CliXml k exportu šifrovaných tajných kódů na disk:

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

Ve výše uvedeném skriptu je Název název tajného klíče, například "FB_AppSecret" nebo "TwitterSecret". Soubor ".credential" vytvořený skriptem můžete zobrazit v prohlížeči. Následující fragment kódu otestuje každý soubor přihlašovacích údajů a nastaví tajné kódy pro pojmenovanou webovou aplikaci:

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

Upozornění

Zabezpečení – Do skriptu PowerShellu nezahrnujte hesla ani jiné tajné kódy. Tím se zmrazí účel nasazení citlivých dat pomocí skriptu PowerShellu. Rutina Get-Credential poskytuje zabezpečený mechanismus pro získání hesla. Použití výzvy uživatelského rozhraní může zabránit úniku hesla.

Nasazení připojovacích řetězců databáze

Připojovací řetězce databáze se zpracovávají podobně jako nastavení aplikace. Pokud nasadíte webovou aplikaci ze sady Visual Studio, nakonfiguruje se za vás připojovací řetězec. Můžete to ověřit na portálu. Doporučeným způsobem nastavení připojovací řetězec je PowerShell.

Poznámky pro PHP

Vzhledem k tomu, že páry klíč-hodnota pro nastavení aplikace a připojovací řetězce jsou uložené v proměnných prostředí na Azure App Service, můžou vývojáři, kteří používají libovolná rozhraní webových aplikací (například PHP), tyto hodnoty snadno načíst. Viz Blogový příspěvek Weby Windows Azure Od Stefana Schackowa : Jak fungují řetězce aplikací a připojovací řetězce , který ukazuje fragment kódu PHP pro čtení nastavení aplikace a připojovacích řetězců.

Poznámky k místním serverům

Pokud nasazujete na místní webové servery, můžete pomoct zabezpečit tajné kódy šifrováním konfiguračních souborů. Alternativně můžete použít stejný postup, který se doporučuje pro weby Azure: zachovat nastavení vývoje v konfiguračních souborech a použít hodnoty proměnných prostředí pro produkční nastavení. V tomto případě ale musíte napsat kód aplikace pro funkce, které jsou ve službě Azure Websites automatické: načíst nastavení z proměnných prostředí a použít tyto hodnoty místo nastavení konfiguračního souboru nebo použít nastavení konfiguračního souboru, když se proměnné prostředí nenajdou.

Další materiály

Viz Weby Windows Azure od Stefana Schackowa: Jak fungují řetězce aplikací a připojovací řetězce.

Zvláštní poděkování barry Dorrans ( @blowdart ) a Carlos Farre za recenze.