Bicep dağıtımı sırasında güvenli parametre değeri geçirmek için Azure Key Vault kullanma

Güvenli bir değeri (parola gibi) doğrudan Bicep dosyanıza veya parametreler dosyanıza yerleştirmek yerine, dağıtım sırasında Azure Key Vault'tan değeri alabilirsiniz. Modül değiştiricisi olan secure:true bir string parametre beklediğinde, anahtar kasası gizli dizisini almak için getSecret işlevini kullanabilirsiniz. Değer hiçbir zaman gösterilmez çünkü yalnızca anahtar kasası kimliğine başvurursunuz.

Önemli

Bu makalede, hassas bir değeri şablon parametresi olarak geçirme konusuna odaklanmaktadır. Gizli dizi parametre olarak geçirildiğinde, anahtar kasası dağıttığınız kaynak grubundan farklı bir abonelikte bulunabilir.

Bu makalede, sanal makine özelliğinin anahtar kasasında sertifikaNıN URL'sine nasıl ayarlanacağı ele alınmıyor. Bu senaryonun hızlı başlangıç şablonu için bkz . Sanal Makineye Azure Key Vault'tan sertifika yükleme.

Anahtar kasalarını ve gizli dizileri dağıtma

Bicep dağıtımı sırasında bir anahtar kasasına erişmek için anahtar kasasında olarak trueayarlayınenabledForTemplateDeployment.

Zaten bir anahtar kasanız varsa şablon dağıtımlarına izin verdiğinden emin olun.

az keyvault update  --name ExampleVault --enabled-for-template-deployment true

Yeni bir anahtar kasası oluşturmak ve gizli dizi eklemek için şunu kullanın:

az group create --name ExampleGroup --location centralus
az keyvault create \
  --name ExampleVault \
  --resource-group ExampleGroup \
  --location centralus \
  --enabled-for-template-deployment true
az keyvault secret set --vault-name ExampleVault --name "ExamplePassword" --value "hVFkk965BuUv"

Anahtar kasasının sahibi olarak gizli dizi oluşturmaya otomatik olarak erişebilirsiniz. Gizli dizilerle çalışan kullanıcı anahtar kasasının sahibi değilse aşağıdakilerle erişim verin:

az keyvault set-policy \
  --upn <user-principal-name> \
  --name ExampleVault \
  --secret-permissions set delete get list

Anahtar kasaları oluşturma ve gizli dizi ekleme hakkında daha fazla bilgi için bkz:

Gizli dizilere erişim izni verme

Bicep dosyasını dağıtan kullanıcının kaynak grubu ve anahtar kasası kapsamı için izni olmalıdır Microsoft.KeyVault/vaults/deploy/action . Sahip ve Katkıda Bulunan rolleri bu erişimi verir. Anahtar kasasını oluşturduysanız, sahibi siz olursunuz ve izniniz olur.

Aşağıdaki yordamda, en düşük izinle bir rolün nasıl oluşturulacağı ve kullanıcının nasıl atanacağı gösterilmektedir.

  1. Özel rol tanımı JSON dosyası oluşturun:

    {
      "Name": "Key Vault Bicep deployment operator",
      "IsCustom": true,
      "Description": "Lets you deploy a Bicep file with the access to the secrets in the Key Vault.",
      "Actions": [
        "Microsoft.KeyVault/vaults/deploy/action"
      ],
      "NotActions": [],
      "DataActions": [],
      "NotDataActions": [],
      "AssignableScopes": [
        "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
      ]
    }
    

    "00000000-0000-0000-0000-0000000000000000000" değerini abonelik kimliğiyle değiştirin.

  2. JSON dosyasını kullanarak yeni rolü oluşturun:

    az role definition create --role-definition "<path-to-role-file>"
    az role assignment create \
      --role "Key Vault Bicep deployment operator" \
      --scope /subscriptions/<Subscription-id>/resourceGroups/<resource-group-name> \
      --assignee <user-principal-name>
    

    Örnekler, özel rolü kullanıcıya kaynak grubu düzeyinde atar.

Yönetilen Uygulama için Bicep dosyasıyla anahtar kasası kullanırken Alet Kaynak Sağlayıcısı hizmet sorumlusuna erişim vermelisiniz. Daha fazla bilgi için bkz . Azure Yönetilen Uygulamaları dağıtırken Key Vault gizli dizisine erişme.

