如何使用 Python 中的用户委派密钥为 blob 存储生成 SAS URL

How to generate SAS URLs for blob storage using User Delegation Key in Python

我正在尝试生成 SAS URLs to read blobs using a user delegation key and the Azure SDK for Python

以下代码在我使用存储帐户密钥时有效,但在我尝试使用用户委托密钥时失败。

import datetime as dt
import json
import os
from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
    BlobClient,
    BlobSasPermissions,
    BlobServiceClient,
    generate_blob_sas,
)

credential = DefaultAzureCredential(exclude_shared_token_cache_credential=True)
    
storage_acct_name = "XYZ_storage_account"
container_name = "XYZ_blob_container"
blob_name = "xyz_data.json"

url = f"https://{storage_acct_name}.blob.core.windows.net"
blob_service_client = BlobServiceClient(url, credential=credential)
udk = blob_service_client.get_user_delegation_key(
    key_start_time=dt.datetime.utcnow() - dt.timedelta(hours=1),
    key_expiry_time=dt.datetime.utcnow() + dt.timedelta(hours=1))

sas = generate_blob_sas(
    account_name=storage_acct_name,
    container_name=container_name,
    blob_name=blob_name,
    user_delegation_key=udk,
    #account_key=os.getenv("STORAGE_ACCOUNT_ACCESS_KEY"),
    permission=BlobSasPermissions(read=True),
    start = dt.datetime.utcnow() - dt.timedelta(minutes=15),
    expiry = dt.datetime.utcnow() + dt.timedelta(hours=2),
)

sas_url = (
    f'https://{storage_acct_name}.blob.core.windows.net/'
    f'{container_name}/{blob_name}?{sas}'
)

blob_client = BlobClient.from_blob_url(sas_url)
blob_data = blob_client.download_blob(encoding='UTF-8')
data = json.loads(blob_data.readall())

使用 UDK,出现以下错误:

“此请求无权使用此权限执行此操作。 ... ErrorCode:AuthorizationPermissionMismatch”

浮动存储帐户密钥对于安全性来说不是理想的选择,所以我更愿意使用 UDK。

在 Azure 门户中,我可以查看存储帐户 |访问控制 (IAM) |查看我的访问权限并看到我有角色“贡献者”,范围“订阅(继承)”。

docs 看来,“贡献者”应该授予要求“generateUserDelegationKey”权限,但是...

如评论中所述,为了通过用户委托密钥获得 SAS 令牌,用户应该具有存储帐户的适当 data 相关 RBAC 角色。

您收到此错误的原因是因为用户被分配了 Contributor 角色,该角色是 control plane RBAC 角色。控制平面 RBAC 角色旨在管理资源(如存储帐户本身)而不是其中的数据。为了管理数据,必须为用户分配适当的数据 RBAC 角色。

可在此处找到有关这些角色的更多信息:https://docs.microsoft.com/en-us/azure/storage/blobs/assign-azure-role-data-access?tabs=portal