【问题标题】:aws custom attributes not recognized in role assigned policy角色分配策略中无法识别 aws 自定义属性
【发布时间】: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 我没有,不能在这种意义上使用自定义属性。

标签: amazon-web-services amazon-s3 amazon-cognito amazon-iam


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 2020-11-20
    • 2018-03-02
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多