Mengelola rahasia dengan menggunakan Bicep

Penyebaran sering kali memerlukan rahasia untuk disimpan dan disebarkan dengan aman di seluruh lingkungan Azure Anda. Bicep dan Azure menyediakan banyak fitur untuk membantu mengelola rahasia dalam penyebaran Anda.

Hindari rahasia jika Anda bisa

Dalam banyak situasi, Anda dapat menghindari penggunaan rahasia sama sekali. Banyak sumber daya Azure mendukung identitas terkelola, yang memungkinkan mereka untuk mengautentikasi dan diotorisasi untuk mengakses sumber daya lain dalam Azure, tanpa Anda perlu menangani atau mengelola info masuk apa pun. Selain itu, beberapa layanan Azure dapat membuat sertifikat HTTPS untuk Anda secara otomatis, sehingga Anda tidak perlu menangani sertifikat dan kunci privat. Gunakan identitas terkelola dan sertifikat terkelola layanan jika memungkinkan.

Menggunakan parameter aman

Ketika Anda perlu memberikan rahasia untuk penyebaran Bicep Anda sebagai parameter gunakan @secure() dekorator. Ketika Anda menandai parameter sebagai aman, Azure Resource Manager menghindari pengelogan nilai atau menampilkannya di portal Microsoft Azure, Azure CLI, atau Azure PowerShell.

Menghindari output untuk rahasia

Jangan gunakan output Bicep untuk mengamankan data. Output dicatat ke riwayat penyebaran, dan siapa pun yang memiliki akses ke penyebaran dapat melihat nilai output penyebaran.

Jika Anda perlu membuat rahasia dalam penyebaran Bicep dan membuatnya tersedia untuk pemanggil atau sumber daya lain, pertimbangkan untuk menggunakan salah satu pendekatan berikut.

Mencari rahasia secara dinamis

Terkadang, Anda perlu mengakses rahasia dari satu sumber daya untuk mengonfigurasi sumber daya lain.

Misalnya, Anda mungkin telah membuat akun penyimpanan di penyebaran lain, dan perlu mengakses kunci primernya untuk mengonfigurasi aplikasi Azure Functions. Anda dapat menggunakan kata kunci existing untuk mendapatkan referensi yang diketik dengan jelas ke akun penyimpanan yang dibuat sebelumnya, lalu menggunakan metode listKeys() akun penyimpanan untuk membuat string koneksi dengan kunci primer:

Contoh berikut adalah bagian dari contoh yang lebih besar. Untuk file Bicep yang dapat Anda gunakan, lihat file lengkap.

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

Dengan menggunakan pendekatan ini, Anda menghindari melewatkan rahasia ke dalam atau keluar dari file Bicep Anda.

Anda juga dapat menggunakan pendekatan ini untuk menyimpan rahasia di brankas kunci.

Menggunakan Key Vault

Azure Key Vault dirancang untuk menyimpan dan mengelola data yang aman. Gunakan brankas kunci untuk mengelola rahasia, sertifikat, kunci, dan data lain yang perlu dilindungi dan dibagikan.

Anda dapat membuat dan mengelola brankas serta rahasia dengan menggunakan Bicep. Tentukan brankas Anda dengan membuat sumber daya dengan jenis Microsoft.KeyVault/vaults.

Ketika membuat brankas, Anda perlu menentukan siapa dan apa yang dapat mengakses datanya. Jika Anda berencana untuk membaca rahasia brankas dari dalam file Bicep, setel properti enabledForTemplateDeployment ke true.

Menambahkan rahasia ke brankas kunci

Rahasia adalah sumber daya anak dan dapat dibuat dengan menggunakan jenis Microsoft.KeyVault/vaults/secrets. Contoh berikut menunjukkan cara membuat brankas dan rahasia:

Contoh berikut adalah bagian dari contoh yang lebih besar. Untuk file Bicep yang dapat Anda gunakan, lihat file lengkap.

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

Ketika Anda menggunakan alur penyebaran otomatis, terkadang sulit untuk menentukan cara mem-bootstrap rahasia brankas kunci untuk penyebaran Anda. Misalnya, jika Anda telah diberikan kunci API untuk digunakan saat berkomunikasi dengan API eksternal, maka rahasia tersebut perlu ditambahkan ke brankas sebelum dapat digunakan dalam penyebaran Anda.

Ketika bekerja dengan rahasia yang berasal dari pihak ketiga, Anda mungkin perlu menambahkannya secara manual ke brankas, lalu Anda dapat merujuk rahasia tersebut untuk semua penggunaan berikutnya.

Menggunakan brankas kunci dengan modul

Ketika Anda menggunakan modul Bicep, Anda dapat memberikan parameter aman dengan menggunakan getSecret fungsi.

Anda juga dapat mereferensikan brankas kunci yang ditentukan dalam grup sumber daya lain dengan menggunakan kata kunci existing dan scope bersama-sama. Dalam contoh berikut, file Bicep disebarkan ke grup sumber daya bernama Jaringan. Nilai untuk parameter modul mySecret didefinisikan di brankas kunci bernama contosonetworkingsecrets yang terletak di grup sumber daya Rahasia:

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

Menggunakan brankas kunci dalam file .bicepparam

Saat menggunakan .bicepparam format file, Anda dapat memberikan nilai aman ke parameter dengan menggunakan getSecret fungsi .

Referensikan KeyVault dengan memberikan ID langganan, nama grup sumber daya, dan nama brankas kunci. Anda bisa mendapatkan nilai rahasia dengan memberikan nama rahasia. Anda dapat secara opsional memberikan versi rahasia. Jika Anda tidak memberikan versi rahasia, versi terbaru akan digunakan.

using './main.bicep'

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

Bekerja dengan rahasia dalam alur

Ketika menyebarkan sumber daya Azure dengan menggunakan alur, Anda harus berhati-hati untuk menangani rahasia Anda dengan tepat.

  • Hindari menyimpan rahasia dalam repositori kode Anda. Misalnya, jangan tambahkan rahasia ke file parameter, atau ke file YAML definisi alur Anda.
  • Di Tindakan GitHub, gunakan rahasia terenkripsi untuk menyimpan data yang aman. Gunakan pemindaian rahasia untuk mendeteksi setiap penerapan rahasia yang tidak disengaja.
  • Di Azure Pipelines, gunakan variabel rahasia untuk menyimpan data yang aman.