我在 AWS 上苦苦挣扎,试图找出我在这里遗漏了什么。我想让 IAM 用户能够从 S3 存储桶下载文件 - 而不是完全公开文件 - 但我被拒绝访问。如果有人能发现问题所在,我会很兴奋。
我目前所做的:
- 创建一个名为 my-user 的用户(为了举例)
- 为用户生成访问密钥并将其放在 EC2 实例上的 ~/.aws 中
- 创建了一个存储桶策略,我希望它能授予我的用户访问权限
- 运行命令
aws s3 cp --profile my-user s3://my-bucket/thing.zip .
存储桶策略:
{
"Id": "Policy1384791162970",
"Statement": [
{
"Sid": "Stmt1384791151633",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-bucket/*",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/my-user"
}
}
]
}
结果是A client error (AccessDenied) occurred: Access Denied
虽然我可以使用相同的命令和默认(根帐户?)访问密钥下载。
我也尝试添加用户策略。虽然我不知道为什么需要这样做,但我认为这不会有什么坏处,所以我将其附加到 my-user。
{
"Statement": [
{
"Sid": "Stmt1384889624746",
"Action": "s3:*",
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
结果相同。
答案1
我也在为此苦苦挣扎,但我在这里找到了答案https://stackoverflow.com/a/17162973/1750869这有助于我解决这个问题。下面重新发布答案。
您不必向所有人开放权限。使用以下源和目标上的存储桶策略,使用 IAM 用户从一个帐户中的存储桶复制到另一个帐户
要复制的存储桶 – SourceBucket
要复制到的存储桶 – DestinationBucket
源 AWS 账户 ID - XXXX–XXXX-XXXX
源 IAM 用户 - src–iam-user
以下策略意味着 – IAM 用户 - XXXX–XXXX-XXXX:src–iam-user 对 SourceBucket/* 具有 s3:ListBucket 和 s3:GetObject 权限,对 DestinationBucket/* 具有 s3:ListBucket 和 s3:PutObject 权限
在 SourceBucket 上,策略应该是这样的:
{
"Id": "Policy1357935677554",
"Statement": [
{
"Sid": "Stmt1357935647218",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::SourceBucket",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
},
{
"Sid": "Stmt1357935676138",
"Action": ["s3:GetObject"],
"Effect": "Allow",
"Resource": "arn:aws:s3::: SourceBucket/*",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
}
]
}
在 DestinationBucket 上,策略应该是:
{
"Id": "Policy1357935677554",
"Statement": [
{
"Sid": "Stmt1357935647218",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3::: DestinationBucket",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
},
{
"Sid": "Stmt1357935676138",
"Action": ["s3:PutObject"],
"Effect": "Allow",
"Resource": "arn:aws:s3::: DestinationBucket/*",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
}
]
}
要运行的命令是s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1
答案2
当我遇到同样的问题时,结果发现 AWS 要求启用服务器端加密。因此,以下命令对我来说成功了:
aws s3 cp test.txt s3://my-s3-bucket --sse AES256
答案3
即使您的 IAM 策略设置正确,您仍然可能会收到错误,例如An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denied
由于凭证上的 MFA(多因素身份验证)要求。这些可能会让您措手不及,因为如果您已经登录 AWS 控制台,您的凭证看起来工作正常,而来自 aws cli 的权限被拒绝错误消息并不是特别有用。
关于如何使用 aws cli 设置 MFA 已经有一些很好的说明:
基本上,您需要获取 MFA 设备的地址,并将其与设备中的代码一起发送以获取临时令牌。
答案4
我设法解决了这个问题,而不必编写策略 - 从 S3 控制台(Web UI)中我选择了存储桶,并在权限选项卡中选择了“任何经过身份验证的 AWS 用户”并标记了所有框。
更新:正如评论中指出的,“任何经过身份验证的 AWS 用户”不仅仅是您帐户中的用户,而是所有经过 AWS 身份验证的用户,请谨慎使用