Sdílet prostřednictvím


Správa tajných kódů pomocí Bicep

Nasazení často vyžadují, aby se tajné kódy bezpečně ukládaly a šířily v celém prostředí Azure. Bicep a Azure poskytují mnoho funkcí, které vám pomůžou se správou tajných kódů v nasazeních.

Vyhněte se tajným kódům, kde můžete

V mnohasituacích Mnoho prostředků Azure podporuje spravované identity, které jim umožňují ověřovat a autorizovat přístup k jiným prostředkům v Rámci Azure, aniž byste museli zpracovávat nebo spravovat jakékoli přihlašovací údaje. Některé služby Azure navíc můžou automaticky generovat certifikáty HTTPS, abyste se vyhnuli zpracování certifikátů a privátních klíčů. Pokud je to možné, používejte spravované identity a certifikáty spravované službou.

Použití zabezpečených parametrů

Pokud potřebujete poskytnout tajné kódy pro nasazení Bicep jako parametry, použijte @secure() dekorátor. Když parametr označíte jako zabezpečený, Azure Resource Manager se vyhne protokolování hodnoty nebo jeho zobrazení na webu Azure Portal, Azure CLI nebo Azure PowerShellu.

Vyhněte se výstupům tajných kódů

Nepoužívejte výstupy Bicep pro zabezpečená data. Výstupy se protokolují do historie nasazení a každý, kdo má přístup k nasazení, může zobrazit hodnoty výstupů nasazení.

Pokud potřebujete vygenerovat tajný kód v rámci nasazení Bicep a zpřístupnit ho volajícímu nebo jiným prostředkům, zvažte použití některého z následujících přístupů.

Dynamické vyhledávání tajných kódů

Někdy potřebujete získat přístup k tajnému kódu z jednoho prostředku, abyste mohli nakonfigurovat jiný prostředek.

Mohli jste například vytvořit účet úložiště v jiném nasazení a potřebujete získat přístup k jeho primárnímu klíči pro konfiguraci aplikace Azure Functions. Klíčové slovo můžete použít existing k získání odkazu silného typu na předem vytvořený účet úložiště a pak pomocí metody účtu listKeys() úložiště vytvořit připojovací řetězec s primárním klíčem:

Následující příklad je součástí většího příkladu. Úplný soubor najdete v souboru Bicep, který můžete nasadit.

param location string = resourceGroup().location
param storageAccountName string
param functionAppName string = 'fn-${uniqueString(resourceGroup().id)}'

var appServicePlanName = 'MyPlan'
var applicationInsightsName = 'MyApplicationInsights'

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' existing = {
  name: storageAccountName
}

var storageAccountConnectionString = 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${listKeys(storageAccount.id, storageAccount.apiVersion).keys[0].value}'

resource functionApp 'Microsoft.Web/sites@2023-12-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    httpsOnly: true
    serverFarmId: appServicePlan.id
    siteConfig: {
      appSettings: [
        {
          name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
          value: applicationInsights.properties.InstrumentationKey
        }
        {
          name: 'AzureWebJobsStorage'
          value: storageAccountConnectionString
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~3'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: 'dotnet'
        }
        {
          name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
          value: storageAccountConnectionString
        }
      ]
    }
  }
}

resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: 'Y1' 
    tier: 'Dynamic'
  }
}

resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
  name: applicationInsightsName
  location: location
  kind: 'web'
  properties: { 
    Application_Type: 'web'
    publicNetworkAccessForIngestion: 'Enabled'
    publicNetworkAccessForQuery: 'Enabled'
  }
}

Pomocí tohoto přístupu se vyhnete předávání tajných kódů do souboru Bicep nebo z tohoto souboru.

Tento přístup můžete použít také k ukládání tajných kódů do trezoru klíčů.

Použití služby Key Vault

Služba Azure Key Vault je navržená k ukládání a správě zabezpečených dat. Trezor klíčů můžete použít ke správě tajných kódů, certifikátů, klíčů a dalších dat, která je potřeba chránit a sdílet.

