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/