Bicep kullanarak gizli dizileri yönetme

Dağıtımlar genellikle gizli dizilerin Azure ortamınızda güvenli bir şekilde depolanmasını ve yayılmasını gerektirir. Bicep ve Azure, dağıtımlarınızdaki gizli dizileri yönetmenize yardımcı olacak birçok özellik sağlar.

Kullanabileceğiniz yerlerde gizli dizilerden kaçının

Çoğu durumda, gizli dizileri kullanmaktan kaçınmak mümkündür. Birçok Azure kaynağı, kimlik bilgilerini işlemenize veya yönetmenize gerek kalmadan azure içindeki diğer kaynaklara erişme yetkisine sahip olmalarını ve kimlik doğrulamalarını sağlayan yönetilen kimlikleri destekler. Ayrıca, bazı Azure hizmetleri sizin için otomatik olarak HTTPS sertifikaları oluşturabilir ve sertifikaları ve özel anahtarları işlemenizi önler. Mümkün olduğunca yönetilen kimlikleri ve hizmet tarafından yönetilen sertifikaları kullanın.

Güvenli parametreleri kullanma

Bicep dağıtımlarınıza parametre olarak gizli diziler sağlamanız gerektiğinde dekoratör'ünüzü @secure()kullanın. Bir parametreyi güvenli olarak işaretlediğinizde, Azure Resource Manager değeri günlüğe kaydetmekten veya Azure portalında, Azure CLI'da veya Azure PowerShell'de görüntülemekten kaçınıyor.

Gizli diziler için çıkışlardan kaçının

Güvenli veriler için Bicep çıkışlarını kullanmayın. Çıkışlar dağıtım geçmişine kaydedilir ve dağıtıma erişimi olan herkes bir dağıtımın çıkışlarının değerlerini görüntüleyebilir.

Bicep dağıtımında bir gizli dizi oluşturmanız ve bunu çağıranın veya diğer kaynakların kullanımına sunabilmeniz gerekiyorsa, aşağıdaki yaklaşımlardan birini kullanmayı göz önünde bulundurun.

Gizli dizileri dinamik olarak arama

Bazen, başka bir kaynağı yapılandırmak için bir kaynaktan gizli diziye erişmeniz gerekir.

Örneğin, başka bir dağıtımda bir depolama hesabı oluşturmuş olabilirsiniz ve bir Azure İşlevleri uygulaması yapılandırmak için birincil anahtarına erişmeniz gerekebilir. Anahtar sözcüğünü existing kullanarak önceden oluşturulmuş depolama hesabına kesin olarak yazılan bir başvuru elde edebilir ve ardından depolama hesabının listKeys() yöntemini kullanarak birincil anahtarla bir bağlantı dizesi oluşturabilirsiniz:

Aşağıdaki örnek, daha büyük bir örneğin parçasıdır. Dağıtabileceğiniz bir Bicep dosyası için dosyanın tamamına bakın.

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

Bu yaklaşımı kullanarak, gizli dizileri Bicep dosyanıza veya dosyanızın dışına geçirmekten kaçınmış olursunuz.

Gizli dizileri bir anahtar kasasında depolamak için de bu yaklaşımı kullanabilirsiniz.

Key Vault kullanma

Azure Key Vault , güvenli verileri depolamak ve yönetmek için tasarlanmıştır. Gizli dizilerinizi, sertifikalarınızı, anahtarlarınızı ve korunması ve paylaşılması gereken diğer verileri yönetmek için bir anahtar kasası kullanın.

Bicep'i kullanarak kasalar ve gizli diziler oluşturabilir ve yönetebilirsiniz. türünde Microsoft.KeyVault/vaultsbir kaynak oluşturarak kasalarınızı tanımlayın.

Kasa oluştururken verilerine kimlerin ve nelerin erişebileceğini belirlemeniz gerekir. Kasanın gizli dizilerini bir Bicep dosyasından okumayı planlıyorsanız özelliğini olarak trueayarlayınenabledForTemplateDeployment.

Anahtar kasasına gizli dizi ekleme

Gizli diziler bir alt kaynaktır ve türü Microsoft.KeyVault/vaults/secretskullanılarak oluşturulabilir. Aşağıdaki örnekte kasa ve gizli dizi oluşturma adımları gösterilmektedir:

Aşağıdaki örnek, daha büyük bir örneğin parçasıdır. Dağıtabileceğiniz bir Bicep dosyası için dosyanın tamamına bakın.

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

İpucu

Otomatik dağıtım işlem hatlarını kullandığınızda, dağıtımlarınız için anahtar kasası gizli dizilerinin nasıl önyükleneceğini belirlemek bazen zor olabilir. Örneğin, dış API ile iletişim kurarken kullanmanız için bir API anahtarı sağlandıysa, dağıtımlarınızda kullanılabilmesi için önce gizli dizinin bir kasaya eklenmesi gerekir.

Üçüncü taraflardan gelen gizli dizilerle çalışırken bunları kasanıza el ile eklemeniz gerekebilir ve ardından sonraki tüm kullanımlar için gizli diziye başvurabilirsiniz.

Modüllerle anahtar kasası kullanma

Bicep modüllerini kullandığınızda, işlevini kullanarak getSecret güvenli parametreler sağlayabilirsiniz.

Ve scope anahtar sözcüklerini birlikte kullanarak başka bir kaynak grubunda tanımlanan anahtar kasasına existing da başvurabilirsiniz. Aşağıdaki örnekte, Bicep dosyası Ağ adlı bir kaynak grubuna dağıtılır. Modülün mySecret parametresinin değeri, Gizli Diziler kaynak grubunda bulunan contosonetworkingsecrets adlı bir anahtar kasasında tanımlanır:

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

.bicepparam dosyasında anahtar kasası kullanma

Dosya biçimini kullandığınızda.bicepparam, işlevini kullanarak getSecret parametrelere güvenli değerler sağlayabilirsiniz.

Abonelik kimliğini, kaynak grubu adını ve anahtar kasası adını sağlayarak KeyVault'a başvurun. Gizli dizi adını sağlayarak gizli dizi değerini alabilirsiniz. İsteğe bağlı olarak gizli dizi sürümünü sağlayabilirsiniz. Gizli dizi sürümünü sağlamazsanız en son sürüm kullanılır.

using './main.bicep'

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

İşlem hatlarında gizli dizilerle çalışma

Azure kaynaklarınızı bir işlem hattı kullanarak dağıtırken gizli dizilerinizi uygun şekilde işlemeye dikkat etmeniz gerekir.

  • Gizli dizileri kod deponuzda depolamaktan kaçının. Örneğin, parametre dosyalarına veya işlem hattı tanımı YAML dosyalarınıza gizli dizi eklemeyin.
  • GitHub Actions'da güvenli verileri depolamak için şifrelenmiş gizli dizileri kullanın. Gizli dizilerin yanlışlıkla işlenmesini algılamak için gizli dizi taramasını kullanın.
  • Azure Pipelines'da güvenli verileri depolamak için gizli dizi değişkenlerini kullanın.