Gunakan Azure Key Vault untuk melewati nilai parameter keamanan selama penyebaran

Alih-alih menempatkan nilai aman (seperti kata sandi) langsung di file template atau parameter Anda, Anda dapat mengambil nilai dari Azure Key Vault selama penyebaran. Anda mengambil nilai dengan mereferensikan key vault dan rahasia dalam file parameter Anda. Nilai tidak pernah terekspos karena Anda hanya mereferensikan ID key vault.

Penting

Artikel ini berfokus pada cara meneruskan nilai sensitif sebagai parameter templat. Saat rahasia diteruskan sebagai parameter, brankas kunci bisa ada di langganan yang berbeda dari grup sumber daya tempat Anda menyebarkan.

Artikel ini tidak membahas cara mengatur properti mesin virtual ke URL sertifikat di brankas kunci. Untuk templat quickstart dari skenario itu, lihat Menginstal sertifikat dari Azure Key Vault di Mesin Virtual.

Menyebarkan key vaultdan rahasia

Untuk mengakses key vault selama penyebaran templat, atur enabledForTemplateDeployment pada key vault ke true.

Jika Anda sudah memiliki key vault, pastikan vault tersebut memungkinkan penyebaran templat.

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

Untuk membuat key vault baru dan menambahkan rahasia, gunakan:

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"

Sebagai pemilik key vault, Anda secara otomatis memiliki akses untuk membuat rahasia. Jika Anda perlu membiarkan pengguna lain membuat rahasia, gunakan:

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

Kebijakan akses tidak diperlukan jika pengguna menyebarkan templat yang mengambil rahasia. Tambahkan pengguna ke kebijakan akses hanya jika pengguna perlu bekerja langsung dengan rahasia. Izin penyebaran ditentukan di bagian berikutnya.

Untuk informasi selengkapnya tentang membuat key vault dan menambahkan rahasia, lihat:

Berikan akses penyebaran ke rahasia

Pengguna yang menggunakan templat harus memiliki izin Microsoft.KeyVault/vaults/deploy/action untuk lingkup grup sumber daya dan key vault. Dengan memeriksa akses ini, Azure Resource Manager mencegah pengguna yang tidak disetujui mengakses rahasia dengan meneruskan ID sumber daya untuk brankas kunci. Anda dapat memberikan akses penyebaran kepada pengguna tanpa memberikan akses tulis ke rahasia.

Peran Pemilik dan Kontributor sama-sama memberikan akses ini. Jika Anda membuat key vault, Anda adalah pemiliknya dan memiliki izin.

Untuk pengguna lain, beri Microsoft.KeyVault/vaults/deploy/action izin. Prosedur berikut ini memperlihatkan cara membuat peran dengan izin minimum, dan cara menetapkan pengguna.

  1. Membuat file JSON definisi peran kustom:

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

    Ganti "00000000-0000-0000-0000-000000000000" dengan ID berlangganan.

  2. Buat peran baru menggunakan file JSON:

    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
    

    Sampel menetapkan peran khusus untuk pengguna di tingkat grup sumber daya.

Saat menggunakan key vault dengan template untuk Managed Application, Anda harus memberikan akses ke prinsip layanan Penyedia Sumber Daya Peralatan. Untuk informasi selengkapnya, lihat Akses Rahasia Key Vault saat menggunakan Azure Managed Applications.

Referensi rahasia dengan ID statis

Dengan pendekatan ini, Anda mereferensikan key vault dalam file parameter, bukan template. Gambar berikut menunjukkan bagaimana file parameter mereferensikan rahasia dan meneruskan nilai itu ke templat.

Diagram memperlihatkan integrasi brankas kunci Resource Manager dengan ID Statis.

Tutorial: Mengintegrasikan Azure Key Vault dalam penerapan Templat Manajer Sumber Daya menggunakan metode ini.

Templat berikut ini menggunakan server SQL yang menyertakan kata sandi administrator. Parameter kata sandi diatur ke string aman. Tapi template tidak menentukan dari mana nilai itu berasal.

{
  "$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"
      }
    }
  ]
}

Sekarang, buat file parameter untuk templat sebelumnya. Dalam file parameter, tentukan parameter yang cocok dengan nama parameter dalam template. Untuk nilai parameter, referensikan rahasia dari kubah kunci. Anda merujuk rahasia dengan melewati pengidentifikasi sumber daya key vault dan nama rahasia:

Dalam file parameter berikut, rahasia key vault harus sudah ada, dan Anda memberikan nilai statis untuk ID sumber dayanya.

{
  "$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>"
    }
  }
}

Jika Anda perlu menggunakan versi rahasia selain versi saat ini, sertakan properti secretVersion.

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

Sebarkan templat dan pass dalam file parameter:

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

Referensi rahasia dengan ID dinamis

Bagian sebelumnya menunjukkan cara melewati ID sumber daya statis untuk rahasia key vault dari parameter. Dalam beberapa skenario, Anda perlu mereferensikan rahasia kubah kunci yang bervariasi berdasarkan penyebaran saat ini. Atau Anda mungkin ingin meneruskan nilai parameter ke template daripada membuat parameter referensi dalam file parameter. Solusinya adalah menghasilkan ID sumber daya secara dinamis untuk rahasia key vault dengan menggunakan templat yang ditautkan.

Anda tidak dapat secara dinamis menghasilkan ID sumber daya dalam file parameter karena ekspresi template tidak diizinkan dalam file parameter.

Di templat induk, Anda menambahkan templat berlapis dan meneruskan parameter yang berisi ID sumber daya yang dihasilkan secara dinamis. Gambar berikut menunjukkan bagaimana parameter dalam templat yang ditautkan mereferensikan rahasia.

Diagram yang mengilustrasikan pembuatan ID dinamis untuk rahasia brankas kunci.

Template berikut secara dinamis membuat ID key vault dan meneruskannya sebagai parameter.

{
  "$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')]"
            }
          }
        }
      }
    }
  ]
}

Langkah berikutnya