不评估角色,但评估 S3 存储桶策略

Role isn't evaluated but S3 bucket policy is

最终目标

我正在使用 Cognito 身份池来授予用户读取 S3 存储桶的权限。这个想法是每个用户都有一个他们可以阅读的“文件夹”(前缀),他们不应该能够阅读其他任何人的文件夹。

总体设计

我的方法是:

现在,s3 存储桶有策略,角色也有策略(在下面)。 问题是仅评估 s3 策略。

详情

角色

角色名为“S3Stuff”

角色权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<bucket>",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "${cognito-identity.amazonaws.com:sub}/*"
                }
            }
        }
    ]
}

角色信任关系

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "cognito-identity.amazonaws.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "cognito-identity.amazonaws.com:aud": "us-east-1:<GUID>"
                },
                "StringLike": {
                    "cognito-identity.amazonaws.com:amr": "authenticated"
                }
            }
        }
    ]
}

S3 存储桶策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::720911909616:role/S3Stuff"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<bucket>"
        }
    ]
}

会发生什么

使用上面的 S3 配置,当我以用户身份登录 cognito 时,我可以列出存储桶的全部内容。当我向 s3 存储桶策略添加条件(如下所示)时,它可以正常工作(即我可以列出我应该能够访问的存储桶部分,以及我不能访问的部分)。同样在我将 s3 政策放在上面之前,它拒绝我访问。

条件

"Condition": {
    "StringLike": {
        "s3:prefix": "${cognito-identity.amazonaws.com:sub}/*"
    }
}

明确地说 我知道我 可以 将所有内容都放入 s3 策略中,但我想知道发生了什么以及 为什么。

为什么角色中的策略被绕过

这张照片是关键。我是从 AWS Learning thing 上的“Deep Dive with Security: AWS Identity and Access Management”获得的。

mislead 认为应用于请求的策略是所有策略的“least-privilege 并集”。这非常接近于正确,但它是 不正确的

  1. 已解析所有政策。
  2. 如果有一个明确的拒绝(“效果”:“拒绝”),那么整个事情都会被拒绝。
  3. 如果没有明确的拒绝,那么它会开始寻找隐含的拒绝(这是当政策没有让我做某事的“效果”:“允许”子句时)。 EXCEPT 基于资源的策略让您可以缩短对隐式拒绝的搜索。如果资源明确允许您,则您可以跳过:权限边界、会话策略和身份策略(包括角色和 IAM)。

如果您有一个基于资源的策略来批准一个操作,角色策略只有在明确拒绝时才有效。

关于我说的那部分,在我将 S3 政策放在我被拒绝访问之前,这可能是因为 cognito aud。我有一段时间使用了错误的 aud(被引用的 cognito aud 来自 cognito-identity pools not cognito user pools just in万一有人好奇)并最终弄清楚并使用了正确的。在将 aud 更改为正确的东西之前,我一定已经开始测试 s3 策略了。