amazon-web-services - s3 - 调用 HeadObject 操作时发生错误 (403) : Forbidden

标签 amazon-web-services amazon-s3 amazon-iam aws-cli

Answer没有帮助


s3 bucket 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"
                }
            }
        }
    ]
}

bucket1 的 IAM 策略是:

   {
        "Action": [
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucket1",
            "arn:aws:s3:::bucket1/*"
        ],
        "Effect": "Allow"       
   }

s3Upload() 工作正常

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

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


如何让资源策略允许执行aws s3 cp

最佳答案

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

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

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

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

我注意到的其他事情:

这部分

"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket1/*”,
"Condition": {
    "Bool": {
        "aws:SecureTransport": "false"
    }
}

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

"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
    "arn:aws:s3:::bucket1”,
    "arn:aws:s3:::bucket1/*”
],
"Condition": {
    "Bool": {
        "aws:SecureTransport": "false"
    }
}

在这个部分

  {
        "Action": [
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucket1",
            "arn:aws:s3:::bucket1/*"
        ],
        "Effect": "Allow"       
   }

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

   {
        "Action": [
            "s3:GetObject"
        ],
        "Resource": "arn:aws:s3:::bucket1/*",
        "Effect": "Allow"       
   }

更新

获取对象时,请确保您指定了一些对象,而不仅仅是存储桶的 url。

这会起作用

aws s3 cp s3://bucket/file.txt .

这将因 403 错误而失败

aws s3 cp s3://bucket .

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

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

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

aws s3 cp s3://bucket . --recursive

关于amazon-web-services - s3 - 调用 HeadObject 操作时发生错误 (403) : Forbidden,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57280767/

相关文章:

c# - 如何使用 .NET 为 CloudFront 公开的 Amazon S3 生成签名 URL

twitter - 图片URL命名方案

node.js - 您应该为应用程序用户使用 AWS IAM 角色和权限吗?

amazon-web-services - 在哪里可以找到 AWS ARN 中服务和资源类型部分的可能值列表?

python - 带有 C 文件的 AWS Lambda 部署包

java - 使用 API 网关进行 Cognito 用户池身份验证和授权

objective-c - AWS IOS SDK 1.7.0 -> 架构 armv7s 的 undefined symbol :

amazon-s3 - 无法在Raspberry Pi 3上编译Riak

amazon-web-services - 如何只授予特定的 AWS "iam : putUserPolicy"权限?

amazon-web-services - 从HDFS将数据写入Kinesis流