使用 Azure CLI 進行適用於 MySQL 的 Azure 資料庫的資料加密

適用於: 適用於 MySQL 的 Azure 資料庫 - 單一伺服器

重要

適用於 MySQL 的 Azure 資料庫單一伺服器位於淘汰路徑上。 強烈建議您升級至適用於 MySQL 的 Azure 資料庫彈性伺服器。 如需移轉至適用於 MySQL 的 Azure 資料庫彈性伺服器的詳細資訊,請參閱 適用於 MySQL 的 Azure 資料庫單一伺服器會發生什麼事?

瞭解如何使用 Azure CLI 來設定和管理適用於 MySQL 的 Azure 資料庫的資料加密。

Azure CLI 的必要條件

  • 您必須具有 Azure 訂用帳戶,並且是該訂用帳戶的系統管理員。

  • 建立金鑰保存庫和金鑰,以用於客戶管理的金鑰。 同時在金鑰保存庫上啟用清除保護和虛刪除。

    az keyvault create -g <resource_group> -n <vault_name> --enable-soft-delete true --enable-purge-protection true
    
  • 在建立的 Azure 金鑰保存庫中,建立將用於適用於 MySQL 的 Azure 資料庫資料加密的金鑰。

    az keyvault key create --name <key_name> -p software --vault-name <vault_name>
    
  • 若要使用現有的金鑰保存庫,它必須具有下列屬性,才能作為客戶管理的金鑰使用:

    • 虛刪除

      az resource update --id $(az keyvault show --name \ <key_vault_name> -o tsv | awk '{print $1}') --set \ properties.enableSoftDelete=true
      
    • 清除受保護的

      az keyvault update --name <key_vault_name> --resource-group <resource_group_name>  --enable-purge-protection true
      
    • 保留天數設定為 90 天

      az keyvault update --name <key_vault_name> --resource-group <resource_group_name>  --retention-days 90
    
  • 金鑰必須具有下列屬性才能作為客戶自控金鑰:

    • 沒有到期日
    • 未停用
    • 執行 get wrap unwrap 作業
    • recoverylevel 屬性設定為 [可 復原] (這需要啟用虛刪除,保留期間設定為 90 天)
    • 已啟用清除保護

您可以使用下列命令來驗證金鑰的上述屬性:

az keyvault key show --vault-name <key_vault_name> -n <key_name>
  • 適用於 MySQL 的 Azure 資料庫 - 單一伺服器應位於一般用途或記憶體優化定價層和一般用途儲存體 v2 上。 在您繼續進行之前,請先參考使用客戶管理金鑰 進行資料加密的限制

設定金鑰作業的正確許可權

  1. 有兩種方式可取得適用於 MySQL 的 Azure 資料庫的受控識別。

    使用受控識別建立新的適用於 MySQL 的 Azure 資料庫伺服器。

    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
    

    更新現有的適用於 MySQL 的 Azure 資料庫伺服器以取得受控識別。

    az mysql server update --name  <server name>  -g <resource_group> --assign-identity
    
  2. 為主體 設定金鑰許可權 Get Wrap Unwrap ), 這是 MySQL 伺服器的名稱。

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

設定適用於 MySQL 的 Azure 資料庫的資料加密

  1. 使用在 Azure 金鑰保存庫中建立的金鑰,為適用於 MySQL 的 Azure 資料庫啟用資料加密。

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

    金鑰 URL: https://YourVaultName.vault.azure.net/keys/YourKeyName/01234567890123456789012345678901>

使用資料加密進行還原或複本伺服器

適用於 MySQL 的 Azure 資料庫使用儲存在 金鑰保存庫 的客戶受控金鑰加密之後,也會加密任何新建立的伺服器複本。 您可以透過本機或異地還原作業,或透過複本(本機/跨區域)作業來建立這個新複本。 因此,針對加密的 MySQL 伺服器,您可以使用下列步驟來建立加密的還原伺服器。

建立還原/複本伺服器

還原伺服器之後,重新驗證還原的伺服器的資料加密

  • 指派複本伺服器的身分識別
az mysql server update --name  <server name>  -g <resoure_group> --assign-identity
  • 取得必須用於還原/複本伺服器的現有金鑰
az mysql server key list --name  '<server_name>'  -g '<resource_group_name>'
  • 設定已還原/複本伺服器之新身分識別的原則
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>
  • 使用加密金鑰重新驗證還原/複本伺服器
az mysql server key create –name  <server name> -g <resource_group> --kid <key url>

用於適用於 MySQL 的 Azure 資料庫之金鑰的其他功能

取得使用的金鑰

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

金鑰 URL: https://YourVaultName.vault.azure.net/keys/YourKeyName/01234567890123456789012345678901>

列出使用的金鑰

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

卸載所使用的金鑰

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

使用 Azure Resource Manager 範本來啟用資料加密

除了Azure 入口網站之外,您也可以使用適用于新和現有伺服器的 Azure Resource Manager 範本,在適用於 MySQL 的 Azure 資料庫伺服器上啟用資料加密。

新伺服器

使用其中一個預先建立的 Azure Resource Manager 範本來布建已啟用資料加密的伺服器: 使用資料加密的範例

此 Azure Resource Manager 範本會建立適用於 MySQL 的 Azure 資料庫伺服器,並使用 作為參數傳遞的 KeyVault Key ,在伺服器上啟用資料加密。

針對現有的伺服器

此外,您可以使用 Azure Resource Manager 範本,在現有的適用於 MySQL 的 Azure 資料庫伺服器上啟用資料加密。

  • 傳遞您稍早在 properties 物件中 屬性底下 Uri 複製的 Azure 金鑰保存庫 金鑰資源識別碼。

  • 使用 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.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'))]"
      }
    }
  ]
}

下一步