教程:使用 Key Vault 密钥将数据加密到媒体服务帐户

媒体服务徽标 v3


警告

Azure 媒体服务将于 2024 年 6 月 30 日停用。 有关详细信息,请参阅 AMS 停用指南

注意

托管标识仅适用于使用 v3 API 创建的媒体服务帐户。 如果使用 v2 API 并想要使用托管标识,请从 v2 迁移到 v3 从媒体服务 v2 迁移到 v3 简介

如果希望媒体服务使用 Key Vault 中的密钥加密数据,则必须向媒体服务帐户授予 访问 Key Vault 的权限。 按照以下步骤为媒体服务帐户创建托管标识,并使用媒体服务 CLI 授予此标识对 Key Vault 的访问权限。

媒体服务帐户将 Key Vault 与托管标识

本教程使用 2020-05-01 媒体服务 API。

登录到 Azure

若要使用本文中的任何命令,首先必须登录到要使用的订阅。

登录到 Azure。 使用此命令时,系统会提示你输入要使用的订阅。

az login

设置订阅

使用此命令设置要使用的订阅。

使用 CLI 设置 Azure 订阅

在以下命令中,提供要用于媒体服务帐户的 Azure 订阅 ID。

az account set --subscription <subscriptionName>

资源名称

在开始之前,请确定要创建的资源的名称。 它们应易于识别为一组,尤其是在完成测试后不打算使用它们时。 许多资源类型的命名规则不同,因此最好坚持所有小写。 例如,资源组名称的“mediatest1rg”和存储帐户名称的“mediatest1stor”。 对本文中的每个步骤使用相同的名称。

你将看到以下命令中引用的这些名称。 需要的资源名称如下:

  • myRG
  • myStorageAccount
  • myAmsAccount
  • myKeyVault
  • myKey
  • 位置

注意

上述连字符仅用于分隔指导词。 由于 Azure 服务中命名资源的不一致,因此在命名资源时不要使用连字符。 此外,不会创建区域名称。 区域名称由 Azure 确定。

列出 Azure 区域

如果不确定要使用的实际区域名称,请使用此命令获取列表:

使用此命令列出帐户可用的区域。

az account list-locations --query "[].{DisplayName:displayName, Name:name}" -o table

序列

下面的每个步骤都按特定顺序完成,因为序列的下一步使用了 JSON 响应中的一个或多个值。

创建存储帐户

要创建的媒体服务帐户必须具有与之关联的存储帐户。 首先为媒体服务帐户创建存储帐户。 将 your-storage-account-name 用于后续步骤。

使用 CLI 创建 Azure 存储帐户

使用以下命令创建 Azure 存储帐户。

若要创建存储帐户,必须先在某个位置中创建资源组。

若要列出可用位置,请使用以下命令:

使用 CLI 列出可用位置

若要列出可用位置,请使用以下命令:

az account list-locations

使用 CLI 创建资源组

若要创建资源组,请使用以下命令:

az group create -n <resourceGroupName> --location chooseLocation

选择 SKU

还需要为存储帐户选择 SKU。 可以列出存储帐户。

从以下列表中选择 SKU:Standard_LRS、Standard_GRS、Standard_RAGRS、Standard_ZRS、Premium_LRS、Premium_ZRS、Standard_GZRS、Standard_RAGZRS。

  • myStorageAccount 更改为长度少于 24 个字符的唯一名称。
  • chooseLocation 更改为要在其中工作的区域。
  • chooseSKU 更改为首选 SKU。
az storage account create -n <myStorageAccount> -g <resourceGroup>  --location <chooseLocation> --sku <chooseSKU>

使用服务主体(托管标识)创建媒体服务帐户

现在,使用服务主体创建媒体服务帐户,否则称为托管标识。

重要

请务必记住在命令中使用 --mi 标志。 否则,将无法找到后续步骤的 principalId

以下 Azure CLI 命令创建新的媒体服务帐户。 将以下值替换为:your-media-services-account-nameyour-storage-account-name,并将 your-resource-group-name 替换为要使用的名称。 该命令假定已创建资源组和存储帐户。

它为媒体服务帐户提供具有 --mi-system-assigned 标志的系统分配的托管标识。


az ams account create --name <your-media-services-account-name> --resource-group <your-resource-group-name> --mi-system-assigned --storage-account <your-storage-account-name>

示例 JSON 响应:

