我得到:
在调用ListObjects操作时发生错误(AccessDenied): AccessDenied
当我试图从S3存储桶中获取文件夹时。
使用该命令:
aws s3 cp s3://bucket-name/data/all-data/ . --recursive
桶的IAM权限如下所示:
{
"Version": "version_id",
"Statement": [
{
"Sid": "some_id",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::bucketname/*"
]
}
] }
我需要改变什么才能成功复制和ls ?
如果需要复制所有s3桶对象,请使用“aws s3 cp s3://bucket-name/data/all-data/”命令。正如你提到的,这里有一个安全且最小的策略来做到这一点:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket-name"
],
"Condition": {
"StringLike": {
"s3:prefix": "data/all-data/*"
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucket-name/data/all-data/*"
]
}
]
}
此策略中的第一个语句允许列出特定桶的子目录中的对象。该资源需要是S3存储桶的arn,为了将列表限制为该存储桶中的子目录,您可以编辑“S3:prefix”值。
此策略中的第二条语句允许在特定子目录的桶中获取对象。这意味着“s3://bucket-name/data/all-data/”路径中的任何内容都可以复制。请注意,这不允许你从父路径复制,如“s3://bucket-name/data/”。
此解决方案专门用于限制AWS CLI命令的使用;如果您需要通过AWS控制台或API限制S3访问,则需要更多策略。我建议大家去https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/看看。
类似的问题可以在这里找到,这让我想到了我给出的解决方案。
https://github.com/aws/aws-cli/issues/2408
希望这能有所帮助!
我添加了一个与公认答案方向相同的答案,但有小的(重要的)差异,并添加了更多的细节。
考虑下面的配置:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::<Bucket-Name>"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
}
]
}
该策略授予编程式写-删除访问权,并分为两部分:
ListBucket操作提供了桶级别的权限,而其他PutObject/DeleteObject操作需要桶内对象的权限。
第一个Resource元素为ListBucket操作指定arn:aws:s3:::< bucket - name >,以便应用程序可以列出桶中的所有对象。
第二个Resource元素为PutObject指定arn:aws:s3:::< bucket - name >/*和DeletObject操作,以便应用程序可以写入或删除桶中的任何对象。
从安全角度考虑,为了指定桶级和对象级细粒度权限,将它们分离为两个不同的“arn”非常重要。
注意,如果我只在第二个块中指定GetObject,那么在编程访问的情况下,我将收到类似这样的错误:
Upload failed: <file-name> to <bucket-name>:<path-in-bucket>调用PutObject操作时发生错误(AccessDenied): AccessDenied。
我得到了相同的错误时使用策略如下,虽然我有“s3:ListBucket”s3:ListObjects操作。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetObjectAcl"
],
"Resource": [
"arn:aws:s3:::<bucketname>/*",
"arn:aws:s3:::*-bucket/*"
],
"Effect": "Allow"
}
]
}
然后我通过添加一行来修复它
“攻击:aws: s3::: bucketname”
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetObjectAcl"
],
"Resource": [
"arn:aws:s3:::<bucketname>",
"arn:aws:s3:::<bucketname>/*",
"arn:aws:s3:::*-bucket/*"
],
"Effect": "Allow"
}
]
}
如果在minio的新版本上突然出现这个错误,那么原因是桶访问策略默认值从2021版本更改为2022版本。现在在2022版本中,默认情况下所有的桶(新创建的和现有的)都将访问策略设置为私有-仅提供服务器凭据来访问它们是不够的-你仍然会得到如下错误(这里:返回到python minio客户端):
S3Error: S3 operation failed; code: AccessDenied, message: Access Denied., resource: /dicts, request_id: 16FCBE6EC0E70439, host_id: 61486e5a-20be-42fc-bd5b-7f2093494367, bucket_name: dicts
要在2022版本中回滚到以前的安全设置,最快的方法是在MinIO控制台中(或通过mc客户端)将桶访问访问策略更改为Public。