无法访问 S3 对象,即使所有迹象都表明我应该包括策略模拟器。为什么?

Cannot access S3 object even though all indications are that I should including policy simulator. Why?

我可以使用此策略将文件从组 Z 中的用户 A 上传到我的存储桶。组 B 中的另一个用户也在组 Z 中,因此具有相同的策略。但是,当我以 B 身份登录到 AWS 管理控制台时,我无法读取该文件。我特别困惑,因为根据策略模拟器,此策略(加上用户 B 拥有的管理员访问权限)应该完全允许 ​​B 看到有问题的文件。

相反,用户 B 仅获得 Access Denied

帮忙?我觉得我在这里遗漏了一些非常简单的东西。

我完整的(如果经过编辑)组策略是:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "s3:GetBucketLocation",
            "s3:ListBucket"
        ],
        "Resource": "arn:aws:s3:::my-bucket"
    },
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket/*",
            "arn:aws:s3:::my-bucket"
        ]
    }
]

}

我自动生成的存储桶策略是:

{
"Version": "2012-10-17",
"Id": "S3-Console-Auto-Gen-Policy-1645709424074",
"Statement": [
    {
        "Sid": "S3PolicyStmt-DO-NOT-MODIFY-1645709423946",
        "Effect": "Allow",
        "Principal": {
            "Service": "logging.s3.amazonaws.com"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::my-bucket/*"
    }
]

}

我的存储桶已启用阻止 Public 访问权限。

这里的问题是,即使您登录到 AWS 控制台,您的身份验证也不会扩展到通过 https://mybucket.s3.region.amazonaws.com/myfile.png 处对象的简单 HTTP GET 下载 S3 对象,如果您将 URL 粘贴到新标签页中。

相反,您可以生成并使用 S3 pre-signed URL 来下载对象。 pre-signed URL 是 time-limited 并使用您的密钥签名,因此它包含下载对象所需的所有身份验证。

您可以使用 S3 控制台、awscli 或任何 AWS SDK 生成 pre-signed S3 URL,例如:

aws s3 presign s3://mybucket/myfile.png

请注意,pre-signed URLs 的行为有点像不记名令牌。谁拥有 pre-signed URL 就可以使用它来下载对象,直到它过期。

您还可以使用 awscli(通过适当的身份验证)下载单个对象,甚至整个对象桶。