Trezory a tajné kódy můžete vytvářet a spravovat pomocí Bicep. Definujte trezory vytvořením prostředku s typem Microsoft.KeyVault/vaults.

Při vytváření trezoru je potřeba určit, kdo a co má přístup k jeho datům. Pokud máte v úmyslu číst tajné kódy trezoru ze souboru Bicep, nastavte enabledForTemplateDeployment vlastnost na truehodnotu .

Přidání tajných kódů do trezoru klíčů

Tajné kódy jsou podřízeným prostředkem a lze je vytvořit pomocí typu Microsoft.KeyVault/vaults/secrets. Následující příklad ukazuje, jak vytvořit trezor a tajný klíč:

Následující příklad je součástí většího příkladu. Úplný soubor najdete v souboru Bicep, který můžete nasadit.

param location string = resourceGroup().location
param keyVaultName string = 'mykv${uniqueString(resourceGroup().id)}'

resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' = {
  name: keyVaultName
  location: location
  properties: {
    enabledForTemplateDeployment: true
    tenantId: tenant().tenantId
    accessPolicies: [
    ]
    sku: {
      name: 'standard'
      family: 'A'
    }
  }
}

resource keyVaultSecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
  parent: keyVault
  name: 'MySecretName'
  properties: {
    value: 'MyVerySecretValue'
  }
}

Tip

Když používáte kanály automatizovaného nasazení, může být někdy obtížné určit, jak pro vaše nasazení spustit tajné kódy trezoru klíčů. Pokud jste například zadali klíč rozhraní API, který se má použít při komunikaci s externím rozhraním API, je potřeba tajný klíč přidat do trezoru, aby bylo možné ho použít ve vašich nasazeních.

Když pracujete s tajnými kódy, které pocházejí od třetí strany, budete je možná muset do trezoru přidat ručně a pak můžete na tajný kód odkazovat pro všechna další použití.

Použití trezoru klíčů s moduly

Pokud používáte moduly Bicep, můžete pomocí getSecret funkce zadat zabezpečené parametry.

Můžete také odkazovat na trezor klíčů definovaný v jiné skupině prostředků pomocí společně definovaných existing klíčových slov a scope klíčových slov. V následujícím příkladu se soubor Bicep nasadí do skupiny prostředků s názvem Sítě. Hodnota parametru modulu mySecret je definována v trezoru klíčů s názvem contosonetworkingsecrets umístěným ve skupině prostředků Tajné kódy:

resource networkingSecretsKeyVault 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
  scope: resourceGroup('Secrets')
  name: 'contosonetworkingsecrets'
}

module exampleModule 'module.bicep' = {
  name: 'exampleModule'
  params: {
    mySecret: networkingSecretsKeyVault.getSecret('mySecret')
  }
}

Použití trezoru klíčů v souboru .bicepparam

Při použití .bicepparam formátu souboru můžete pomocí funkce zadat zabezpečené hodnoty parametrůmgetSecret.

Na službu KeyVault se odkazuje zadáním ID předplatného, názvu skupiny prostředků a názvu trezoru klíčů. Hodnotu tajného kódu můžete získat zadáním názvu tajného kódu. Volitelně můžete zadat verzi tajného kódu. Pokud verzi tajného kódu nezadáte, použije se nejnovější verze.

using './main.bicep'

param secureUserName = az.getSecret('<subscriptionId>', '<resourceGroupName>', '<keyVaultName>', '<secretName>', '<secretVersion>')
param securePassword = az.getSecret('<subscriptionId>', '<resourceGroupName>', '<keyVaultName>', '<secretName>')

Práce s tajnými kódy v kanálech

Když nasadíte prostředky Azure pomocí kanálu, musíte se postarat o správné zpracování tajných kódů.

  • Vyhněte se ukládání tajných kódů do úložiště kódu. Například nepřidávejte tajné kódy do souborů parametrů ani do souborů YAML definice kanálu.
  • V GitHub Actions používejte šifrované tajné kódy k ukládání zabezpečených dat. K detekci náhodných potvrzení tajných kódů použijte kontrolu tajných kódů.
  • V Azure Pipelines používejte tajné proměnné k ukládání zabezpečených dat.