Az Azure Key Vault használata biztonságos paraméterértékek üzembe helyezéskori átadására

Ahelyett, hogy egy biztonságos értéket (például jelszót) közvetlenül a sablonban vagy a paraméterfájlban ad meg, lekérheti az értéket egy Azure Key Vault során. Az értéket a paraméterfájlban található kulcstartóra és titkos kulcsra való hivatkozás használatával lehet lekérni. Az érték soha nem lesz elérhető, mert csak a kulcstartó-azonosítójára hivatkozik.

Fontos

Ez a cikk arra összpontosít, hogyan lehet bizalmas értéket átadni sablonparaméterként. Ha a titkos kulcs paraméterként van átadva, a kulcstartó létezhet egy másik előfizetésben, mint az erőforráscsoport, amelybe üzembe helyez.

Ez a cikk nem tér ki arra, hogyan állíthat be egy virtuálisgép-tulajdonságot egy tanúsítvány URL-címére egy kulcstartóban. A forgatókönyv gyorsindítási sablonjért lásd: Tanúsítvány telepítése egy virtuális Azure Key Vault gépről.

Kulcstartók és titkos kulcsok üzembe helyezése

A kulcstartó sablontelepítés során való eléréséhez állítsa a kulcstartót a enabledForTemplateDeployment következőre: true .

Ha már rendelkezik kulcstartóval, ellenőrizze, hogy engedélyezi-e a sablonok üzembe helyezését.

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

Új kulcstartó létrehozásához és titkos kulcs hozzáadásához használja a következőt:

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"

A kulcstartó tulajdonosaként automatikusan hozzáférhet a titkos kulcsok létrehozásához. Ha arra van szüksége, hogy egy másik felhasználó titkos okat hozzon létre, használja a következőt:

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

A hozzáférési szabályzatok nem szükségesek, ha a felhasználó egy titkos adatokat lekért sablont helyez üzembe. Csak akkor adjon hozzá felhasználót a hozzáférési szabályzathoz, ha a felhasználónak közvetlenül kell dolgoznia a titkos adatokkal. Az üzembe helyezési engedélyeket a következő szakaszban határozzák meg.

További információ a kulcstartók létrehozásáról és a titkos kulcsok hozzáadásáról:

Üzembe helyezési hozzáférés megadása a titkos kulcsokhoz

A sablont üzembe helyező felhasználónak engedéllyel kell rendelkeznie az erőforráscsoport és a Microsoft.KeyVault/vaults/deploy/action kulcstartó hatóköréhez. A hozzáférés ellenőrzés Azure Resource Manager megakadályozza, hogy egy jóvá nem hagyott felhasználó hozzáférjen a titkos kódhoz a kulcstartó erőforrás-azonosítójának átadása által. Üzembe helyezési hozzáférést adhat a felhasználóknak anélkül, hogy írási hozzáférést adna a titkos kulcsokhoz.

A Tulajdonos és a Közreműködő szerepkör is megadja ezt a hozzáférést. Ha Ön hozta létre a kulcstartót, Akkor Ön a tulajdonos, és rendelkezik a megfelelő engedéllyel.

Más felhasználók számára adja meg az Microsoft.KeyVault/vaults/deploy/action engedélyt. Az alábbi eljárás bemutatja, hogyan hozhat létre egy szerepkört a minimális engedélyekkel, és hogyan rendelheti hozzá egy felhasználóhoz.

  1. Hozzon létre egy egyéni szerepkör-definíciós JSON-fájlt:

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

    Cserélje le a "00000000-0000-0000-0000-0000000000" helyére az előfizetés azonosítóját.

  2. Hozza létre az új szerepkört a JSON-fájl használatával:

    az role definition create --role-definition "<path-to-role-file>"
    az role assignment create \
      --role "Key Vault resource manager template deployment operator" \
      --assignee <user-principal-name> \
      --resource-group ExampleGroup
    

    A minták az egyéni szerepkört az erőforráscsoport szintjén rendelik hozzá a felhasználóhoz.

