使用 Azure CLI 对 Azure Database for PostgreSQL(单一服务器)进行数据加密
适用于: Azure Database for PostgreSQL - 单一服务器
重要
Azure Database for PostgreSQL - 单一服务器即将停用。 我们强烈建议升级到 Azure Database for PostgreSQL 灵活服务器。 有关迁移到 Azure Database for PostgreSQL 灵活服务器的详细信息,请参阅 Azure Database for PostgreSQL 单一服务器的最新动态。
了解如何通过 Azure CLI 为 Azure Database for PostgreSQL 单一服务器设置和管理数据加密。
Azure CLI 的先决条件
必须有一个 Azure 订阅,并且是该订阅的管理员。
创建密钥保管库和用于客户托管密钥的密钥。 同时启用密钥保管库上的清除保护和软删除。
az keyvault create -g <resource_group> -n <vault_name> --enable-soft-delete true --enable-purge-protection true
在创建的 Azure Key Vault 中,创建将用于 Azure Database for PostgreSQL 单一服务器的数据加密的密钥。
az keyvault key create --name <key_name> -p software --vault-name <vault_name>
要使用现有的密钥保管库,现有密钥保管库必须具有以下属性以用作客户管理的密钥:
该密钥必须具有以下属性才能用作客户管理的密钥:
- 无过期日期
- 未禁用
- 执行“get”、“wrap”和“unwrap”操作
为密钥操作设置正确的权限
可通过两种方式获取 Azure Database for PostgreSQL 单一服务器的托管标识。
使用托管标识创建新的 Azure Database for PostgreSQL 服务器。
az postgres server create --name <server_name> -g <resource_group> --location <location> --storage-size <size> -u <user> -p <pwd> --backup-retention <7> --sku-name <sku name> --geo-redundant-backup <Enabled/Disabled> --assign-identity
更新现有 Azure Database for PostgreSQL 服务器以获取托管标识。
az postgres server update --resource-group <resource_group> --name <server_name> --assign-identity
为“主体”(PostgreSQL 单一服务器的名称)选择“密钥权限”(“Get”、“Wrap”、“Unwrap”)。
az keyvault set-policy --name -g <resource_group> --key-permissions get unwrapKey wrapKey --object-id <principal id of the server>
为 Azure Database for PostgreSQL 单一服务器设置数据加密
使用 Azure Key Vault 中创建的密钥对 Azure Database for PostgreSQL 单一服务器启用数据加密。
az postgres server key create --name <server_name> -g <resource_group> --kid <key_url>
密钥 URL:
https://YourVaultName.vault.azure.cn/keys/YourKeyName/01234567890123456789012345678901>
对还原或副本服务器使用数据加密
在使用 Key Vault 中存储的客户管理的密钥对 Azure Database for PostgreSQL 单一服务器进行加密后,还将所有新创建的服务器副本进行加密。 可通过本地或异地还原操作,或通过副本(本地/跨区域)操作来创建这个新副本。 因此,对于加密的 PostgreSQL 单一服务器,可以使用以下步骤来创建加密的还原服务器。
创建还原/副本服务器
服务器还原后,请重新验证还原服务器的数据加密
- 为副本服务器分配标识
az postgres server update --name <server name> -g <resource_group> --assign-identity
- 获取必须用于还原/副本服务器的现有密钥
az postgres server key list --name '<server_name>' -g '<resource_group_name>'
- 为还原/副本服务器的新标识设置策略
az keyvault set-policy --name <keyvault> -g <resource_group> --key-permissions get unwrapKey wrapKey --object-id <principl id of the server returned by the step 1>
- 用加密密钥重新验证还原/副本服务器
az postgres server key create -name <server name> -g <resource_group> --kid <key url>
用于 Azure Database for PostgreSQL 单一服务器的密钥的附加功能
获取使用的密钥
az postgres server key show --name <server name> -g <resource_group> --kid <key url>
密钥 URL:https://YourVaultName.vault.azure.cn/keys/YourKeyName/01234567890123456789012345678901>
列出使用的密钥
az postgres server key list --name <server name> -g <resource_group>
删除正在使用的密钥
az postgres server key delete -g <resource_group> --kid <key url>
使用 Azure 资源管理器模板启用数据加密
除了 Azure 门户之外,还可以在 Azure Database for PostgreSQL 单一服务器上,使用 Azure 资源管理器模板为新服务器和现有服务器启用数据加密。
对于现有服务器
此外,还可以使用 Azure 资源管理器模板在现有 Azure Database for PostgreSQL 单一服务器上启用数据加密。
在属性对象中的
Uri
属性下,传递你先前复制的 Azure Key Vault 密钥的资源 ID。使用“2020-01-01-preview”作为 API 版本。
{
"$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string"
},
"serverName": {
"type": "string"
},
"keyVaultName": {
"type": "string",
"metadata": {
"description": "Key vault name where the key to use is stored"
}
},
"keyVaultResourceGroupName": {
"type": "string",
"metadata": {
"description": "Key vault resource group name where it is stored"
}
},
"keyName": {
"type": "string",
"metadata": {
"description": "Key name in the key vault to use as encryption protector"
}
},
"keyVersion": {
"type": "string",
"metadata": {
"description": "Version of the key in the key vault to use as encryption protector"
}
}
},
"variables": {
"serverKeyName": "[concat(parameters('keyVaultName'), '_', parameters('keyName'), '_', parameters('keyVersion'))]"
},
"resources": [
{
"type": "Microsoft.DBforPostgreSQL/servers",
"apiVersion": "2017-12-01",
"kind": "",
"location": "[parameters('location')]",
"identity": {
"type": "SystemAssigned"
},
"name": "[parameters('serverName')]",
"properties": {
}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2019-05-01",
"name": "addAccessPolicy",
"resourceGroup": "[parameters('keyVaultResourceGroupName')]",
"dependsOn": [
"[resourceId('Microsoft.DBforPostgreSQL/servers', parameters('serverName'))]"
],
"properties": {
"mode": "Incremental",
"template": {
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.KeyVault/vaults/accessPolicies",
"name": "[concat(parameters('keyVaultName'), '/add')]",
"apiVersion": "2018-02-14-preview",
"properties": {
"accessPolicies": [
{
"tenantId": "[subscription().tenantId]",
"objectId": "[reference(resourceId('Microsoft.DBforPostgreSQL/servers/', parameters('serverName')), '2017-12-01', 'Full').identity.principalId]",
"permissions": {
"keys": [
"get",
"wrapKey",
"unwrapKey"
]
}
}
]
}
}
]
}
}
},
{
"name": "[concat(parameters('serverName'), '/', variables('serverKeyName'))]",
"type": "Microsoft.DBforPostgreSQL/servers/keys",
"apiVersion": "2020-01-01-preview",
"dependsOn": [
"addAccessPolicy",
"[resourceId('Microsoft.DBforPostgreSQL/servers', parameters('serverName'))]"
],
"properties": {
"serverKeyType": "AzureKeyVault",
"uri": "[concat(reference(resourceId(parameters('keyVaultResourceGroupName'), 'Microsoft.KeyVault/vaults/', parameters('keyVaultName')), '2018-02-14-preview', 'Full').properties.vaultUri, 'keys/', parameters('keyName'), '/', parameters('keyVersion'))]"
}
}
]
}
后续步骤
有关数据加密的详细信息,请参阅使用客户托管的密钥进行的 Azure Database for PostgreSQL 单一服务器数据加密。