Bicep dosyasında gizli dizileri alma

Anahtar kasası gizli dizisini almak için Bicep dosyalarında getSecret işlevini kullanabilirsiniz. İşlevin getSecret yalnızca bir Microsoft.KeyVault/vaults kaynak için geçerli olduğunu unutmayın. Ayrıca, modülün params bölümü içindeki kullanımla sınırlıdır ve yalnızca dekoratör ile parametrelerle @secure() kullanılabilir.

anahtar kasası gizli dizilerini almak için Bicep parametre dosyalarında işlev olarak adlandırılan az.getSecret() başka bir işlev kullanılabilir. Daha fazla bilgi için bkz . Parametreler dosyasında gizli dizileri alma.

getSecret çünkü işlevi yalnızca modülün params bölümünde kullanılabilir. Aşağıdaki içeriğe sahip main.bicep dosyasıyla aynı dizinde bir sql.bicep oluşturalım:

param sqlServerName string
param location string = resourceGroup().location
param adminLogin string

@secure()
param adminPassword string

resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: adminLogin
    administratorLoginPassword: adminPassword
    version: '12.0'
  }
}

Yukarıdaki Bicep dosyasında parametresinin adminPassword bir @secure() dekoratöre sahip olduğunu fark edin.

Aşağıdaki Bicep dosyası sql.bicep dosyasını modül olarak kullanır. Bicep dosyası mevcut bir anahtar kasasına getSecret başvurur ve anahtar kasası gizli dizisini almak için işlevini çağırır ve ardından değeri modüle parametre olarak geçirir.

param sqlServerName string
param adminLogin string

param subscriptionId string
param kvResourceGroup string
param kvName string

resource kv 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
  name: kvName
  scope: resourceGroup(subscriptionId, kvResourceGroup )
}

module sql './sql.bicep' = {
  name: 'deploySQL'
  params: {
    sqlServerName: sqlServerName
    adminLogin: adminLogin
    adminPassword: kv.getSecret('vmAdminPassword')
  }
}

Parametreler dosyasında gizli dizileri alma

Modül kullanmak istemiyorsanız, anahtar kasası gizli dizilerini parametre dosyasından alabilirsiniz. Ancak yaklaşım, JSON parametre dosyası mı yoksa Bicep parametre dosyası mı kullandığınıza bağlı olarak değişir.

Aşağıdaki Bicep dosyası, yönetici parolası içeren bir SQL sunucusu dağıtır. Parola parametresi güvenli bir dizeye ayarlanır. Ancak Bicep bu değerin nereden geldiğini belirtmez.

param sqlServerName string
param location string = resourceGroup().location
param adminLogin string

@secure()
param adminPassword string

resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: adminLogin
    administratorLoginPassword: adminPassword
    version: '12.0'
  }
}

Şimdi, önceki Bicep dosyası için bir parametre dosyası oluşturun.

Bicep parametre dosyası

az.getSecret işlevi bir anahtar kasasından gizli .bicepparam dizi değerini almak için bir dosyada kullanılabilir.

using './main.bicep'

param sqlServerName = '<your-server-name>'
param adminLogin = '<your-admin-login>'
param adminPassword = az.getSecret('<subscription-id>', '<rg-name>', '<key-vault-name>', '<secret-name>', '<secret-version>')

JSON parametre dosyası

JSON parametreleri dosyasında, Bicep dosyasındaki parametrenin adıyla eşleşen bir parametre belirtin. Parametre değeri için anahtar kasasından gizli diziye başvurun. Anahtar kasasının kaynak tanımlayıcısını ve gizli dizinin adını geçirerek gizli diziye başvurursunuz:

Aşağıdaki parametre dosyasında anahtar kasası gizli dizisinin zaten mevcut olması gerekir ve kaynak kimliği için statik bir değer sağlarsınız.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "adminLogin": {
      "value": "<your-admin-login>"
    },
    "adminPassword": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<key-vault-name>"
        },
        "secretName": "ExamplePassword"
      }
    },
    "sqlServerName": {
      "value": "<your-server-name>"
    }
  }
}

Gizli dizinin geçerli sürüm dışında bir sürümünü kullanmanız gerekiyorsa özelliğini ekleyin secretVersion .

"secretName": "ExamplePassword",
"secretVersion": "cd91b2b7e10e492ebb870a6ee0591b68"

Sonraki adımlar