Geheimen beheren met Bicep

Voor implementaties moeten geheimen vaak veilig worden opgeslagen en doorgegeven in uw Azure-omgeving. Bicep en Azure bieden veel functies om u te helpen bij het beheren van geheimen in uw implementaties.

Vermijd geheimen waar mogelijk

In veel situaties is het mogelijk om helemaal geen geheimen 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. Daarnaast kunnen sommige Azure-services automatisch HTTPS-certificaten voor u genereren, zodat u geen certificaten en persoonlijke sleutels hoeft te verwerken. Gebruik waar mogelijk beheerde identiteiten en door de service beheerde certificaten.

Beveiligde parameters gebruiken

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

Uitvoer voor geheimen vermijden

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 aanroeper of voor andere resources, kunt u een van de volgende methoden gebruiken.

Geheimen dynamisch opzoeken

Soms hebt u toegang nodig tot een geheim van de ene resource om een andere resource te configureren.

Mogelijk hebt u bijvoorbeeld een opslagaccount in een andere implementatie gemaakt en moet u toegang krijgen tot de primaire sleutel om een Azure Functions-app te configureren. U kunt het existing trefwoord gebruiken om een sterk getypte verwijzing te verkrijgen naar het vooraf gemaakte opslagaccount en vervolgens de methode van listKeys() het opslagaccount gebruiken om een connection string 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.

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@2021-02-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
        }
      ]
    }
  }
}

Met deze methode voorkomt u dat geheimen in of uit uw Bicep-bestand worden doorgegeven.

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 van plan bent om de geheimen van de kluis te lezen vanuit een Bicep-bestand, 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.

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

resource keyVaultSecret 'Microsoft.KeyVault/vaults/secrets@2019-09-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 om te gebruiken bij de communicatie met een externe API, moet het geheim worden toegevoegd aan een kluis voordat het in uw implementaties kan worden gebruikt.

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

Een sleutelkluis gebruiken met modules

Wanneer u Bicep-modules gebruikt, kunt u beveiligde 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 samen te gebruiken. In het volgende voorbeeld wordt het Bicep-bestand geïmplementeerd in een resourcegroep met de naam Netwerken. 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@2019-09-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 beveiligde waarden opgeven voor parameters met behulp van de getSecret functie.

Verwijst 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 naam van het geheim op te geven. U kunt eventueel 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 manier worden verwerkt.

  • Vermijd het opslaan van geheimen in uw codeopslagplaats. Voeg bijvoorbeeld geen geheimen toe aan parameterbestanden of aan YAML-bestanden van uw pijplijndefinitie.
  • Gebruik in GitHub Actions versleutelde geheimen om beveiligde gegevens op te slaan. Gebruik het scannen van geheimen om onbedoelde doorvoeringen van geheimen te detecteren.
  • Gebruik in Azure Pipelines geheime variabelen om beveiligde gegevens op te slaan.