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 değerini alabilirsiniz. Modül değiştiricili secure:true bir string parametre beklediğinde, anahtar kasası gizli dizisi 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, bir 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 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şturma erişiminiz otomatik olarak olur. Gizli dizilerle çalışan kullanıcı anahtar kasasının sahibi değilse, şu şekilde 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 izinlere sahip olursunuz.

Aşağıdaki yordamda en düşük izne sahip 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/00000000-0000-0000-0000-000000000000"
      ]
    }
    

    "00000000-0000-0000-0000-00000000000000" 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 bir 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 gizli dizi Key Vault erişme.

getSecret işlevini kullanma

Anahtar kasası gizli dizisini almak ve değeri bir modülün parametresine geçirmek için stringgetSecret işlevini kullanabilirsiniz. getSecret İşlev yalnızca bir Microsoft.KeyVault/vaults kaynakta çağrılabilir ve yalnızca dekoratörlü parametre ile @secure() kullanılabilir.

Aşağıdaki Bicep dosyası bir Azure SQL sunucusu oluşturur. parametresinin adminPassword bir @secure() dekoratörü vardır.

param sqlServerName string
param adminLogin string

@secure()
param adminPassword string

resource sqlServer 'Microsoft.Sql/servers@2020-11-01-preview' = {
  name: sqlServerName
  location: resourceGroup().location
  properties: {
    administratorLogin: adminLogin
    administratorLoginPassword: adminPassword
    version: '12.0'
  }
}

Önceki Bicep dosyasını, ana Bicep dosyasıyla aynı dizindeki sql.bicep dosya adı verilen bir modül olarak kullanalım.

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-02-01' existing = {
  name: kvName
  scope: resourceGroup(subscriptionId, kvResourceGroup )
}

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

Ayrıca, getSecret bir anahtar kasasından gizli dizi değerini almak için bir .bicepparam dosyada işlev (veya ad alanı niteleyicisi az.getSecretile) kullanılabilir.

using './main.bicep'

param secureUserName = getSecret('exampleSubscription', 'exampleResourceGroup', 'exampleKeyVault', 'exampleSecretUserName', 'exampleSecretVersion')
param securePassword = az.getSecret('exampleSubscription', 'exampleResourceGroup', 'exampleKeyVault', 'exampleSecretPassword')

Parametre dosyasındaki gizli dizilere başvurma

Modül kullanmak istemiyorsanız anahtar kasasına doğrudan parametre dosyasından başvurabilirsiniz. Aşağıdaki görüntüde parametre dosyasının gizli diziye nasıl başvurduğunu ve bu değeri Bicep dosyasına nasıl geçirdiği gösterilmektedir.

anahtar kasası tümleştirme diyagramını Resource Manager

Not

Şu anda anahtar kasasına yalnızca JSON parametre dosyalarında başvurabilirsiniz. Bicep parametreleri dosyasında anahtar kasasına başvuramazsınız.

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 location string = resourceGroup().location
param adminLogin string

@secure()
param adminPassword string

param sqlServerName string

resource sqlServer 'Microsoft.Sql/servers@2022-11-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. Parametreler 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": "exampleadmin"
    },
    "adminPassword": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<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"

Şablonu dağıtın ve parametre dosyasını geçirin:

az group create --name SqlGroup --location westus2
az deployment group create \
  --resource-group SqlGroup \
  --template-file <Bicep-file> \
  --parameters <parameters-file>

Sonraki adımlar