当客户端为 blobstorage 创建 sastoken 时限制权限

问题描述

我有一个 blobstorage,我可以在其中为外部合作伙伴放置文件以列出文件并阅读它们。我认为 SAS 令牌将是外部合作伙伴访问容器和读取文件的完美方式。

所以我创建了一个 SAS 令牌并意识到如果我不想每 10 分钟创建一次新的 SAS 令牌并将它们发送给合作伙伴,我需要将令牌的到期日期设置为更远的将来,那就是如果 sastoken 泄漏或令牌到期的那一天解决方案将停止工作,那就不好了。

为了解决这个问题,我可以让客户端通过使用 StorageSharedKeyCredential 类为他们提供访问密钥和帐户名来创建 sastoken。这很好用,也许非常好,因为现在是客户端决定 sas 令牌应该具有什么权限。所以客户端现在可以上传文件/创建容器等。

所以我的问题是:当客户端创建 sastoken 时,有什么方法可以限制 sas 令牌具有的权限类型,因此我们的外部合作伙伴只能读取/列出我决定的特定容器中的文件。>

最好的问候 马格努斯

解决方法

关于这个问题,我想你想知道如何创建service sas token。如果是,请参考以下代码。

BlobContainerClient containerClient=new BlobContainerClient(new Uri("https://{account_name}.blob.core.windows.net/{container_name}),new StorageSharedKeyCredential());

BlobSasBuilder sasBuilder = new BlobSasBuilder()
            {
                BlobContainerName =containerClient.Name,Resource = "c"
            };

            
sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddHours(1);
sasBuilder.SetPermissions(BlobContainerSasPermissions.Read);
sasBuilder.SetPermissions(BlobContainerSasPermissions.List); 
Uri sasUri = containerClient.GenerateSasUri(sasBuilder);
,

要授予特定容器权限,您可以执行以下操作:

找到您的容器,在设置边栏选项卡下选择访问策略,然后单击添加策略。选择要授予此特定容器的权限。此外,公共访问级别是容器级别。您可以参考讨论类似相关问题的Thread

enter image description here

还可以尝试 RBAC 在 Azure 存储上的工作方式。 只有为数据访问明确定义的角色才允许安全主体访问 Blob 或队列数据。 Owner、Contributor 和 Storage Account Contributor 等角色允许安全主体管理存储帐户,但不提供对该帐户内 Blob 或队列数据的访问。

您可以单独授予创建用户委托密钥的权限和数据权限。

https://docs.microsoft.com/en-us/rest/api/storageservices/get-user-delegation-key 在帐户级别执行,因此您必须在存储帐户范围内使用诸如 Storage Blob Delegator 内置角色之类的内容授予此权限。

然后,您可以仅授予用户应具有的数据权限,使用 blob 容器范围内的以下 3 个内置角色之一:

Storage Blob Data Contributor

Storage Blob Data Owner

Storage Blob Data Reader

然后可以生成用户委托令牌以在有限的时间内授予一部分用户权限,并且可以授予整个 blob 容器或单个 blob。 有关更多详细信息,您可以查看此 thread

并且您必须在存储防火墙中使用 VNet 规则或对存储的可信访问来限制同一区域的客户端的访问。

您可以查看此链接。

https://docs.microsoft.com/en-us/azure/storage/common/storage-sas-overview https://docs.microsoft.com/en-us/rest/api/storageservices/create-service-sas#permissions-for-a-blob