Dağıtım sırasında güvenli parametre geçirmek için Azure Key Vault’u kullanma

Güvenli bir değeri (parola gibi) doğrudan şablon veya parametre dosyanıza yerleştirmek yerine, dağıtım sırasında azure Key Vault değerini alabilirsiniz. Parametre dosyanızdaki anahtar kasasına ve gizli diziye başvurarak değeri 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, 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

Şablon 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. 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 diziyi alan bir şablon dağıtıyorsa erişim ilkeleri gerekli değildir. Erişim ilkelerine yalnızca kullanıcının doğrudan gizli dizilerle çalışması gerekiyorsa kullanıcı ekleyin. Dağıtım izinleri bir sonraki bölümde tanımlanmıştır.

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

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 izinlere sahip olursunuz.

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.

  1. Ö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/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 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 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.

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.

Statik Kimlik ile Resource Manager anahtar kasası tümleştirmesi gösteren diyagram.

Öğretici: Resource Manager Şablonu dağıtımında Azure Key Vault tümleştirme 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 başvuru gizli dizileri

Ö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 parametre dosyasında kaynak kimliğini dinamik olarak oluşturamazsınız.

Üst şablonunuza 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.

Anahtar kasası gizli dizisi için dinamik kimlik oluşturmayı gösteren diyagram.

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