Azure AD工作负载身份联合SPIFFE/SPIRE验证权限错误求助
搭建Azure AD工作负载身份联合SPIFFE和SPIRE演示环境,按步骤执行后,令牌交换环节正常:
$ curl -XGET 20.83.89.207:80/exchanged {"token":"eyJ0sdfsdfsdfsdfsdfsdfsdfig","expiresOnTimestamp":1678485060000}
但使用交换得到的AD Token访问Azure Blob时,返回AuthorizationPermissionMismatch错误:
$ curl -XGET <workload svc ip>/<storage container>/<blob name>
错误详情:
"details":{"errorCode":"AuthorizationPermissionMismatch","content-length":"279","content-type":"application/xml","date":"Mon, 06 Mar 2023 15:40:45 GMT","server":"Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0","x-ms-client-request-id":"1d2cbecb-09b2-4395-93ee-918136ee2fbe","x-ms-request-id":"cf2283f1-d01e-003f-4642-5077a4000000","x-ms-version":"2021-10-04","message":"This request is not authorized to perform this operation using this permission.\nRequestId:cf2283f1-d01e-003f-4642-5077a4000000\nTime:2023-03-06T15:40:46.3857513Z","code":"AuthorizationPermissionMismatch"}}
已为主体分配Contributor、Storage Blob Delegator、Storage Blob Data Contributor等角色,问题仍未解决。
验证JWT令牌核心声明:用jwt.io解析交换得到的AD Token,检查以下字段:
aud:必须是https://storage.azure.com/(存储服务的资源ID),否则令牌无法用于Blob访问oid:确认该值与分配Azure RBAC角色的主体对象ID完全匹配scp/roles:需包含user_impersonation权限(对应Blob数据访问),或角色对应的权限声明
检查角色分配的范围与主体:
- 确认角色是分配到目标存储账户/容器级别,而非更高层级(如资源组)但未覆盖到目标Blob
- 确保角色分配的主体是令牌对应的身份(SPIFFE/SPIRE映射的Azure AD身份),而非其他用户/服务主体
确认存储账户Azure AD身份验证状态:
- 检查存储账户的Blob服务是否已启用Azure AD身份验证,未禁用或仅允许密钥/SAS访问
检查请求的身份验证头:
- 调用Blob时必须在请求头中携带令牌:
若遗漏该头,请求会以匿名方式发送,必然触发权限错误curl -H "Authorization: Bearer <AD_TOKEN>" -XGET <workload svc ip>/<storage container>/<blob name>
- 调用Blob时必须在请求头中携带令牌:
等待RBAC角色生效:Azure RBAC角色分配最长可能需要10分钟才能生效,确认已等待足够时间
内容的提问来源于stack exchange,提问作者Ranjit

