当权限为 s3 时,S3 存储桶的 ListObjects 的访问被拒绝:*
AccessDenied for ListObjects for S3 bucket when permissions are s3:*
我得到:
An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
当我尝试从我的 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/*"
]
}
] }
我需要更改什么才能成功 copy
和 ls
?
您已授予对 S3 存储桶内的对象执行命令的权限,但未授予对存储桶本身执行任何操作的权限。
稍微修改您的政策如下所示:
{
"Version": "version_id",
"Statement": [
{
"Sid": "some_id",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::bucketname",
"arn:aws:s3:::bucketname/*"
]
}
]
}
但是,这可能会提供比所需更多的权限。遵循 Granting Least Privilege 的 AWS IAM 最佳实践看起来像这样:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucketname"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucketname/*"
]
}
]
}
我无法访问 S3,因为
- 首先我在实例上配置了密钥访问(启动后无法附加角色)
- 几个月都忘了
- 将角色附加到实例
- 已尝试访问。
配置的密钥的优先级高于角色,访问被拒绝,因为用户未被授予必要的 S3 权限。
解决方案:rm -rf .aws/credentials
,然后aws
使用角色。
您必须通过 "arn:aws:s3:::bucketname"
或 "arn:aws:3:::bucketname*"
为存储桶指定资源。后者是首选,因为它也允许对桶的对象进行操作。注意没有斜杠!
列出对象是对Bucket的操作。因此,需要采取行动 "s3:ListBucket"
。
向Bucket中添加对象是对Object的操作。因此,需要采取行动"s3:PutObject"
。
当然,您也可以根据需要添加其他操作。
{
"Version": "version_id",
"Statement": [
{
"Sid": "some_id",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::bucketname*"
]
}
]
}
尽管我有 "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"
}
]
}
然后我通过添加一行来修复它
"arn: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"
}
]
}
如果您想使用您提到的命令 "aws s3 cp s3://bucket-name/data/all-data/ . --recursive" 复制所有 s3 存储桶对象,这里有一个安全且最低限度的策略:
{
"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
希望对您有所帮助!
我以为错误是由于 "s3:ListObjects" 操作造成的,但我不得不添加操作 "s3:ListBucket"解决问题"AccessDenied for ListObjects for S3 bucket"
我遇到了同样的问题。我刚刚添加了凭据配置:
aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key
进入 "~/.aws/credentials" + 重新启动终端以获得默认配置文件。
在多profile的情况下--profile 需要添加arg:
aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}
其中 PROFILE_NAME:
.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"
可以找到有关如何配置凭据和多配置文件的更多信息here
运行 遇到了类似的问题,对我来说,问题是我在 bash_profile 中设置了不同的 AWS 密钥。
我在这里回答了一个类似的问题:
如果您的 bash_profile 中有冲突的 AWS 密钥,AWS CLI 默认使用这些密钥。
我尝试了以下方法:
aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}
这给了我错误:
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
使用此表单有效:
aws s3 ls {bucket name}
我有这个问题
我的要求是允许用户写入特定路径
{
"Sid": "raspiiotallowspecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucketname>/scripts",
"arn:aws:s3:::<bucketname>/scripts/*"
]
},
此更改解决了问题
{
"Sid": "raspiiotallowspecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucketname>",
"arn:aws:s3:::<bucketname>/*"
]
},
我添加的答案与已接受答案的方向相同,但有一些小(重要)差异,并添加了更多详细信息。
考虑以下配置:
{
"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
操作需要桶内对象的权限。
第一个资源元素为 ListBucket
操作指定 arn:aws:s3:::<Bucket-Name>
,以便应用程序可以列出存储桶中的所有对象。
第二个 Resource 元素为 PutObject
和 DeletObject
操作指定 arn:aws:s3:::<Bucket-Name>/*
,以便应用程序可以写入或删除存储桶中的任何对象。
出于安全原因,为了指定存储桶级别和对象级别的细粒度权限,分成两个不同的 'arns' 很重要。
请注意,如果我在第二个块中仅指定 GetObject
会发生什么,在编程访问的情况下我会收到如下错误:
Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
.
我比之前的任何答案都更喜欢这个。它展示了如何使用 YAML 格式并允许您使用变量来指定存储桶。
- PolicyName: "AllowIncomingBucket"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action: "s3:*"
Resource:
- !Ref S3BucketArn
- !Join ["/", [!Ref S3BucketArn, '*']]
要允许 s3 存储桶中的权限,请转到 s3 存储桶中的权限选项卡,然后在存储桶策略中将操作更改为此,这将允许执行所有操作:
"Action":"*"
我的问题是设置
env:
AWS_ACCESS_KEY_ID: {{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: {{ secrets.AWS_SECRET_ACCESS_KEY }}
再次,在 aws-sync GitHub 动作下作为环境变量。它们来自我的 GitHub 设置。尽管在我的例子中,我在上一步中扮演了一个角色,这将为我设置一些新的密钥到那些相同名称的环境变量中。所以我用坏的 GitHub 基本键覆盖了好的假定键。
如果您要担任角色,请注意这一点。
我遇到了同样的问题。我必须提供正确的资源和操作,资源是您的桶的 arn 和您所需权限的操作。另请确保您拥有正确的用户 arn。以下是我的解决方案。
{
"Version": "2012-10-17",
"Id": "Policy1546414123454",
"Statement": [
{
"Sid": "Stmt1546414471931",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789101:root"
},
"Action": ["s3:ListBucket", "s3:ListBucketVersions"],
"Resource": "arn:aws:s3:::bucket-name"
}
]
}
这是对我有用的政策。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket-name"
]
},
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucket-name/*"
]
}
]
}
好的,对于那些已经完成上述所有操作但仍然遇到此问题的人,试试这个:
存储桶策略应如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowBucketSync",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:PutObjectAcl",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::BUCKET_NAME",
"arn:aws:s3:::BUCKET_NAME/*"
]
}
]
}
然后保存并确保您的实例或 Lightsail 连接到 AWS Configure 上的正确配置文件。
第一个:
尝试在末尾添加 --recursive
,运气好吗?不行,试试下面的。
第二个:
好的,现在试试这个:--no-sign-request
所以它应该是这样的:
sudo aws s3 sync s3://BUCKET_NAME /yourpath/path/folder --no-sign-request
不客气
我在尝试在本地同步整个 s3 存储桶时遇到了类似的问题。对我来说,我的帐户强制执行了 MFA(多因素身份验证),这是通过 AWS CLI 发出命令时所必需的。
所以我的解决方案是 - 在使用任何 AWS CLI 命令时使用配置文件 (mfa documentation) 提供 mfa 凭证。
已开启MFA的亚马逊用户请使用:
aws s3 ls s3://bucket-name --profile mfa
.
并先 运行 准备配置文件 mfa
aws sts get-session-token --serial-number arn:aws:iam::123456789012:mfa/user-name --token-code 928371 --duration 129600
。 (替换 123456789012、user-name 和 928371)。
我得到:
An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
当我尝试从我的 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/*"
]
}
] }
我需要更改什么才能成功 copy
和 ls
?
您已授予对 S3 存储桶内的对象执行命令的权限,但未授予对存储桶本身执行任何操作的权限。
稍微修改您的政策如下所示:
{
"Version": "version_id",
"Statement": [
{
"Sid": "some_id",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::bucketname",
"arn:aws:s3:::bucketname/*"
]
}
]
}
但是,这可能会提供比所需更多的权限。遵循 Granting Least Privilege 的 AWS IAM 最佳实践看起来像这样:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucketname"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucketname/*"
]
}
]
}
我无法访问 S3,因为
- 首先我在实例上配置了密钥访问(启动后无法附加角色)
- 几个月都忘了
- 将角色附加到实例
- 已尝试访问。 配置的密钥的优先级高于角色,访问被拒绝,因为用户未被授予必要的 S3 权限。
解决方案:rm -rf .aws/credentials
,然后aws
使用角色。
您必须通过 "arn:aws:s3:::bucketname"
或 "arn:aws:3:::bucketname*"
为存储桶指定资源。后者是首选,因为它也允许对桶的对象进行操作。注意没有斜杠!
列出对象是对Bucket的操作。因此,需要采取行动 "s3:ListBucket"
。
向Bucket中添加对象是对Object的操作。因此,需要采取行动"s3:PutObject"
。
当然,您也可以根据需要添加其他操作。
{
"Version": "version_id",
"Statement": [
{
"Sid": "some_id",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::bucketname*"
]
}
]
}
尽管我有 "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"
}
]
}
然后我通过添加一行来修复它 "arn: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"
}
]
}
如果您想使用您提到的命令 "aws s3 cp s3://bucket-name/data/all-data/ . --recursive" 复制所有 s3 存储桶对象,这里有一个安全且最低限度的策略:
{
"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
希望对您有所帮助!
我以为错误是由于 "s3:ListObjects" 操作造成的,但我不得不添加操作 "s3:ListBucket"解决问题"AccessDenied for ListObjects for S3 bucket"
我遇到了同样的问题。我刚刚添加了凭据配置:
aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key
进入 "~/.aws/credentials" + 重新启动终端以获得默认配置文件。
在多profile的情况下--profile 需要添加arg:
aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}
其中 PROFILE_NAME:
.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"
可以找到有关如何配置凭据和多配置文件的更多信息here
运行 遇到了类似的问题,对我来说,问题是我在 bash_profile 中设置了不同的 AWS 密钥。
我在这里回答了一个类似的问题:
如果您的 bash_profile 中有冲突的 AWS 密钥,AWS CLI 默认使用这些密钥。
我尝试了以下方法:
aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}
这给了我错误:
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
使用此表单有效:
aws s3 ls {bucket name}
我有这个问题 我的要求是允许用户写入特定路径
{
"Sid": "raspiiotallowspecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucketname>/scripts",
"arn:aws:s3:::<bucketname>/scripts/*"
]
},
此更改解决了问题
{
"Sid": "raspiiotallowspecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucketname>",
"arn:aws:s3:::<bucketname>/*"
]
},
我添加的答案与已接受答案的方向相同,但有一些小(重要)差异,并添加了更多详细信息。
考虑以下配置:
{
"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
操作需要桶内对象的权限。
第一个资源元素为 ListBucket
操作指定 arn:aws:s3:::<Bucket-Name>
,以便应用程序可以列出存储桶中的所有对象。
第二个 Resource 元素为 PutObject
和 DeletObject
操作指定 arn:aws:s3:::<Bucket-Name>/*
,以便应用程序可以写入或删除存储桶中的任何对象。
出于安全原因,为了指定存储桶级别和对象级别的细粒度权限,分成两个不同的 'arns' 很重要。
请注意,如果我在第二个块中仅指定 GetObject
会发生什么,在编程访问的情况下我会收到如下错误:
Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
.
我比之前的任何答案都更喜欢这个。它展示了如何使用 YAML 格式并允许您使用变量来指定存储桶。
- PolicyName: "AllowIncomingBucket"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action: "s3:*"
Resource:
- !Ref S3BucketArn
- !Join ["/", [!Ref S3BucketArn, '*']]
要允许 s3 存储桶中的权限,请转到 s3 存储桶中的权限选项卡,然后在存储桶策略中将操作更改为此,这将允许执行所有操作:
"Action":"*"
我的问题是设置
env:
AWS_ACCESS_KEY_ID: {{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: {{ secrets.AWS_SECRET_ACCESS_KEY }}
再次,在 aws-sync GitHub 动作下作为环境变量。它们来自我的 GitHub 设置。尽管在我的例子中,我在上一步中扮演了一个角色,这将为我设置一些新的密钥到那些相同名称的环境变量中。所以我用坏的 GitHub 基本键覆盖了好的假定键。
如果您要担任角色,请注意这一点。
我遇到了同样的问题。我必须提供正确的资源和操作,资源是您的桶的 arn 和您所需权限的操作。另请确保您拥有正确的用户 arn。以下是我的解决方案。
{
"Version": "2012-10-17",
"Id": "Policy1546414123454",
"Statement": [
{
"Sid": "Stmt1546414471931",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789101:root"
},
"Action": ["s3:ListBucket", "s3:ListBucketVersions"],
"Resource": "arn:aws:s3:::bucket-name"
}
]
}
这是对我有用的政策。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket-name"
]
},
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucket-name/*"
]
}
]
}
好的,对于那些已经完成上述所有操作但仍然遇到此问题的人,试试这个:
存储桶策略应如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowBucketSync",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:PutObjectAcl",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::BUCKET_NAME",
"arn:aws:s3:::BUCKET_NAME/*"
]
}
]
}
然后保存并确保您的实例或 Lightsail 连接到 AWS Configure 上的正确配置文件。
第一个:
尝试在末尾添加 --recursive
,运气好吗?不行,试试下面的。
第二个:
好的,现在试试这个:--no-sign-request
所以它应该是这样的:
sudo aws s3 sync s3://BUCKET_NAME /yourpath/path/folder --no-sign-request
不客气
我在尝试在本地同步整个 s3 存储桶时遇到了类似的问题。对我来说,我的帐户强制执行了 MFA(多因素身份验证),这是通过 AWS CLI 发出命令时所必需的。
所以我的解决方案是 - 在使用任何 AWS CLI 命令时使用配置文件 (mfa documentation) 提供 mfa 凭证。
已开启MFA的亚马逊用户请使用:
aws s3 ls s3://bucket-name --profile mfa
.
并先 运行 准备配置文件 mfa
aws sts get-session-token --serial-number arn:aws:iam::123456789012:mfa/user-name --token-code 928371 --duration 129600
。 (替换 123456789012、user-name 和 928371)。