角色分配策略中无法识别 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 角色名称的 Checkov 自定义策略

如何在 IAM 角色的信任策略中检查自定义 OpenID 声明?

GCP 等效于 aws 策略中的“拒绝”权限

AWS 任务角色策略的最佳实践

WordPress:具有自定义角色的用户无法访问 wp-admin

带有权限代码的 ASP.NET MVC 4 自定义授权属性(无角色)