{
  "encryption": {
    "keyVaultProperties": null,
    "type": "SystemKey"
  },
  "id": "/subscriptions/00000000-0000-0000-0000-00000000/resourceGroups/your-resource-group/providers/Microsoft.Media/mediaservices/your-media-services-account-name",
  "identity": {
    "principalId": "00000000-0000-0000-0000-00000000",
    "tenantId": "00000000-0000-0000-0000-00000000",
    "type": "SystemAssigned"
  },
  "location": "your-region",
  "mediaServiceId": "00000000-0000-0000-0000-00000000",
  "name": "your-media-services-account-name",
  "resourceGroup": "your-resource-group",
  "storageAccounts": [
    {
      "id": "/subscriptions/00000000-0000-0000-0000-00000000/resourceGroups/mediatest1rg/providers/Microsoft.Storage/storageAccounts/your-storage-account-name",
      "resourceGroup": "your-resource-group",
      "type": "Primary"
    }
  ],
  "storageAuthentication": "System",
  "systemData": {
    "createdAt": "2021-05-14T21:25:12.3492071Z",
    "createdBy": "you@example.com",
    "createdByType": "User",
    "lastModifiedAt": "2021-05-14T21:25:12.3492071Z",
    "lastModifiedBy": "you@example.com",
    "lastModifiedByType": "User"
  },
  "tags": null,
  "type": "Microsoft.Media/mediaservices"
}

创建 Key Vault

创建 Key Vault。 Key Vault 用于加密媒体数据。 你将使用 your-keyvault-name 创建密钥和后续步骤。

使用以下命令创建 Key Vault 和密钥。 将 your-resource-group-nameyour-keyvault-nameyour-key-name 更改为要使用的值。 该命令假定已创建资源组。

注意

--bypass AzureServices 允许媒体服务(和其他 Azure 服务)在密钥保管库网络 ACL 通常阻止该访问时访问 Key Vault。如果未设置,--enable-purge-protection 将无法使用密钥。

创建 Key Vault


az keyvault create --resource-group <your-resource-group-name> --bypass AzureServices --enable-purge-protection --name <your-keyvault-name>

示例 JSON 响应:

{
  "id": "/subscriptions/the-subscription-id/resourceGroups/your-resource-group-name/providers/Microsoft.KeyVault/vaults/your-keyvault-name",
  "location": "your-region",
  "name": "your-keyvault-name",
  "properties": {
    "accessPolicies": [
      {
        "applicationId": null,
        "objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
        "permissions": {
          "certificates": [
            "get",
            "list",
            "delete",
            "create",
            "import",
            "update",
            "managecontacts",
            "getissuers",
            "listissuers",
            "setissuers",
            "deleteissuers",
            "manageissuers",
            "recover"
          ],
          "keys": [
            "get",
            "create",
            "delete",
            "list",
            "update",
            "import",
            "backup",
            "restore",
            "recover"
          ],
          "secrets": [
            "get",
            "list",
            "set",
            "delete",
            "backup",
            "restore",
            "recover"
          ],
          "storage": [
            "get",
            "list",
            "delete",
            "set",
            "update",
            "regeneratekey",
            "setsas",
            "listsas",
            "getsas",
            "deletesas"
          ]
        },
        "tenantId": "the-tenant-id"
      }
    ],
    "createMode": null,
    "enablePurgeProtection": true,
    "enableRbacAuthorization": null,
    "enableSoftDelete": true,
    "enabledForDeployment": false,
    "enabledForDiskEncryption": null,
    "enabledForTemplateDeployment": null,
    "networkAcls": null,
    "privateEndpointConnections": null,
    "provisioningState": "Succeeded",
    "sku": {
      "name": "standard"
    },
    "softDeleteRetentionInDays": 90,
    "tenantId": "the-tenant-id",
    "vaultUri": "https://your-keyvault-name.vault.azure.net/"
  },
  "resourceGroup": "your-resource-group-name",
  "tags": {},
  "type": "Microsoft.KeyVault/vaults"
}

创建密钥

az keyvault key create --kty RSA --name your-key-name --vault-name your-keyvault-name

示例 JSON 响应:


