做过 Azure SQL 迁移的同学一定经历过这种糟心时刻——BACPAC 导入导出时,脚本里明文写着 SQL 管理员密码和 Storage Account 密钥,或者挂着一个随时可能过期的 SAS Token。万一泄露了……不敢想。
现在微软终于把这个问题解决了。Azure SQL Database 的导入导出服务正式支持 用户分配的托管身份(User-Assigned Managed Identity,简称 UAMI) 认证,公测阶段已开放。
一句话总结:以后做数据库迁移,密码、密钥、SAS Token 全部可以 Bye Bye 了。 🔑
🔍 这东西到底干了什么?
以前 Azure SQL 导入导出 BACPAC 文件时,你得提供两类凭证:
- SQL 认证信息 — 管理员账号 + 密码
- Storage 认证信息 — 存储账户密钥或 SAS Token
这意味着你的 CI/CD 脚本、自动化流水线里不可避免地要嵌入敏感信息。即使你用 Azure Key Vault 存储,调用链路依然复杂,而且密钥轮换时又是一顿折腾。
现在有了托管身份认证,导入导出操作可以直接用 Azure AD 身份 完成认证,全程零密码、零密钥。
💡 两种方案,按需选择
微软给了两种灵活的配置方式:
| 方案 | 说明 | 适用场景 | |------|------|----------| | 一个 UAMI 通吃 | SQL 和 Storage 共用同一个托管身份 | 简单快速部署,团队规模小,安全要求适中 | | 两个 UAMI 分开 | SQL 用一个身份,Storage 用另一个身份 | 企业级安全合规,需要最小权限隔离 |
推荐做法:如果你对权限管控要求比较严格(比如金融、医疗行业),用两个 UAMI 把 SQL 权限和 Storage 权限完全分开,符合最小权限原则。
🛠️ 配置步骤(5 步搞定)
Step 1:创建托管身份
在 Azure Portal 创建一个或两个「用户分配的托管身份」(UAMI)。建议提前规划好用一个还是两个。
Step 2:把 UAMI 绑到 SQL 逻辑服务器
在 Azure SQL Logical Server 的 Identity 页面,添加刚创建的 UAMI。这样导入导出作业就能以该身份运行了。
Step 3:设置 Entra ID 管理员
在 Microsoft Entra ID > Set admin 中选择这个 UAMI。这一步很关键——它让工作流可以免密码连接到 SQL。
Step 4:给 Storage 授权
在存储账户的 Access Control (IAM) 中给 UAMI 分配 RBAC 角色:
- 导入操作:分配 Storage Blob Data Reader
- 导出操作:分配 Storage Blob Data Contributor
最佳实践:把权限范围限制到存放 .bacpac 文件的具体容器,而不是整个存储账户。
Step 5:调用时传 Resource ID
在 REST / CLI / PowerShell 中,不再传用户名和密码,而是传 UAMI 的 Resource ID:
administratorLogin→ 用于 SQL 认证的 UAMI Resource IDstorageKey→ 用于 Storage 认证的 UAMI Resource IDauthenticationType/storageKeyType→ 设为ManagedIdentity
📋 代码示例
PowerShell — 导出(一个 UAMI)
$exportBody = @{
storageKeyType = "ManagedIdentity"
storageKey = $managedIdentityServerResourceId
storageUri = $storageUri
administratorLogin = $managedIdentityServerResourceId
authenticationType = "ManagedIdentity"
} | ConvertTo-Json
$export = Invoke-AzRestMethod -Method POST `
-Path "/subscriptions/$subscriptionId/resourceGroups/$rg/providers/Microsoft.Sql/servers/$server/databases/$db/export?api-version=2024-05-01-preview" `
-Payload $exportBody
Azure CLI — 导入(两个 UAMI)
az sql db import \
-s $serverName -n $dbName -g $rgName \
--auth-type ManagedIdentity \
-u $managedIdentityServerResourceId \
--storage-key $managedIdentityStorageResourceId \
--storage-key-type ManagedIdentity \
--storage-uri $storageUri
PowerShell — 导入(两个 UAMI 分离)
New-AzSqlDatabaseImport `
-ResourceGroupName $rg `
-DatabaseName $dbName `
-ServerName $server `
-StorageKeyType ManagedIdentity `
-StorageKey $managedIdentityStorageResourceId `
-StorageUri $storageUri `
-AuthenticationType ManagedIdentity `
-AdministratorLogin $managedIdentityServerResourceId
🌐 国内用户关心的问题
Q: 这个功能在国内的 Azure 中国区能用吗?
Azure 中国区(由 21Vianet 运营)也支持托管身份和 Entra ID(国内叫 Azure AD),但具体功能上线时间可能与国际版有差异,建议查看 Azure 中国区官方文档确认。
Q: 跟阿里云 RDS / 腾讯云 CDB 的数据迁移比,体验如何?
国内云厂商的数据迁移通常依赖 DTS(数据传输服务)或类似的专用工具。Azure SQL 这次的思路不同——直接在导入导出服务层面集成身份认证,让 BACPAC 迁移这条老路也能享受零密钥的安全体验。两条路各有优劣,取决于你的具体场景。
Q: 从自建 SQL Server 迁移到 Azure SQL,用这个功能方便吗?
很方便。把自建数据库导出为 BACPAC,上传到 Azure Blob Storage,然后用托管身份认证导入 Azure SQL。全程不需要在脚本里暴露任何密码。
Q: 已有的导入导出脚本需要改吗?
如果你之前用的是 SQL 认证 + Storage 密钥的方式,需要把认证参数换成 UAMI Resource ID,并把 authenticationType 设为 ManagedIdentity。改动量不大,但需要提前创建好 UAMI 并完成权限配置。
📝 小结
这个功能解决的不是一个「能不能用」的问题,而是一个「安不安全」的问题。对于把数据库迁移纳入 CI/CD 流水线的团队来说,托管身份认证意味着:
- ✅ 脚本里不再有明文密码
- ✅ 不用再管理 SAS Token 的过期时间
- ✅ 密钥轮换时不需要改导入导出配置
- ✅ 权限可以精细到容器级别
如果你正在用 Azure SQL 并且有定期导入导出的需求,强烈建议试试这个预览功能。
原文链接:https://techcommunity.microsoft.com/t5/azure-sql-blog/managed-identity-support-for-azure-sql-database-import-export/ba-p/4498732
发布日期:2026-03-03


