禁用共享密钥访问后无法管理ADLS Gen2的ACL:是特性还是Bug?如何实现管理?
这是产品特性还是Bug?
这是当前的产品设计特性,并非Bug。虽然Azure一直强调优先使用Azure AD和RBAC/ACL进行权限管理,而非共享账户密钥,但目前Azure门户内的ACL编辑功能底层仍依赖存储账户密钥完成认证——哪怕你在浏览存储数据时可以切换到Azure AD身份验证,但ACL管理的入口暂未适配Azure AD认证流程,所以禁用密钥后就会触发权限报错。
禁用共享密钥后,如何管理ADLS Gen2的ACL?
你可以通过以下几种方式绕过存储密钥,用Azure AD身份验证来管理ACL:
1. Azure CLI命令行
使用az storage fs access set-acl命令,通过--auth-mode login参数指定用当前登录的Azure AD账户权限操作,完全不需要存储密钥。示例:
# 为指定用户设置目录的读写执行权限 az storage fs access set-acl -n my-file-system --path /my-directory --acl "user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:rwx" --auth-mode login
只要你的Azure AD账户拥有Storage Blob Data Owner或Storage Blob Data Contributor这类具备ACL管理权限的角色,就能成功执行。
2. Azure PowerShell
用PowerShell的ADLS Gen2专用 cmdlet,同样基于Azure AD身份验证:
# 先创建ACL规则对象 $aclRule = New-AzDataLakeGen2ItemAclObject -AccessControlType User -EntityId xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -Permission rwx # 更新目标路径的ACL Update-AzDataLakeGen2Item -FileSystem my-file-system -Path /my-directory -Acl $aclRule
执行前确保已经通过Connect-AzAccount登录了Azure AD,且账户权限足够。
3. Azure SDK(多语言支持)
如果需要集成到应用程序里,可以用Azure官方SDK,通过DefaultAzureCredential自动获取Azure AD身份令牌来认证。比如Python示例:
from azure.storage.filedatalake import DataLakeServiceClient from azure.identity import DefaultAzureCredential # 初始化服务客户端(自动用Azure AD身份验证) account_url = "https://mystorageaccount.dfs.core.windows.net" service_client = DataLakeServiceClient(account_url, credential=DefaultAzureCredential()) # 获取目录客户端并设置ACL fs_client = service_client.get_file_system_client("my-file-system") dir_client = fs_client.get_directory_client("my-directory") dir_client.set_access_control(acl="user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:rwx")
.NET、Java等其他语言的SDK也有类似的实现方式。
4. Azure Storage Explorer
图形化工具的话,Azure Storage Explorer支持纯Azure AD身份验证,且能在禁用存储密钥的情况下编辑ACL:
- 打开Storage Explorer,用你的Azure AD账户登录
- 找到目标ADLS Gen2存储账户和文件系统
- 右键点击要修改的目录/文件,选择「Manage Access Control Lists」
- 在弹出的窗口中添加/编辑ACL规则,保存即可
额外提示
微软正在逐步推进Azure AD在ADLS Gen2全操作场景的覆盖,未来Azure门户的ACL管理功能大概率会支持Azure AD认证,但目前只能通过上述替代方案操作。另外,务必确保操作的Azure AD账户拥有对应路径的ACL管理权限——最直接的是分配Storage Blob Data Owner角色,或者通过现有ACL赋予该账户对目标路径的w(写入)权限。
内容的提问来源于stack exchange,提问作者Martin Thøgersen

