快速入門:使用 ARM 範本建立 Azure 金鑰保存庫和金鑰

Azure 金鑰保存庫 是一種雲端服務,可為金鑰、密碼和憑證等秘密提供安全存放區。 本快速入門專注於部署 Azure Resource Manager 範本(ARM 範本)的過程,以建立金鑰保存庫和金鑰。

Azure Resource Manager 模板 是一個 JavaScript 物件符號(JSON)檔案,用來定義你專案的基礎架構與設定。 範本使用宣告式語法。 您可以描述預期的部署,而不需要撰寫程式設計命令順序來建立部署。

如果你的環境符合前提條件,且熟悉使用 ARM 範本,請選擇 部署到 Azure 按鈕。 範本會在 Azure 入口網站中開啟。

將 Resource Manager 範本部署至 Azure 的按鈕。

先決條件

以下是完成本文的步驟:

  • 如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。
  • 使用者必須已指派 Azure 內建角色,建議角色 參與者。 在這裡深入了解

檢閱範本

本快速入門中使用的範本是來自 Azure 快速入門範本。

{
  "$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
保存庫名稱 新鑰匙庫的名稱。 在 vault.azure.net 命名空間內必須是全域唯一的。
關鍵字名稱 要在保存庫中建立的金鑰名稱。
位置 資源所在的 Azure 區域。 預設是資源群組的位置。
skuName 保存庫 SKU。 standard (預設)或 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 並開啟範本。 範本會建立一個金鑰庫和一個金鑰。

    將 Resource Manager 範本部署至 Azure 的按鈕。

  2. 選取或輸入下列值。 除非特別指定,否則就用預設值。

    • 訂用帳戶:選取 Azure 訂用帳戶。
    • 資源群組:選取 [新建],輸入資源群組的唯一名稱,然後選取 [確認]。
    • 區域:選擇地點。 例如,美國中部。
    • 保險庫名稱:輸入金鑰保險庫名稱,且必須在命名空間內 vault.azure.net 全域唯一。
    • 金鑰名稱:輸入你存放在金鑰保險庫中的金鑰名稱。
    • 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. 在金鑰保存庫上,將金鑰保存庫密碼編譯主管角色指派給自己:

    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)
    

    Note

    角色指派可能需要一兩分鐘才會生效。

檢閱已部署的資源

您可以使用 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)動作。 內建的「金鑰保存庫 Contributor」角色已足夠,因為它授權所有符合「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 ..."

Note

刪除資源群組也會刪除金鑰庫,但金庫會進入軟刪除狀態,並在保留期間(預設為 90 天)內仍可恢復。 在此期間,該保存庫名稱仍會在全域保留,而且因為已啟用清除保護,所以無法提前清除該保存庫。 對於標準金鑰保存庫,虛刪除的保存庫不會產生費用。 更多資訊請參見 金鑰保存庫 軟刪除概覽。

後續步驟

在本快速入門中,您使用 ARM 範本建立金鑰保存庫和金鑰,並驗證部署。 若要深入瞭解金鑰保存庫和 Azure Resource Manager,請參閱這些文章。