无法通过Azure SDK for Python配置Azure SQL Server的TDE(CMK方式)
问题排查:Azure SQL Server 基于客户托管密钥(CMK)的透明数据加密(TDE)启用失败
核心问题
你的代码仅完成了将密钥保管库密钥关联到SQL Server的操作,但未显式启用TDE功能本身。此外还有几处潜在配置疏漏需要验证:
修复步骤
1. 补充启用TDE的代码
在关联完ServerKey后,必须单独更新SQL Server的TDE状态为启用:
from azure.mgmt.sql.models import TransparentDataEncryption # 在创建server_key的代码后添加以下逻辑 tde_config = TransparentDataEncryption(status="Enabled") sql_client.transparent_data_encryptions.begin_create_or_update( RESOURCE_GROUP_NAME, server_name, "current", tde_config ).wait()
2. 验证密钥保管库权限配置
确保SQL Server的系统托管标识(若使用用户托管标识则对应该标识)在密钥保管库中拥有以下权限:
getwrapKeyunwrapKey
需直接为SQL Server标识分配这些权限,不能依赖继承权限。
3. 检查密钥URI格式
确认生成的URI符合标准格式:https://<vault-name>.vault.azure.net/keys/<key-name>/<key-version>,可通过打印uri变量值验证拼接是否正确。
4. 确认create_sql_cmk函数的正确性
该函数需确保:
- 在密钥保管库中创建了符合要求的RSA密钥(建议2048位及以上)
- 已为SQL Server标识授予该密钥的上述必要权限
- 返回的
key_name是正确的密钥名称
完整修正后的代码示例
def enable_transparent_data_encryption(server_name: str): key_client = KeyClient(vault_url=KEY_VAULT_URL, credential=credentials) key_name = create_sql_cmk(server_name) key = key_client.get_key(name=key_name) key_version = key.properties.version server_key_name = f'{KEY_VAULT_URL.split("//")[-1].split(".")[0]}_{key_name}_{key_version}' # 关联密钥保管库密钥到SQL Server tde_server_key = ServerKey( auto_rotation_enabled=True, server_key_type=ServerKeyType.AZURE_KEY_VAULT, uri=f'{KEY_VAULT_URL}keys/{key_name}/{key_version}' ) sql_client.server_keys.begin_create_or_update(RESOURCE_GROUP_NAME, server_name, server_key_name, tde_server_key).wait() # 启用TDE功能 tde_config = TransparentDataEncryption(status="Enabled") sql_client.transparent_data_encryptions.begin_create_or_update( RESOURCE_GROUP_NAME, server_name, "current", tde_config ).wait() print(f'Enabled - Transparent Data Encryption using CMK on `{server_name}` SQL server.')
额外验证操作
- 登录Azure门户,进入目标SQL Server的透明数据加密页面,确认状态为“启用”且密钥来源为密钥保管库
- 查看SQL Server的活动日志,排查是否存在TDE相关的权限或配置失败事件
内容的提问来源于stack exchange,提问作者Swapnil91color
相关产品推荐
相关产品推荐