Ha kulcstartót használ egy felügyelt alkalmazás sablonjával, hozzáférést kell adnunk a Berendezés erőforrás-szolgáltató szolgáltatásnévhez. További információ: Access Key Vault secret when deploying Azure Managed Applications.

Titkos kulcsokra való hivatkozás statikus azonosítóval

Ezzel a módszerrel a paraméterfájlban hivatkozik a kulcstartóra, nem a sablonra. Az alábbi ábra bemutatja, hogyan hivatkozik a paraméterfájl a titkos referenciára, és hogyan továbbítja ezt az értéket a sablonnak.

Resource Manager Key Vault-integráció statikus azonosítót ábrázoló diagramja

Oktatóanyag: A Azure Key Vault integrálása Resource Manager Template deployment ezt a módszert használja.

Az alábbi sablon egy rendszergazdai jelszót SQL kiszolgálót helyez üzembe. A jelszóparaméter biztonságos sztringre van állítva. A sablon azonban nem határozza meg, hogy honnan származik ez az érték.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "adminLogin": {
      "type": "string"
    },
    "adminPassword": {
      "type": "securestring"
    },
    "sqlServerName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers",
      "apiVersion": "2015-05-01-preview",
      "name": "[parameters('sqlServerName')]",
      "location": "[resourceGroup().location]",
      "tags": {},
      "properties": {
        "administratorLogin": "[parameters('adminLogin')]",
        "administratorLoginPassword": "[parameters('adminPassword')]",
        "version": "12.0"
      }
    }
  ],
  "outputs": {
  }
}

Most hozzon létre egy paraméterfájlt az előző sablonhoz. A paraméterfájlban adjon meg egy olyan paramétert, amely megegyezik a sablonban található paraméter nevével. A paraméter értékeként hivatkozhat a key vaultban tárolt titkos kulcsra. A titkos kulcsra a kulcstartó erőforrás-azonosítójának és a titkos kulcs nevének átadása alapján hivatkozhat:

A következő paraméterfájlban már léteznie kell a Key Vault titkos kulcsának, és meg kell adnia egy statikus értéket az erőforrás-azonosítóhoz.

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

Ha a jelenlegi verziótól különböző verziót kell használnia a titkos nak, használja a secretVersion tulajdonságot.

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

Telepítse a sablont, és adja át a paraméterfájlt:

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

Titkos kulcsok hivatkozása dinamikus azonosítóval

Az előző szakasz azt mutatta be, hogyan lehet statikus erőforrás-azonosítót átadni a key vault titkos kulcsához a paraméterből. Bizonyos esetekben hivatkozni kell egy key vault titkos kulcsra, amely az aktuális üzemelő példánytól függően változik. Az is előfordulhat, hogy paraméterértékeket szeretne átadni a sablonnak ahelyett, hogy referenciaparamétert hoz létre a paraméterfájlban. A megoldás az, hogy egy csatolt sablon használatával dinamikusan hozza létre a key vault titkos kulcs erőforrás-azonosítóját.

A paraméterfájlban nem hozhat létre dinamikusan erőforrás-azonosítót, mert a paraméterfájlban nem engedélyezettek a sablonkifejezések.

A szülősablonban hozzáadja a beágyazott sablont, és átad egy paramétert, amely tartalmazza a dinamikusan generált erőforrás-azonosítót. Az alábbi ábra bemutatja, hogyan hivatkozik a hivatkozott sablon egyik paramétere a titkosra.

Dinamikus azonosító

Az alábbi sablon dinamikusan hozza létre a kulcstartó azonosítóját, és átadja paraméterként.

{
  "$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": "2018-06-01-preview",
              "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')]"
            }
          }
        }
      }
    }
  ],
  "outputs": {
  }
}

Következő lépések

  • A kulcstartókra vonatkozó általános információkért lásd: Mi a Azure Key Vault?
  • A titkos kulcsokra való hivatkozás teljes példáiért tekintse meg a key vault-példákat a GitHub.
  • A Microsoft Learn kulcstartóból származó biztonságos érték átadásával kapcsolatos további modulért lásd: Összetett felhőalapú üzembe helyezések kezelése speciális ARM-sablonszolgáltatásokkal.