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

时间:2019-07-30 22:19:37

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

Answer没有帮助


s3存储桶Vectorize()的资源策略是:

x <- c("hello", "my", "world")
charToRawVec <- Vectorize(FUN = charToRaw, vectorize.args = "x")
charToRawVec(x)

bucket1的IAM政策是:

{
    "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工作正常

在将文件复制到本地文件夹时执行 { "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::bucket1", "arn:aws:s3:::bucket1/*" ], "Effect": "Allow" } 后发生错误

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


如何使资源策略允许执行s3Upload()

1 个答案:

答案 0 :(得分:2)

这里几乎没有问题。首先,您的存储桶策略文档不是有效的json,但我认为在应对过程中发生了错误。

aws s3 cp s3://url不能仅仅因为存储桶策略阻止了它(在这种情况下是预期的行为)而起作用。请注意,明确拒绝总是赢。如果HTTP请求中缺少服务器端加密头,则您的存储桶策略会拒绝任何上传。无论您如何定义附加到用户的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,但您仅指定了该存储桶中的对象-"Resource": "arn:aws:s3:::bucket1/*”而不是存储桶本身-"Resource": "arn:aws:s3:::bucket1”,则您拒绝所有s3操作,因此您的语句仅适用于对象级别操作。这是预期的行为吗?如果您想同时拒绝未使用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": [
            "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"
        }
    ]
}

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

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