我正在尝试使用 Amazon S3 控制台将文件上传到 Amazon Simple Storage Service(Amazon S3)桶。但是,我遇到了“403 Forbidden”(403 禁止访问)错误。
简短描述
“403 Forbidden”(403 禁止访问)错误可能是由于以下原因造成的:
解决方法
检查您的 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/S3 作为默认加密密钥。这是因为无法修改 AWS 托管式密钥策略。
检查桶策略中是否存在显式拒绝语句
请按照以下步骤进行操作:
- 打开 Amazon S3 控制台。
- 从桶清单中,打开要上传文件的桶。
- 选择 Permissions(权限)选项卡。
- 选择 Bucket policy(桶策略)。
- 搜索带有 "Effect": "Deny" 的语句。
- 查看这些语句,确保它们不会阻止上传文件到桶的操作。
**重要事项:**在保存带有 "Effect": "Deny" 的桶策略之前,请务必检查是否有任何语句阻止访问 S3 桶。如果您无法访问 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),则这将会将相关 S3 对象设为公共。如果为此账户或桶启用了 S3 屏蔽公共访问权限功能,则您的上传请求将被拒绝。
注意: 除非您的用例需要,否则不推荐将对象设为公共。
要成功将对象作为公共对象上传,请根据需要修改 S3 屏蔽访问功能。如果您的用例不要求将对象设为公共对象,请从 PUT 请求中删除上述公共 ACL。
要在账户级别配置 S3 屏蔽公共访问权限设置,请参阅配置账户的屏蔽公共访问权限设置。要在桶级别配置设置,请参阅配置 S3 桶的屏蔽公共访问权限设置。另请参阅“公共”的含义。
查看 AWS Organizations 的服务控制策略
如果您使用 AWS Organizations,请检查其服务控制策略是否明确拒绝 S3 操作。如果是,请根据需要修改策略。
相关信息
如何解决来自 Amazon S3 的 403 Access Denied(访问被拒绝)错误?
如何解决当我尝试修改 Amazon S3 中的桶策略时出现的错误“You don't have permissions to edit bucket policy”(您无权编辑桶策略)?