{
  "attributes": {
    "created": "2021-05-12T22:41:29+00:00",
    "enabled": true,
    "expires": null,
    "notBefore": null,
    "recoveryLevel": "Recoverable",
    "updated": "2021-05-12T22:41:29+00:00"
  },
  "key": {
    "crv": null,
    "d": null,
    "dp": null,
    "dq": null,
    "e": "AQAB",
    "k": null,
    "keyOps": [
      "encrypt",
      "decrypt",
      "sign",
      "verify",
      "wrapKey",
      "unwrapKey"
    ],
    "kid": "https://your-keyvault-name.vault.azure.net/keys/your-key-name/your-subsription-id",
    "kty": "RSA",
    "n": "THISISTHEKEY51V9thvU7KsBUo/q1mEOcuxqt0qUcnx0IRO9YCL32fPjD/nnS8hKS5qkgUKfe2NRAtzVQ+elQAha65l7OsHu+TXmH/n/RPCgstpqSdCfiUR1JTmFYFRWdxCPwoKJMYaqlCEhn2Dkon3StTN0Id0sjRSA/YOLjgWU7YnVbntg5/048HgcTKn3PCWCuJc+P8hI/8Os5EAIpun62PffYwPX0/NIA1PY8wIB+sYEY0zxVGwWrCu7VgCo9xeqbMQEq5OenYmYpc+cjLozU/ohGhfWTpQU8d7fFypTHQraENDOFKEY",
    "p": null,
    "q": null,
    "qi": null,
    "t": null,
    "x": null,
    "y": null
  },
  "managed": null,
  "tags": null
}

向媒体服务系统分配的托管标识授予对 Key Vault 的访问权限

授予媒体服务托管标识对 Key Vault 的访问权限。 有两个命令:

获取(显示)媒体服务帐户的托管标识

下面的第一个命令显示了媒体服务帐户的托管标识,该帐户是命令返回的 JSON 中列出的 principalId

此命令显示媒体服务帐户的所有属性。

az ams account show --name <your-media-services-account-name> --resource-group <your-resource-group>

注意

如果已将访问角色分配给媒体服务帐户,此行将返回 "storageAuthentication": "ManagedIdentity"

示例 JSON 响应:

{
  "encryption": {
    "keyVaultProperties": null,
    "type": "SystemKey"
  },
  "id": "/subscriptions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/resourceGroups/your-resource-group-name/providers/Microsoft.Media/mediaservices/your-media-services-account",
  "identity": {
    "principalId": "ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "type": "SystemAssigned"  //Type will show "Managed Identity" if you have assigned a role to the Media Services account.
  },
  "location": "your-region",
  "mediaServiceId": "00000000-0000-0000-0000-000000000000",
  "name": "your-media-services-account",
  "resourceGroup": "your-resource-group-name",
  "storageAccounts": [
    {
      "id": "/subscriptions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/resourceGroups/your-resource-group-name/providers/Microsoft.Storage/storageAccounts/your-storage-account-name",
      "resourceGroup": "your-resource-group-name",
      "type": "Primary"
    }
  ],
  "storageAuthentication": "System", //If you have assigned access roles to the account, this line will return storageAuthentication": "ManagedIdentity"
  "systemData": {
    "createdAt": "2021-05-14T21:25:12.3492071Z",
    "createdBy": "you@example.com",
    "createdByType": "User",
    "lastModifiedAt": "2021-05-14T21:25:12.3492071Z",
    "lastModifiedBy": "you@example.com",
    "lastModifiedByType": "User"
  },
  "tags": null,
  "type": "Microsoft.Media/mediaservices"
}

设置 Key Vault 策略

第二个命令授予对 Key Vault 的主体 ID 访问权限。 将 object-id 设置为上一步中获取 principalId 的值。

若要使用此命令,必须将媒体服务 principalId 作为 object-id。 如果尚未使用,请使用 az ams account show --name <your-media-services-account-name> --resource-group <your-resource-group> 获取此 ID。

az keyvault set-policy --name <your-keyvault-name> --object-id <principalId> --key-permissions decrypt encrypt get list unwrapKey wrapKey

示例 JSON 响应:

