Dağıtım sırasında güvenli parametre geçirmek için Azure Key Vault’u kullanma
Şablon veya parametre dosyanıza doğrudan güvenli bir değer (parola gibi) yerleştirmek yerine, dağıtım sırasında azure key vault'tan değeri alabilirsiniz. Parametre dosyanızdaki anahtar kasasına ve gizli diziye başvurarak değerini alırsınız. 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
Şablon dağıtımı sırasında anahtar kasasına erişmek için anahtar kasasında olarak true
ayarlayı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. Başka bir kullanıcının gizli dizi oluşturmasına izin vermeniz gerekiyorsa şunu kullanın:
az keyvault set-policy \
--upn <user-principal-name> \
--name ExampleVault \
--secret-permissions set delete get list
Kullanıcı gizli dizi alan bir şablon dağıtıyorsa erişim ilkeleri gerekli değildir. Yalnızca kullanıcının gizli dizilerle doğrudan çalışması gerekiyorsa erişim ilkelerine bir kullanıcı ekleyin. Dağıtım izinleri sonraki bölümde tanımlanmıştır.
Anahtar kasaları oluşturma ve gizli dizi ekleme hakkında daha fazla bilgi için bkz:
- CLI kullanarak gizli dizi ayarlama ve alma
- PowerShell kullanarak gizli dizi ayarlama ve alma
- Portalı kullanarak gizli dizi ayarlama ve alma
- .NET kullanarak gizli dizi ayarlama ve alma
- Node.js kullanarak gizli dizi ayarlama ve alma
Gizli dizilere dağıtım erişimi verme
Şablonu dağıtan kullanıcının kaynak grubu ve anahtar kasası kapsamı için izni olmalıdır Microsoft.KeyVault/vaults/deploy/action
. Azure Resource Manager, bu erişimi denetleyerek onaylanmamış bir kullanıcının anahtar kasasının kaynak kimliğini geçirerek gizli diziye erişmesini engeller. Gizli dizilere yazma erişimi vermeden kullanıcılara dağıtım erişimi vekleyebilirsiniz.
Sahip ve Katkıda Bulunan rolleri bu erişimi verir. Anahtar kasasını oluşturduysanız, sahibi siz olursunuz ve izniniz olur.
Diğer kullanıcılar için izni verin Microsoft.KeyVault/vaults/deploy/action
. Aşağıdaki yordamda, en düşük izne sahip bir rolün nasıl oluşturulacağı ve bir kullanıcıya nasıl atanacağı gösterilmektedir.
Özel rol tanımı JSON dosyası oluşturun:
{ "Name": "Key Vault resource manager template deployment operator", "IsCustom": true, "Description": "Lets you deploy a resource manager template 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.
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 resource manager template deployment operator" \ --scope /subscriptions/<Subscription-id>/resourceGroups/<resource-group-name> \ --assignee <user-principal-name> \ --resource-group ExampleGroup
Örnekler, özel rolü kullanıcıya kaynak grubu düzeyinde atar.
Yönetilen Uygulama şablonuyla 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.
Statik kimlikli gizli dizilere başvurma
Bu yaklaşımla, şablona değil parametre dosyasındaki anahtar kasasına başvurursunuz. Aşağıdaki görüntüde parametre dosyasının gizli diziye nasıl başvurduğunu ve bu değeri şablona nasıl geçirdiği gösterilmektedir.
Öğretici: Azure Key Vault'un Resource Manager Şablonu dağıtımıyla tümleştirilmesi bu yöntemi kullanır.
Aşağıdaki şablon, yönetici parolası içeren bir SQL sunucusu dağıtır. Parola parametresi güvenli bir dizeye ayarlanır. Ancak şablon bu değerin nereden geldiğini belirtmez.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"sqlServerName": {
"type": "string"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
},
"adminLogin": {
"type": "string"
},
"adminPassword": {
"type": "securestring"
}
},
"resources": [
{
"type": "Microsoft.Sql/servers",
"apiVersion": "2021-11-01",
"name": "[parameters('sqlServerName')]",
"location": "[parameters('location')]",
"properties": {
"administratorLogin": "[parameters('adminLogin')]",
"administratorLoginPassword": "[parameters('adminPassword')]",
"version": "12.0"
}
}
]
}
Şimdi, önceki şablon için bir parametre dosyası oluşturun. Parametre dosyasında, şablondaki 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-uri <template-file-URI> \
--parameters <parameter-file>
Dinamik kimlikli gizli dizilere başvurma
Önceki bölümde anahtar kasası gizli dizisi için parametreden statik kaynak kimliğinin nasıl geçirildi olduğu gösterilmiştir. Bazı senaryolarda, geçerli dağıtıma bağlı olarak değişen bir anahtar kasası gizli dizisine başvurmanız gerekir. Veya parametre dosyasında bir başvuru parametresi oluşturmak yerine parametre değerlerini şablona geçirmek isteyebilirsiniz. Çözüm, bağlantılı bir şablon kullanarak anahtar kasası gizli dizisi için kaynak kimliğini dinamik olarak oluşturmaktır.
Parametre dosyasında şablon ifadelerine izin verilmediğinden kaynak kimliğini parametreler dosyasında dinamik olarak oluşturamazsınız.
Üst şablonda, iç içe şablonu ekler ve dinamik olarak oluşturulan kaynak kimliğini içeren bir parametre geçirirsiniz. Aşağıdaki görüntüde, bağlı şablondaki bir parametrenin gizli diziye nasıl başvur olduğu gösterilmektedir.
Aşağıdaki şablon, anahtar kasası kimliğini dinamik olarak oluşturur ve parametre olarak geçirir.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "The location where the resources will be deployed."
}
},
"vaultName": {
"type": "string",
"metadata": {
"description": "The name of the keyvault that contains the secret."
}
},
"secretName": {
"type": "string",
"metadata": {
"description": "The name of the secret."
}
},
"vaultResourceGroupName": {
"type": "string",
"metadata": {
"description": "The name of the resource group that contains the keyvault."
}
},
"vaultSubscription": {
"type": "string",
"defaultValue": "[subscription().subscriptionId]",
"metadata": {
"description": "The name of the subscription that contains the keyvault."
}
}
},
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2020-10-01",
"name": "dynamicSecret",
"properties": {
"mode": "Incremental",
"expressionEvaluationOptions": {
"scope": "inner"
},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"adminLogin": {
"type": "string"
},
"adminPassword": {
"type": "securestring"
},
"location": {
"type": "string"
}
},
"variables": {
"sqlServerName": "[concat('sql-', uniqueString(resourceGroup().id, 'sql'))]"
},
"resources": [
{
"type": "Microsoft.Sql/servers",
"apiVersion": "2021-11-01",
"name": "[variables('sqlServerName')]",
"location": "[parameters('location')]",
"properties": {
"administratorLogin": "[parameters('adminLogin')]",
"administratorLoginPassword": "[parameters('adminPassword')]"
}
}
],
"outputs": {
"sqlFQDN": {
"type": "string",
"value": "[reference(variables('sqlServerName')).fullyQualifiedDomainName]"
}
}
},
"parameters": {
"location": {
"value": "[parameters('location')]"
},
"adminLogin": {
"value": "ghuser"
},
"adminPassword": {
"reference": {
"keyVault": {
"id": "[resourceId(parameters('vaultSubscription'), parameters('vaultResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('vaultName'))]"
},
"secretName": "[parameters('secretName')]"
}
}
}
}
}
]
}
Sonraki adımlar
- Anahtar kasaları hakkında genel bilgi için bkz. Azure Key Vault nedir?
- Anahtar gizli dizilerine başvurmanın tam örnekleri için bkz . GitHub'da anahtar kasası örnekleri .
- Anahtar kasasından güvenli bir değer geçirmeyi kapsayan bir Learn modülü için bkz . Gelişmiş ARM şablonu özelliklerini kullanarak karmaşık bulut dağıtımlarını yönetme.