快速入门:使用 ARM 模板创建 Azure 密钥保管库和密钥

Azure 密钥保管库 是一项云服务,它为密钥、密码和证书等机密提供了安全的存储。 本快速入门重点介绍部署 Azure 资源管理器模板(ARM 模板)以创建密钥保管库和密钥的过程。

先决条件

若要完成本文,需要做好以下准备:

查看模板

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.42.1.51946",
      "templateHash": "9113739717796369919"
    }
  },
  "parameters": {
    "vaultName": {
      "type": "string",
      "metadata": {
        "description": "The name of the key vault to be created."
      }
    },
    "keyName": {
      "type": "string",
      "metadata": {
        "description": "The name of the key to be created."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "The location of the resources."
      }
    },
    "skuName": {
      "type": "string",
      "defaultValue": "standard",
      "allowedValues": [
        "standard",
        "premium"
      ],
      "metadata": {
        "description": "The SKU of the vault to be created."
      }
    },
    "keyType": {
      "type": "string",
      "defaultValue": "RSA",
      "allowedValues": [
        "EC",
        "EC-HSM",
        "RSA",
        "RSA-HSM"
      ],
      "metadata": {
        "description": "The JsonWebKeyType of the key to be created."
      }
    },
    "keyOps": {
      "type": "array",
      "defaultValue": [],
      "metadata": {
        "description": "The permitted JSON web key operations of the key to be created."
      }
    },
    "keySize": {
      "type": "int",
      "defaultValue": 2048,
      "metadata": {
        "description": "The size in bits of the key to be created."
      }
    },
    "curveName": {
      "type": "string",
      "defaultValue": "",
      "allowedValues": [
        "",
        "P-256",
        "P-256K",
        "P-384",
        "P-521"
      ],
      "metadata": {
        "description": "The JsonWebKeyCurveName of the key to be created."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.KeyVault/vaults",
      "apiVersion": "2023-07-01",
      "name": "[parameters('vaultName')]",
      "location": "[parameters('location')]",
      "properties": {
        "enableRbacAuthorization": true,
        "enableSoftDelete": true,
        "softDeleteRetentionInDays": 90,
        "enablePurgeProtection": true,
        "enabledForDeployment": false,
        "enabledForDiskEncryption": false,
        "enabledForTemplateDeployment": false,
        "tenantId": "[subscription().tenantId]",
        "sku": {
          "name": "[parameters('skuName')]",
          "family": "A"
        },
        "networkAcls": {
          "defaultAction": "Allow",
          "bypass": "AzureServices"
        }
      }
    },
    {
      "type": "Microsoft.KeyVault/vaults/keys",
      "apiVersion": "2023-07-01",
      "name": "[format('{0}/{1}', parameters('vaultName'), parameters('keyName'))]",
      "properties": {
        "kty": "[parameters('keyType')]",
        "keyOps": "[parameters('keyOps')]",
        "keySize": "[parameters('keySize')]",
        "curveName": "[parameters('curveName')]"
      },
      "dependsOn": [
        "[resourceId('Microsoft.KeyVault/vaults', parameters('vaultName'))]"
      ]
    }
  ],
  "outputs": {
    "proxyKey": {
      "type": "object",
      "value": "[reference(resourceId('Microsoft.KeyVault/vaults/keys', parameters('vaultName'), parameters('keyName')), '2023-07-01')]"
    },
    "location": {
      "type": "string",
      "value": "[parameters('location')]"
    },
    "name": {
      "type": "string",
      "value": "[parameters('vaultName')]"
    },
    "resourceGroupName": {
      "type": "string",
      "value": "[resourceGroup().name]"
    },
    "resourceId": {
      "type": "string",
      "value": "[resourceId('Microsoft.KeyVault/vaults', parameters('vaultName'))]"
    }
  }
}

该模板中定义了以下两个资源:

该模板创建启用了 Azure RBAC 授权的密钥保管库。 这意味着保管库使用Azure基于角色的访问控制(Azure RBAC)进行数据平面授权,而不是访问策略。

可以在 Azure 快速入门模板中找到更多 Azure 密钥保管库 模板示例。

模板参数

