s3 - 调用 HeadObject 操作时发生错误 (403):禁止

ove*_*nge 4 amazon-s3 amazon-web-services amazon-iam aws-cli

回答没有帮助


s3存储桶的资源策略bucket1是:

{
    "Version": "2012-10-17",
    "Statement": [{
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::bucket1/*",
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket1/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption": "AES256"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket1/*",
            "Condition": {
                "Null": {
                    "s3:x-amz-server-side-encryption": "true"
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

IAM 政策是bucket1

   {
        "Action": [
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucket1",
            "arn:aws:s3:::bucket1/*"
        ],
        "Effect": "Allow"       
   }
Run Code Online (Sandbox Code Playgroud)

s3Upload()工作正常

aws s3 cp s3://url .将文件复制到本地文件夹时执行后出现错误

这是 s3 的 IAM 策略和资源策略之间的冲突。


如何让资源政策得以执行aws s3 cp

Mat*_*ava 7

这里有几个问题。首先,您的存储桶策略文档不是有效的 json,但我猜想在处理过程中发生了错误。

\n\n

aws s3 cp s3://url不起作用只是因为存储桶策略阻止了它,这在本例中是预期的行为。请注意,显式拒绝总是获胜。如果 HTTP 请求中缺少服务器端加密标头,您的存储桶策略将拒绝任何上传。无论您如何定义附加到用户的 IAM 策略,由于显式拒绝,该用户都将无法按原样使用上述命令。

\n\n

如果您想让它工作,您只需使用适当的标志在 CLI 命令中指定服务器端加密--sse AES256(将对象上传到 s3 存储桶时就是如此)。

\n\n

aws s3 cp s3://url --sse AES256

\n\n

我注意到的其他事情:

\n\n

在这一部分

\n\n
"Effect": "Deny",\n"Principal": "*",\n"Action": "s3:*",\n"Resource": "arn:aws:s3:::bucket1/*\xe2\x80\x9d,\n"Condition": {\n    "Bool": {\n        "aws:SecureTransport": "false"\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果请求未使用 HTTPS,但您仅指定了该存储桶中的对象("Resource": "arn:aws:s3:::bucket1/*\xe2\x80\x9d而不是存储桶本身)"Resource": "arn:aws:s3:::bucket1\xe2\x80\x9d,则您将拒绝所有 s3 操作,因此您的语句仅适用于对象级别操作。这是有意的行为吗?如果您想拒绝不使用 HTTPS 的对象级别操作和存储桶级别操作的所有操作,则需要将当前更改Resource

\n\n
"Effect": "Deny",\n"Principal": "*",\n"Action": "s3:*",\n"Resource": [\n    "arn:aws:s3:::bucket1\xe2\x80\x9d,\n    "arn:aws:s3:::bucket1/*\xe2\x80\x9d\n],\n"Condition": {\n    "Bool": {\n        "aws:SecureTransport": "false"\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且在本节中

\n\n
  {\n        "Action": [\n            "s3:GetObject"\n        ],\n        "Resource": [\n            "arn:aws:s3:::bucket1",\n            "arn:aws:s3:::bucket1/*"\n        ],\n        "Effect": "Allow"       \n   }\n
Run Code Online (Sandbox Code Playgroud)\n\n

Resource-中的这一行"arn:aws:s3:::bucket1"完全是多余的,因为"s3:GetObject"操作是对象级别操作,并且您的语句不包含任何存储桶级别操作。您可以自由地删除它。所以它应该看起来像这样

\n\n
   {\n        "Action": [\n            "s3:GetObject"\n        ],\n        "Resource": "arn:aws:s3:::bucket1/*",\n        "Effect": "Allow"       \n   }\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新

\n\n

获取对象时,请确保指定某个对象,而不仅仅是存储桶的 url。

\n\n

这会起作用

\n\n
aws s3 cp s3://bucket/file.txt .\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将失败并出现 403 错误

\n\n
aws s3 cp s3://bucket .\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想使用上述命令同时下载多个文件,您将需要做两件事。首先,您需要更新 IAM 权限以包含s3:ListBucket在存储桶中。

\n\n
{\n    "Version": "2012-10-17",\n    "Statement": [\n        {\n            "Sid": "VisualEditor0",\n            "Effect": "Allow",\n            "Action": "s3:GetObject",\n            "Resource": "arn:aws:s3:::bucket/*"\n        },\n        {\n            "Sid": "VisualEditor1",\n            "Effect": "Allow",\n            "Action": "s3:ListBucket",\n            "Resource": "arn:aws:s3:::bucket"\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二件事,您需要--recursive在命令中指定标志cp

\n\n
aws s3 cp s3://bucket . --recursive\n
Run Code Online (Sandbox Code Playgroud)\n