为什么此 AWS IAM 策略仅适用于资源上的星号?

Fer*_*ndo 3 python amazon-s3 amazon-web-services amazon-iam boto3

我正在尝试使用一些 Python 代码下载我已经上传到 S3 的一些文件,但是我在尝试使用严格的策略时感到头疼。

我可以列出存储桶中的所有文件,但是当我尝试使用我认为正确的策略下载它们时,我得到 botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden

然后,当我尝试添加适用于 2 个不同存储桶的不同策略时,我添加了存储桶名称的一部分,然后是星号,出于某种原因,完全相同的事情起作用了。

那么有人可以告诉我为什么会发生这种情况吗?

例如,这就像一个魅力:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1499955913000",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::THE-BEGINING-OF-THE-NAME*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

但这不会:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1499955913000",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::THE-EXACT-COMPLETE-FULL-NAME"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果相关,我可以为下载添加 python 代码,但是这个问题似乎足够长,代码非常简单

Fer*_*ndo 8

似乎我只需要一些橡皮鸭调试,答案是我认为违反直觉,但很简单:

似乎 ARN 它不仅是 AWS 资源本身的标识符,而且还是它的内容。所以,在给权限的时候,需要给“桶”权限来列出它,给“内容”权限来下载它

这导致了这样的政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1499955913000",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::THE-EXACT-COMPLETE-FULL-NAME",
                "arn:aws:s3:::THE-EXACT-COMPLETE-FULL-NAME/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,它可以控制存储桶本身,没有星号,以及斜杠后面的任何内容