{
  "id": "/subscriptions/00000000-0000-0000-000000000000/resourceGroups/your-resource-group-name/providers/Microsoft.KeyVault/vaults/your-keyvault-name",
  "location": "your-region",
  "name": "your-keyvault-name",
  "properties": {
    "accessPolicies": [
      {
        "applicationId": null,
        "objectId": "00000000-0000-0000-000000000000",
        "permissions": {
          "certificates": [
            "get",
            "list",
            "delete",
            "create",
            "import",
            "update",
            "managecontacts",
            "getissuers",
            "listissuers",
            "setissuers",
            "deleteissuers",
            "manageissuers",
            "recover"
          ],
          "keys": [
            "get",
            "create",
            "delete",
            "list",
            "update",
            "import",
            "backup",
            "restore",
            "recover"
          ],
          "secrets": [
            "get",
            "list",
            "set",
            "delete",
            "backup",
            "restore",
            "recover"
          ],
          "storage": [
            "get",
            "list",
            "delete",
            "set",
            "update",
            "regeneratekey",
            "setsas",
            "listsas",
            "getsas",
            "deletesas"
          ]
        },
        "tenantId": "00000000-0000-0000-000000000000"
      },
      {
        "applicationId": null,
        "objectId": "00000000-0000-0000-000000000000",
        "permissions": {
          "certificates": null,
          "keys": [
            "encrypt",
            "get",
            "list",
            "wrapKey",
            "decrypt",
            "unwrapKey"
          ],
          "secrets": null,
          "storage": null
        },
        "tenantId": "00000000-0000-0000-000000000000"
      }
    ],
    "createMode": null,
    "enablePurgeProtection": true,
    "enableRbacAuthorization": null,
    "enableSoftDelete": true,
    "enabledForDeployment": false,
    "enabledForDiskEncryption": null,
    "enabledForTemplateDeployment": null,
    "networkAcls": null,
    "privateEndpointConnections": null,
    "provisioningState": "Succeeded",
    "sku": {
      "name": "standard"
    },
    "softDeleteRetentionInDays": 90,
    "tenantId": "00000000-0000-0000-000000000000",
    "vaultUri": "https://your-keyvault-name.vault.azure.net/"
  },
  "resourceGroup": "your-resource-group-name",
  "tags": {},
  "type": "Microsoft.KeyVault/vaults"
}

将媒体服务设置为使用 Key Vault 中的密钥

将媒体服务设置为使用已创建的密钥。 key-identifier 属性的值来自创建密钥时的输出。 由于传播访问控制更改所需的时间,此命令可能会失败。 如果发生这种情况,请在几分钟后重试。

若要使用此命令,必须已创建 Key Vault 和密钥。

az ams account encryption set --account-name <your-media-services-account-name> --resource-group <your-resource-group> --key-type CustomerKey --key-identifier https://<your-keyvault-name>.vault.azure.net/keys/<your-key-name>

示例 JSON 响应:

{
  "id": "/subscriptions/00000000-0000-0000-000000000000/resourceGroups/your-resource-group-name/providers/Microsoft.KeyVault/vaults/your-keyvault-name",
  "location": "your-region",
  "name": "your-keyvault-name",
  "properties": {
    "accessPolicies": [
      {
        "applicationId": null,
        "objectId": "00000000-0000-0000-000000000000",
        "permissions": {
          "certificates": [
            "get",
            "list",
            "delete",
            "create",
            "import",
            "update",
            "managecontacts",
            "getissuers",
            "listissuers",
            "setissuers",
            "deleteissuers",
            "manageissuers",
            "recover"
          ],
          "keys": [
            "get",
            "create",
            "delete",
            "list",
            "update",
            "import",
            "backup",
            "restore",
            "recover"
          ],
          "secrets": [
            "get",
            "list",
            "set",
            "delete",
            "backup",
            "restore",
            "recover"
          ],
          "storage": [
            "get",
            "list",
            "delete",
            "set",
            "update",
            "regeneratekey",
            "setsas",
            "listsas",
            "getsas",
            "deletesas"
          ]
        },
        "tenantId": "the-tenant-id"
      },
      {
        "applicationId": null,
        "objectId": "the-media-services-account-id",
        "permissions": {
          "certificates": null,
          "keys": [
            "encrypt",
            "get",
            "list",
            "wrapKey",
            "decrypt",
            "unwrapKey"
          ],
          "secrets": null,
          "storage": null
        },
        "tenantId": "the-tenant-id"
      }
    ],
    "createMode": null,
    "enablePurgeProtection": true,
    "enableRbacAuthorization": null,
    "enableSoftDelete": true,
    "enabledForDeployment": false,
    "enabledForDiskEncryption": null,
    "enabledForTemplateDeployment": null,
    "networkAcls": null,
    "privateEndpointConnections": null,
    "provisioningState": "Succeeded",
    "sku": {
      "name": "standard"
    },
    "softDeleteRetentionInDays": 90,
    "tenantId": "the-tenant-id",
    "vaultUri": "https://your-keyvault-name.vault.azure.net/"
  },
  "resourceGroup": "your-resource-group-name",
  "tags": {},
  "type": "Microsoft.KeyVault/vaults"
}

验证

若要使用客户托管密钥验证帐户是否已加密,请查看帐户加密属性:

使用 CLI 显示帐户加密

有关此命令的详细信息,请参阅媒体服务 CLI 参考

type 属性应显示 CustomerKeycurrentKeyIdentifier 应设置为客户 Key Vault 中的密钥路径。

清理资源

如果不打算使用所创建的资源,请删除资源组。

使用 CLI 删除资源组

az group delete --name <your-resource-group-name>

获取帮助和支持

可以通过以下方法之一联系媒体服务,并关注我们的更新: