角色分配策略中无法识别 aws 自定义属性
Posted
技术标签:
【中文标题】角色分配策略中无法识别 aws 自定义属性【英文标题】:aws custom attributes not recognized in role assigned policy 【发布时间】:2021-04-18 13:40:32 【问题描述】:目标:通过认知用户池 + 身份池分配具有自定义属性的用户:tenantId 访问他自己在 S3 中的存储桶文件夹:s3://[tenantId]/*
我已配置:
具有客户属性tenantId 的用户池,并授予应用客户端对该属性的读取权限 附加了一个身份池 为经过身份验证的用户创建了一个角色并将其附加到身份池中通过登录页面,我检索到了一个有效的 idToken,并给出了这个 idToken,我执行了以下代码(没有错误处理等的简化示例):
const REGION = '...';
const USERPOOLID = '...';
const IDENTITYPOOLID = '...';
const BUCKET = '...';
const KEY = '...';
const TEST_JWT_ID_TOKEN = 'xxx.yyy.zzz';
AWS = require('aws-sdk');
AWS.config.region = REGION;
const cognitoIdentityObj =
IdentityPoolId: IDENTITYPOOLID,
Logins :
[`cognito-idp.$REGION.amazonaws.com/$USERPOOLID`]: TEST_JWT_ID_TOKEN
,
;
AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoIdentityObj);
AWS.config.credentials.get(function (err)
if (!err)
const accessKeyId = AWS.config.credentials.accessKeyId;
const secretAccessKey = AWS.config.credentials.secretAccessKey;
const sessionToken = AWS.config.credentials.sessionToken;
if (accessKeyId && secretAccessKey && sessionToken)
const AWS_S3 = new AWS.S3(accessKeyId, secretAccessKey, sessionToken);
const params =
Bucket: BUCKET,
Key : KEY
;
AWS_S3.getObject(params, function (err, data)
if (err)
// err is an Access Denied
console.error(err);
else
console.log(data);
)
)
TEST_JWT_ID_TOKEN 包含一个有效的 ID 令牌,并在用户登录时通过身份池附加到一个角色。该角色的政策具有以下定义:
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<BUCKET>/$cognito-identity.amazonaws.com:custom:tenantId/*"
]
]
但是,当我尝试从该存储桶中读取数据时,访问被拒绝,在策略中添加了一个资源行,如下所示:
arn:aws:s3:::<BUCKET>/*
成功了,所以我相当确定用户池、身份池、角色和策略的整个设置都在工作。但是属性: $cognito-identity.amazonaws.com:custom:tenantId 似乎没有得到识别/未评估或...
【问题讨论】:
似乎你想做受认知身份ID保护的s3?什么是变量“KEY”? 正确,通过cognito保护s3,变量KEY为存储内容的S3密钥(路径+文件/[tenantId]/folder/file.png) 你能找出原因吗?我在不识别自定义属性的政策方面面临同样的问题,但它适用于 $cognito-identity.amazonaws.com:sub 是的,自定义属性不能在 ARN 中使用……看看能不能找到那篇文章…… @GivenNyauyanga 我没有,不能在这种意义上使用自定义属性。 【参考方案1】:好吧,您需要在 IAM Authenticated Role 策略上添加策略条件,并限制 s3 策略上的委托人访问。查看可用的条件键Actions, resources, and condition keys for Amazon S3。在这种情况下我使用前缀键,在另一种情况下我将使用 ExistingObjectTag。
我从来不知道“cognito-identity.amazonaws.com:custom:tenantId”这个词。在我的项目中,我使用“cognito-identity.amazonaws.com:sub”作为身份角色 ID 参考,使用“cognito-identity.amazonaws.com:aud”作为组角色。
对于 IAM Authenticated Role 策略,我将声明如下:
"Statement": [
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Condition":
"StringLike":
"s3:prefix": ["$cognito-identity.amazonaws.com:sub"]
,
"Resource": "arn:aws:s3:::<BUCKET_NAME>"
,
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": ["arn:aws:s3:::<BUCKET_NAME>/$cognito-identity.amazonaws.com:sub/*"]
]
在 s3 策略上,我将仅限制经过身份验证的角色的主体访问权限:
"Statement": [
"Effect": "Allow",
"Principal":
"AWS": <IAM_AUTH_ROLE_ARN>
,
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<BUCKET_NAME>"
,
"Effect": "Allow",
"Principal":
"AWS": <IAM_AUTH_ROLE_ARN>
,
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<BUCKET_NAME>/*"
]
官方文档Amazon S3: Allows Amazon Cognito users to access objects in their bucket
【讨论】:
以上是关于角色分配策略中无法识别 aws 自定义属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IAM 角色的信任策略中检查自定义 OpenID 声明?