Delen via


Geheimen beheren met Bicep

Voor implementaties moeten geheimen vaak veilig worden opgeslagen en doorgegeven in uw Azure-omgeving. Bicep en Azure bieden veel functies waarmee u geheimen in uw implementaties kunt beheren.

Vermijd geheimen waar u kunt

In veel situaties is het mogelijk om geheimen helemaal niet te gebruiken. Veel Azure-resources ondersteunen beheerde identiteiten, waardoor ze kunnen worden geverifieerd en gemachtigd voor toegang tot andere resources in Azure, zonder dat u referenties hoeft te verwerken of te beheren. Bovendien kunnen sommige Azure-services HTTPS-certificaten automatisch voor u genereren, zodat u geen certificaten en persoonlijke sleutels verwerkt. Gebruik waar mogelijk beheerde identiteiten en door de service beheerde certificaten.

Veilige parameters gebruiken

Gebruik de @secure() decorator wanneer u geheimen moet opgeven voor uw Bicep-implementaties als parameters. Wanneer u een parameter als veilig markeert, vermijdt Azure Resource Manager het vastleggen van de waarde of het weergeven ervan in Azure Portal, Azure CLI of Azure PowerShell.

Uitvoer voor geheimen voorkomen

Gebruik geen Bicep-uitvoer voor beveiligde gegevens. Uitvoer wordt vastgelegd in de implementatiegeschiedenis en iedereen met toegang tot de implementatie kan de waarden van de uitvoer van een implementatie bekijken.

Als u een geheim wilt genereren binnen een Bicep-implementatie en deze beschikbaar wilt maken voor de beller of voor andere resources, kunt u overwegen een van de volgende methoden te gebruiken.

Geheimen dynamisch opzoeken

Soms moet u toegang krijgen tot een geheim van de ene resource om een andere resource te configureren.

U hebt bijvoorbeeld een opslagaccount in een andere implementatie gemaakt en moet toegang krijgen tot de primaire sleutel om een Azure Functions-app te configureren. U kunt het existing trefwoord gebruiken om een sterk getypte verwijzing naar het vooraf gemaakte opslagaccount te verkrijgen en vervolgens de methode van listKeys() het opslagaccount te gebruiken om een verbindingsreeks te maken met de primaire sleutel:

Het volgende voorbeeld maakt deel uit van een groter voorbeeld. Zie het volledige bestand voor een Bicep-bestand dat u kunt implementeren.

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

Door deze methode te gebruiken, vermijdt u het doorgeven van geheimen aan of uit uw Bicep-bestand.

U kunt deze methode ook gebruiken om geheimen op te slaan in een sleutelkluis.

Key Vault gebruiken

Azure Key Vault is ontworpen voor het opslaan en beheren van beveiligde gegevens. Gebruik een sleutelkluis om uw geheimen, certificaten, sleutels en andere gegevens te beheren die moeten worden beveiligd en gedeeld.

U kunt kluizen en geheimen maken en beheren met Bicep. Definieer uw kluizen door een resource te maken met het type Microsoft.KeyVault/vaults.

Wanneer u een kluis maakt, moet u bepalen wie en wat toegang heeft tot de gegevens. Als u de geheimen van de kluis vanuit een Bicep-bestand wilt lezen, stelt u de enabledForTemplateDeployment eigenschap in op true.

Geheimen toevoegen aan een sleutelkluis

Geheimen zijn een onderliggende resource en kunnen worden gemaakt met behulp van het type Microsoft.KeyVault/vaults/secrets. In het volgende voorbeeld ziet u hoe u een kluis en een geheim maakt:

Het volgende voorbeeld maakt deel uit van een groter voorbeeld. Zie het volledige bestand voor een Bicep-bestand dat u kunt implementeren.

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

Wanneer u geautomatiseerde implementatiepijplijnen gebruikt, kan het soms lastig zijn om te bepalen hoe sleutelkluisgeheimen voor uw implementaties moeten worden opgestart. Als u bijvoorbeeld een API-sleutel hebt gekregen die moet worden gebruikt bij het communiceren met een externe API, moet het geheim worden toegevoegd aan een kluis voordat het kan worden gebruikt in uw implementaties.

Wanneer u werkt met geheimen die afkomstig zijn van een derde partij, moet u deze mogelijk handmatig toevoegen aan uw kluis en vervolgens naar het geheim verwijzen voor alle volgende toepassingen.

Een sleutelkluis gebruiken met modules

Wanneer u Bicep-modules gebruikt, kunt u veilige parameters opgeven met behulp van de getSecret functie.

U kunt ook verwijzen naar een sleutelkluis die is gedefinieerd in een andere resourcegroep door de existing trefwoorden en scope trefwoorden samen te gebruiken. In het volgende voorbeeld wordt het Bicep-bestand geïmplementeerd in een resourcegroep met de naam Networking. De waarde voor de parameter mySecret van de module wordt gedefinieerd in een sleutelkluis met de naam contosonetworkingsecrets in de resourcegroep Geheimen :

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')
  }
}

Een sleutelkluis gebruiken in een BICEPPARAM-bestand

Wanneer u de bestandsindeling gebruikt .bicepparam , kunt u veilige waarden opgeven voor parameters met behulp van de getSecret functie.

Verwijs naar KeyVault door de abonnements-id, de naam van de resourcegroep en de naam van de sleutelkluis op te geven. U kunt de waarde van het geheim ophalen door de geheime naam op te geven. U kunt desgewenst de geheime versie opgeven. Als u de geheime versie niet opgeeft, wordt de meest recente versie gebruikt.

using './main.bicep'

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

Werken met geheimen in pijplijnen

Wanneer u uw Azure-resources implementeert met behulp van een pijplijn, moet u ervoor zorgen dat uw geheimen op de juiste wijze worden afgehandeld.