我正在尝试通过 Amazon S3 控制台将文件上传到 Amazon Simple Storage Service (Amazon S3) 存储桶。但是,我遇到了“403 Forbidden”错误。
简短描述
“403 Forbidden”错误可能由于以下原因而导致:
解决方法
检查您的 s3:PutObject 或 s3:PutObjectAcl 的权限
请按照以下步骤进行操作:
- 打开 AWS Identity and Access Management(IAM)控制台。
- 导航到用于访问桶的身份,例如 User(用户)或 Role(角色)。选择身份的名称。
- 选择 Permissions(权限)选项卡,然后展开每个策略,以查看其 JSON 策略文档。
- 在 JSON 策略文档中,搜索与 Amazon S3 访问相关的策略。然后,确认您拥有在桶上执行 s3:PutObject 或 s3:PutObjectAcl 操作的权限。
申请使用 AWS KMS 密钥的权限
要上传使用 AWS KMS 加密的对象,您必须拥有执行 AWS KMS 操作的权限。您必须至少能够执行 kms:Decrypt 和 kms:GenerateDataKey 操作。
**重要事项:**如果您要将对象上传到其他 AWS 账户中的存储桶,则不能使用 AWS 托管式密钥 aws/S3 作为默认加密密钥。这是因为您无法修改 AWS 托管式密钥策略。
检查存储桶策略中是否存在显式拒绝语句
请按照以下步骤进行操作:
- 打开 Amazon S3 控制台。
- 从存储桶列表中,打开要将文件上传到的存储桶。
- 选择 Permissions(权限)选项卡。
- 选择桶策略。
- 搜索带有 "Effect": "Deny" 的语句。
- 查看这些语句,确保它们不会阻止上传文件到桶的操作。
**重要事项:**在保存带有 "Effect": "Deny" 的存储桶策略之前,请务必检查是否存在任何拒绝访问该 S3 存储桶的语句。如果您被锁定,请参阅不小心拒绝所有人访问 Amazon S3 后如何重新获得访问权限?
以下示例语句显式拒绝访问 example-bucket 上的 s3:PutObject,除非上传请求使用 ARN 与 arn:aws:kms:us-east-1:111122223333:key 匹配的 AWS KMS 密钥给对象进行了加密:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ExampleStmt",
"Action": [
"s3:PutObject"
],
"Effect": "Deny",
"Resource": "arn:aws:s3:::example-bucket/*",
"Condition": {
"StringNotLikeIfExists": {
"s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/*"
}
},
"Principal": "*"
}
]
}
从您的请求中删除公共 ACL 或关闭 S3 屏蔽公共访问权限
如果您在 PUT 请求中传递了一个公共 ACL(例如 public-read 或 authenticated-read),则该公共 ACL 会将相关 S3 对象设为公共。如果为此账户或存储桶启用了 S3 屏蔽公共访问权限功能,则您的上传请求会被拒绝。
注意: 最佳做法是仅在您的使用案例需要时才将对象设为公共对象。
要成功将对象作为公共对象上传,请根据需要修改 S3 屏蔽访问功能。如果您的使用案例不要求将对象设为公共对象,请从 PUT 请求中删除上述公共 ACL。
要在账户级别配置 S3 屏蔽公共访问权限设置,请参阅为账户配置屏蔽公共访问权限设置。要在存储桶级别配置设置,请参阅为 S3 存储桶配置屏蔽公共访问权限设置。此外,有关公共访问权限设置的详细信息,请参阅“公共”的含义。
查看 AWS Organizations 的服务控制策略
如果您使用 AWS Organizations,请检查其服务控制策略是否显式拒绝 Amazon S3 操作。如果是,请根据需要修改此策略。
相关信息
如何解决来自 Amazon S3 的 403 Access Denied(访问被拒绝)错误?
如何解决当我尝试修改 Amazon S3 中的存储桶策略时出现的错误“You don't have permissions to edit bucket policy”?
排查 Amazon S3 中的 access denied (403 Forbidden) 错误