教程:使用 Key Vault 密钥将数据加密到媒体服务帐户
警告
Azure 媒体服务将于 2024 年 6 月 30 日停用。 有关详细信息,请参阅 AMS 停用指南。
注意
托管标识仅适用于使用 v3 API 创建的媒体服务帐户。 如果使用 v2 API 并想要使用托管标识,请从 v2 迁移到 v3 从媒体服务 v2 迁移到 v3 简介。
如果希望媒体服务使用 Key Vault 中的密钥加密数据,则必须向媒体服务帐户授予 访问 Key Vault 的权限。 按照以下步骤为媒体服务帐户创建托管标识,并使用媒体服务 CLI 授予此标识对 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-name
your-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-name
、your-keyvault-name
和 your-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
属性应显示 CustomerKey
,currentKeyIdentifier
应设置为客户 Key Vault 中的密钥路径。
清理资源
如果不打算使用所创建的资源,请删除资源组。
使用 CLI 删除资源组
az group delete --name <your-resource-group-name>
获取帮助和支持
可以通过以下方法之一联系媒体服务,并关注我们的更新:
- Q & A
-
Stack Overflow。 用
azure-media-services
标记问题。 - @MSFTAzureMedia 或使用 @AzureSupport 请求支持。
- 通过 Azure 门户开具支持票证。