使用Entra ID保护Blob访问:如何生成指定组可用的安全链接?
解决方案:Azure Blob存储基于用户组权限的SAS链接生成与访问控制
一、将容器权限锁定到指定用户组
- 首先关闭容器的公共访问权限,确保默认状态下无外部访问权限
- 进入Azure存储账户的IAM页面,给目标内部用户组添加存储Blob数据参与者(或更细粒度的权限,如仅上传/只读)角色,仅该组内用户可通过Azure AD身份验证访问容器内容
二、生成安全SAS链接的两种方式
1. 组内员工自主生成(适合自行上传场景)
员工可通过Azure CLI或PowerShell,基于自身Azure AD身份生成用户委派SAS,这类SAS绑定用户身份权限,仅组内授权用户可使用:
- Azure CLI命令示例:
az storage blob generate-sas \ --account-name <你的存储账户名> \ --container-name <目标容器名> \ --name <Blob文件名> \ --permissions racwd \ --expiry <过期时间,如2024-12-31T23:59:59Z> \ --auth-mode login
- 说明:
--auth-mode login指定用当前用户的Azure AD身份生成,仅拥有容器权限的组内用户能成功生成,生成的SAS链接仅该用户(或同组授权人员)可用
2. 后端代码统一生成(适合批量分发场景)
若你需要通过代码生成链接分发给员工,可生成服务端用户委派SAS:
- 步骤示例(.NET):
- 确保代码运行身份(服务主体/托管身份)拥有存储账户密钥操作员或存储Blob数据所有者角色,具备获取用户委派密钥的权限
- 获取用户委派密钥:
var blobServiceClient = new BlobServiceClient( new Uri("https://<你的存储账户名>.blob.core.windows.net"), new DefaultAzureCredential()); var userDelegationKey = await blobServiceClient.GetUserDelegationKeyAsync( DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddDays(7)); - 生成SAS令牌并拼接Blob访问链接:
var blobContainerClient = blobServiceClient.GetBlobContainerClient("<目标容器名>"); var blobClient = blobContainerClient.GetBlobClient("<Blob文件名>"); var sasBuilder = new BlobSasBuilder() { BlobContainerName = "<目标容器名>", BlobName = "<Blob文件名>", Resource = "b", ExpiresOn = DateTimeOffset.UtcNow.AddHours(24), Permissions = BlobSasPermissions.Write | BlobSasPermissions.Read }; var sasToken = sasBuilder.ToSasQueryParameters(userDelegationKey, "<你的存储账户名>").ToString(); var secureBlobUrl = $"{blobClient.Uri}?{sasToken}"; - 将生成的
secureBlobUrl分发给组内员工,仅该组用户可通过此链接访问/上传Blob,因为用户委派SAS会验证请求者的Azure AD身份是否在授权组内
三、额外安全加固措施
- 缩短SAS有效期:尽量设置较短的过期时间,降低链接泄露后的风险
- 绑定IP范围:若员工均在公司内网,生成SAS时指定允许的IP段,缩小访问范围
- 启用存储账户防火墙:仅允许公司内网IP或指定Azure服务访问存储账户,从网络层面强化防护
内容的提问来源于stack exchange,提问作者Hilton Giesenow
相关产品推荐
相关产品推荐