参数 Description
vaultName 新密钥保管库的名称。 在 vault.azure.cn 命名空间内必须全局唯一。
keyName 在保管库中创建的密钥的名称。
位置 资源的 Azure 区域。 默认为资源组所在位置。
skuName 保管库 SKU。 standard (default) 或 premium.
keyType 要创建的密钥类型。 RSA, RSA-HSM, EC, EC-HSM之一。 默认值为 RSA。 请参阅 JsonWebKeyType
keySize 密钥大小(以比特为单位,仅适用于 RSA)。 默认值为 2048
curveName 椭圆曲线名称(仅限 EC 密钥)。 P-256, P-256K, P-384, P-521之一。 请参阅 JsonWebKeyCurveName
keyOps 该密钥允许的 JSON Web Key 操作(例如 ["sign","verify","encrypt","decrypt","wrapKey","unwrapKey"])。 空数组(默认值)允许所有操作。

部署模板

  1. 选择下图以登录到Azure并打开模板。 该模板创建密钥保管库和密钥。

    按钮用于将资源管理器模板部署到 Azure。

  2. 选择或输入以下值。 除非指定了默认值,否则请使用默认值。

    • Subscription:选择Azure订阅。
    • 资源组:选择“新建”,为资源组输入一个独一无二的名称,然后选择“确定”。
    • 区域:选择一个位置。 例如,中国北部
    • 保管库名称:输入密钥保管库的名称,该名称在命名空间中 vault.azure.cn 必须全局唯一。
    • 密钥名称:输入密钥保管库中存储的密钥的名称。
    • Sku 名称:选择 标准高级。 默认值为 标准
    • 键类型:选择键类型。 默认值为 RSA
    • 密钥大小:输入密钥大小(RSA 密钥)。 默认值为 2048
    • 曲线名称:对于 EC 键,请选择曲线。 为 RSA 密钥留空。
  3. 选择查看 + 创建,然后选择创建。 成功部署密钥保管库和密钥后,会收到通知。

还可以使用Azure PowerShell、Azure CLI或 REST API 部署模板。 若要了解其他部署方法,请参阅部署模板

分配 密钥保管库 RBAC 角色

此模板创建的密钥保管库使用 Azure RBAC 进行授权。 若要通过数据平面访问密钥(例如,使用Azure CLI或Azure PowerShell),需要为自己分配适当的角色。

  1. 获取 Microsoft Entra 用户对象 ID:

    az ad signed-in-user show --query id -o tsv
    
  2. 在密钥保管库上为自己分配 密钥保管库 Crypto Officer 角色:

    echo "Enter your key vault name:" &&
    read keyVaultName &&
    az role assignment create --role "Key Vault Crypto Officer" \
        --assignee-object-id $(az ad signed-in-user show --query id -o tsv) \
        --scope $(az keyvault show --name $keyVaultName --query id -o tsv)
    

    注释

    角色分配可能需要一两分钟才能生效。

查看已部署的资源

可以使用 Azure 门户检查密钥保管库和密钥。 或者,使用以下 Azure CLI 或 Azure PowerShell 脚本列出创建的密钥。

echo "Enter your key vault name:" &&
read keyVaultName &&
az keyvault key list --vault-name $keyVaultName &&
echo "Press [ENTER] to continue ..."

通过 ARM 模板创建密钥不同于通过数据平面创建密钥

通过 ARM 创建密钥

  • 只能创建新密钥。 不能更新现有密钥,也不能创建新版现有密钥。 如果该密钥已存在,则从存储中检索并使用现有密钥(不会执行任何写入操作)。

  • 若要获得使用此 API 的授权,调用方需要具有 “Microsoft.KeyVault/vaults/keys/write” 基于角色的访问控制(Azure RBAC)操作。 内置的“密钥保管库 参与者”角色已足够,因为它授权与模式“Microsoft.KeyVault/*”匹配的所有 Azure RBAC作。

    通过 ARM 1 创建密钥 通过 ARM 2 创建密钥

现有 API(通过数据平面创建密钥)

  • 可以创建新密钥、更新现有密钥,以及创建新版现有密钥。
  • 调用方必须有权使用此 API。 如果该保管库已启用 Azure RBAC,则调用方必须具有“Microsoft.KeyVault/vaults/keys/create/action”Azure RBAC DataAction。

清理资源

其他 密钥保管库 快速入门与教程,都是以此快速入门为基础开发的。 如果打算继续使用后续的快速入门和教程,则可能需要保留这些资源。 如果不再需要资源组,可以将其删除,这将删除 密钥保管库 和相关的资源。 使用 Azure CLI 或 Azure PowerShell 删除资源组:

echo "Enter the Resource Group name:" &&
read resourceGroupName &&
az group delete --name $resourceGroupName &&
echo "Press [ENTER] to continue ..."

后续步骤

在本快速入门中,你使用 ARM 模板创建了密钥保管库和密钥,并验证了部署。 若要详细了解 密钥保管库 和 Azure 资源管理器,请参阅以下文章。