使用 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 Key Vault 中,建立適用於 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 屬性設定為 [Recoverable] (這需要啟用虛刪除,且保留期間設定為 90 天)
- 已啟用清除保護
您可以使用下列命令來驗證金鑰的上述屬性:
az keyvault key show --vault-name <key_vault_name> -n <key_name>
- 適用於 MySQL 的 Azure 資料庫 - 單一伺服器應位於 [一般用途] 或 [記憶體已最佳化] 定價層及一般用途儲存體 v2 上。 繼續進行之前,請先參閱使用客戶自控金鑰進行資料加密的限制。
設定金鑰作業的正確權限
有兩種方式可取得適用於 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
針對 [主體] (即 MySQL 伺服器的名稱),設定 [金鑰權限] (Get、Wrap、Unwrap)。
az keyvault set-policy --name -g <resource_group> --key-permissions get unwrapKey wrapKey --object-id <principal id of the server>
對適用於 MySQL 的 Azure 資料庫設定資料加密
使用 Azure Key Vault 中所建立的金鑰,為適用於 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 資料庫」使用儲存於 Key Vault 的客戶管理金鑰加密之後,任何新建立的伺服器複本也會一併加密。 您可以透過本機或異地還原作業,或者透過複本 (本機/跨區域) 作業來建立這個新複本。 因此,對於加密的 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 資料庫伺服器上啟用資料加密。
在屬性物件中,傳入您先前在
Uri
屬性下複製的 Azure Key Vault 金鑰的資源識別碼。使用 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'))]"
}
}
]
}