Шифрование данных для отдельного сервера Базы данных Azure для PostgreSQL с использованием Azure CLI

Область применения: отдельный сервер Базы данных Azure для PostgreSQL

Внимание

База данных Azure для PostgreSQL — одиночный сервер находится на пути выхода на пенсию. Настоятельно рекомендуется выполнить обновление до База данных Azure для PostgreSQL — гибкий сервер. Дополнительные сведения о миграции на База данных Azure для PostgreSQL — гибкий сервер см. в статье "Что происходит с одним сервером База данных Azure для PostgreSQL?".

Сведения о том, как с помощью Azure CLI настроить шифрование данных и управлять им для отдельного сервера Базы данных Azure для 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 для PostgreSQL.

    az keyvault key create --name <key_name> -p software --vault-name <vault_name>
    
  • Чтобы использовать существующее хранилище ключей, оно должно иметь следующие свойства для использования в качестве ключа, управляемого клиентом:

  • Чтобы использовать ключ в качестве управляемого клиентом, он должен иметь следующие атрибуты:

    • без даты окончания срока действия;
    • не отключено;
    • выполнение операций get, wrap, unwrap.

Задайте правильные разрешения для операций с ключами.

  1. Существует два способа получения управляемого удостоверения для отдельного сервера Базы данных Azure для PostgreSQL.

    Создание новой Базы данных Azure для сервера 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 для сервера PostgreSQL, чтобы получить управляемое удостоверение.

    az postgres server update --resource-group <resource_group> --name <server_name> --assign-identity
    
  2. Задайте Разрешения ключей (Get, Wrap, Unwrap) для параметра Субъект — это имя отдельного сервера PostgreSQL.

    az keyvault set-policy --name -g <resource_group> --key-permissions get unwrapKey wrapKey --object-id <principal id of the server>
    

Настройка шифрования данных для отдельного сервера Базы данных Azure для PostgreSQL

  1. Включите шифрование данных для отдельного сервера Базы данных Azure для PostgreSQL с помощью ключа, созданного в Azure Key Vault.

    az postgres server key create --name <server_name> -g <resource_group> --kid <key_url>
    

    URL-адрес ключа: https://YourVaultName.vault.azure.net/keys/YourKeyName/01234567890123456789012345678901>

Использование шифрования данных для серверов восстановления или реплик

После шифрования отдельного сервера базы данных Azure для PostgreSQL с помощью управляемого ключа клиента, хранящегося в Key Vault, все создаваемые копии сервера также шифруются. Новую копию можно создать с помощью операции локального восстановления или геовосстановления либо с помощью операции реплики (локальной или между регионами). Чтобы создать зашифрованный восстановленный сервер для отдельного зашифрованного сервера 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 для PostgreSQL

Получение используемого ключа

az postgres server key show --name <server name>  -g <resource_group> --kid <key url>

URL-адрес ключа: https://YourVaultName.vault.azure.net/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 Resource Manager для включения шифрования данных

Наряду с порталом Azure шифрование данных можно также включить на отдельном сервере Базы данных Azure для PostgreSQL с помощью шаблонов Azure Resource Manager для новых и существующих серверов.

Для существующего сервера

Вы также можете использовать шаблоны Azure Resource Manager, чтобы включить шифрование данных на существующих отдельных серверах Базы данных Azure для PostgreSQL.

  • Передайте скопированный ранее идентификатор ресурса ключа Azure Key Vault в свойство Uri в объекте "properties".

  • Используйте 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 для PostgreSQL с помощью ключа, управляемого клиентом.