Criptografia de dados para o Banco de Dados do Azure para MySQL usando a CLI do Azure

APLICA-SE A: Banco de Dados do Azure para MySQL – Servidor Único

Importante

O servidor único do Banco de Dados do Azure para MySQL está no caminho da desativação. É altamente recomendável que você atualize para o servidor flexível do Banco de Dados do Azure para MySQL. Para obter mais informações sobre a migração para o servidor flexível do Banco de Dados do Azure para MySQL, confira O que está acontecendo com o Servidor Único do Banco de Dados do Azure para MySQL?

Saiba como usar a CLI do Azure para configurar e gerenciar a criptografia de dados para o Banco de Dados do Azure para MySQL.

Pré-requisitos para a CLI do Azure

  • É necessário ter uma assinatura do Azure e ser um administrador nessa assinatura.

  • Crie um cofre de chaves e uma chave para usar em uma chave gerenciada pelo cliente. Habilite também a proteção de limpeza e a exclusão temporária no cofre de chaves.

    az keyvault create -g <resource_group> -n <vault_name> --enable-soft-delete true --enable-purge-protection true
    
  • No Azure Key Vault criado, crie a chave que será usada para a criptografia de dados do Banco de Dados do Azure para MySQL.

    az keyvault key create --name <key_name> -p software --vault-name <vault_name>
    
  • Para usar um cofre de chaves existente, ele deve ter as seguintes propriedades para usar como uma chave gerenciada pelo cliente:

    • Exclusão reversível

      az resource update --id $(az keyvault show --name \ <key_vault_name> -o tsv | awk '{print $1}') --set \ properties.enableSoftDelete=true
      
    • Limpeza protegida

      az keyvault update --name <key_vault_name> --resource-group <resource_group_name>  --enable-purge-protection true
      
    • Dias de retenção definidos como 90 dias

      az keyvault update --name <key_vault_name> --resource-group <resource_group_name>  --retention-days 90
    
  • A chave deve ter os seguintes atributos a serem usados como chave gerenciada pelo cliente:

    • Sem data de validade
    • Não desabilitado
    • Executar operações get, wrap e unwrap
    • atributo recoverylevel definido como Recuperável (isso requer a exclusão temporária habilitada com o período de retenção definido como 90 dias)
    • Proteção de limpeza habilitada

Você pode verificar os atributos acima da chave usando o seguinte comando:

az keyvault key show --vault-name <key_vault_name> -n <key_name>

Definir as permissões corretas para operações de chave

  1. Há duas maneiras de obter a identidade gerenciada para seu Banco de Dados do Azure para MySQL.

    Crie um servidor de Banco de Dados do Azure para MySQL com uma identidade gerenciada.

    az mysql server create --name -g <resource_group> --location <locations> --storage-size size>  -u <user>-p <pwd> --backup-retention <7> --sku-name <sku name> -geo-redundant-backup <Enabled/Disabled>  --assign-identity
    

    Atualize um servidor de Banco de Dados do Azure para MySQL existente para obter uma identidade gerenciada.

    az mysql server update --name  <server name>  -g <resource_group> --assign-identity
    
  2. Defina as Permissões de chave (Get, Wrap, Unwrap) para a Entidade de segurança, que é o nome do servidor MySQL.

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

Definir criptografia de dados para o Banco de Dados do Azure para MySQL

  1. Habilite a criptografia de dados para o Banco de Dados do Azure para MySQL usando a chave criada no Azure Key Vault.

    az mysql server key create –name  <server name>  -g <resource_group> --kid <key url>
    

    URL da chave: https://YourVaultName.vault.azure.net/keys/YourKeyName/01234567890123456789012345678901>

Usar a criptografia de dados para servidores de restauração ou de réplica

Depois que o Banco de Dados do Azure para MySQL é criptografado com uma chave gerenciada pelo cliente armazenada no Key Vault, qualquer cópia recém-criada do servidor também é criptografada. Você pode fazer essa nova cópia por meio de uma operação de restauração local ou geográfica ou por meio de réplicas de leitura (local/entre regiões). Portanto, para um servidor MySQL criptografado, você pode usar as etapas a seguir para criar um servidor restaurado criptografado.

Criar um servidor restaurado/de réplica

Depois que o servidor for restaurado, revalidar a criptografia de dados do servidor restaurado

  • Atribua a identidade para o servidor de réplica
az mysql server update --name  <server name>  -g <resoure_group> --assign-identity
  • Obtenha a chave existente que deve ser usada para o servidor restaurado/de réplica
az mysql server key list --name  '<server_name>'  -g '<resource_group_name>'
  • Defina a política para a nova identidade para o servidor restaurado/de réplica
az keyvault set-policy --name <keyvault> -g <resoure_group> --key-permissions get unwrapKey wrapKey --object-id <principl id of the server returned by the step 1>
  • Valide novamente o servidor restaurado/de réplica com a chave de criptografia
az mysql server key create –name  <server name> -g <resource_group> --kid <key url>

Funcionalidade adicional para a chave que está sendo usada para o Banco de Dados do Azure para MySQL

Obter a chave usada

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

URL da chave: https://YourVaultName.vault.azure.net/keys/YourKeyName/01234567890123456789012345678901>

Listar a chave usada

az mysql server key list --name  <server name>  -g <resource_group>

Remova a chave que está sendo usada

az mysql server key delete -g <resource_group> --kid <key url>

Usar um modelo do Azure Resource Manager para habilitar a criptografia de dados

Além do portal do Azure, você também pode habilitar a criptografia de dados no servidor do Banco de Dados do Azure para MySQL usando modelos do Azure Resource Manager para servidores novos e existentes.

Para um novo servidor

Use um dos modelos do Azure Resource Manager criados previamente para provisionar o servidor com a criptografia de dados habilitada: exemplo com criptografia de dados

Este modelo do Azure Resource Manager cria um servidor do Banco de Dados do Azure para MySQL e usa o KeyVault e a Chave passados como parâmetros para habilitar a criptografia de dados no servidor.

Para um servidor existente

Além disso, você pode usar os modelos do Azure Resource Manager para habilitar a criptografia de dados em seus servidores existentes do Banco de Dados do Azure para MySQL.

  • Passe a ID do recurso da chave do Azure Key Vault que você copiou anteriormente sob a propriedade Uri no objeto de propriedades.

  • Use 2020-01-01-preview como a versão da 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.DBforMySQL/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.DBforMySQL/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.DBforMySQL/servers/', parameters('serverName')), '2017-12-01', 'Full').identity.principalId]",
                    "permissions": {
                      "keys": [
                        "get",
                        "wrapKey",
                        "unwrapKey"
                      ]
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    },
    {
      "name": "[concat(parameters('serverName'), '/', variables('serverKeyName'))]",
      "type": "Microsoft.DBforMySQL/servers/keys",
      "apiVersion": "2020-01-01-preview",
      "dependsOn": [
        "addAccessPolicy",
        "[resourceId('Microsoft.DBforMySQL/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'))]"
      }
    }
  ]
}

Próximas etapas