问题描述
如何查到一个Storage Account曾经创建过多少SAS key,这些Key是否可以回收和限定?能否基于AAD身份对 Container / Folder 进行权限的设定和管理?
问题解答
存储账户的SAS分为 用户委托SAS、服务SAS、账户SAS。
- 用户委托SAS是使用Azure AD凭据签名的SAS。
- 服务SAS和账户SAS使用存储账户密钥进行签名。
共享访问签名分为临时SAS和具有存储访问策略的服务SAS,详细请参考:https://docs.azure.cn/zh-cn/storage/common/storage-sas-overview?toc=/storage/blobs/toc.json#account-sas
- 临时SAS : 将在 SAS URI 中指定开始时间、到期时间和权限 (任何类型的 SAS 都可以用作临时 SAS)。
- 具有存储访问策略的服务SAS : 存储访问策略是针对资源容器(可以是 Blob 容器、表、队列或文件共享)定义的。 可以使用存储访问策略来管理一个或多个服务共享访问签名的约束。 将某个服务 SAS 与某个存储访问策略关联时,该 SAS 将继承对该存储访问策略定义的约束 — 开始时间、过期时间和权限 (用户委托SAS和账户SAS不支持存储策略)。
问题1:如何查到以前创建过多少SAS key
目前暂时无法查询以前创建过的SAS。
问题2:这些Key是否可以回收和限定?
账户临时SAS无法撤销,仅在设置的过期时间之内有效,服务SAS可以通过存储访问策略撤销服务SAS的权限。用户委托SAS可以通过CLI命令来撤销:https://docs.azure.cn/zh-cn/storage/blobs/storage-blob-user-delegation-sas-create-cli#revoke-a-user-delegation-sas
问题3:能否基于AAD身份对folder进行权限的设定和管理?
使用AzureAD对于Data Lake Storage Gen2进行控制,官方文档:https://docs.azure.cn/zh-cn/storage/blobs/data-lake-storage-access-control
https://docs.azure.cn/zh-cn/storage/blobs/data-lake-storage-explorer-acl
如果想要生成SAS,作为安全最佳做法,建议使用Azure AD凭据的方式,也就是用户委托SAS,而不要使用更容易透漏Storage Key的账户SAS和服务SAS。对于创建用户委托SAS您可以参考如下CLI命令:
az cloud set -n AzureCloud az login az storage container generate-sas --account-name xxxx_storage --name xxxx_container --permissions acdlrw --expiry 2022-03-02 --auth-mode login --as-user #撤销命令: az storage account revoke-delegation-keys --name xxxx_container--resource-group xxxx_group
使用 Power Shell创建服务SAS脚本,可以参考如下内容:
#Now we need to create Storage context $context = New-AzStorageContext -StorageAccountName your storage account name -StorageAccountKey your storage account key $StartTime = Get-Date $EndTime = $startTime.AddDays(1) $policy=New-AzStorageContainerStoredAccessPolicy -Container "your containe rname" -Policy "your stored access policy" -Permission rwd -StartTime $StartTime -ExpiryTime $EndTime -Context $context -Debug New-AzStorageContainerSASToken -Name "your container name" -Policy $policy -Protocol HttpsOrHttp -Context $context
Data Lake Storage Gen2 支持以下授权机制:
- 共享密钥授权
- 共享访问签名 (SAS) 授权
- 基于角色的访问控制 (Azure RBAC)
- 访问控制列表 (ACL)
共享密钥和 SAS 授权向用户(或应用程序)授予访问权限,不要求其在 Azure Active Directory (Azure AD) 中有标识。 使用这两种形式的身份验证时,Azure RBAC 和 ACL 不起作用。
Azure RBAC 和 ACL 都要求用户(或应用程序)在 Azure AD 中有标识。使用 Azure RBAC,可以授予对存储帐户数据的“粗粒度”访问权限(例如,对存储帐户中 所有 数据的读取或写入访问权限),而使用 ACL,可以授予“细粒度”访问权限,例如,对特定目录或文件的写入访问权限。
参考资料
- SAS最佳实践请参考:https://docs.azure.cn/zh-cn/storage/common/storage-sas-overview?toc=/storage/blobs/toc.json#best-practices-when-using-sas
- 存储访问策略:https://docs.azure.cn/zh-cn/storage/blobs/authorize-access-azure-active-directory
- 使用CLI创建用户委托SAS:https://docs.azure.cn/zh-cn/storage/blobs/storage-blob-user-delegation-sas-create-cli
- 对于判断SAS对Storage Account的操作,当开启 Storage Account 诊断日志后,诊断日志中会记录相应的请求:https://docs.azure.cn/zh-cn/storage/common/storage-analytics-logging?toc=/storage/blobs/toc.json
- Data Lake Storage Gen2 访问控制模型:https://docs.azure.cn/zh-cn/storage/blobs/data-lake-storage-access-control-model
- Data Lake Storage Gen2 访问控制列表ACL:https://docs.azure.cn/zh-cn/storage/blobs/data-lake-storage-access-control
- Data Lake Storage Gen2 是可以设置服务SAS:https://docs.azure.cn/zh-cn/storage/blobs/sas-service-create?tabs=dotnet#create-a-service-sas-for-a-directory
- 创建Storage Context:https://docs.microsoft.com/en-us/powershell/module/az.storage/new-azstoragecontext?view=azps-6.3.0
- 创建存储访问策略请参考:https://docs.microsoft.com/en-us/powershell/module/az.storage/new-azstoragecontainerstoredaccesspolicy?view=azps-6.3.0
- 创建SAS Token:https://docs.microsoft.com/en-us/powershell/module/az.storage/new-azstoragecontainersastoken?view=azps-6.3.0
- Power shell安装介绍:https://docs.azure.cn/zh-cn/storage/blobs/storage-quickstart-blobs-powershell
- Data Lake Storage Gen2访问控制模型详细:https://docs.azure.cn/zh-cn/storage/blobs/data-lake-storage-access-control-model