首页 > 其他分享 >解决访问 Amazon S3 对象时遇到的“访问被拒绝”错误

解决访问 Amazon S3 对象时遇到的“访问被拒绝”错误

时间:2023-08-24 23:33:51浏览次数:77  
标签:存储 s3 策略 S3 访问 Amazon 对象

作为 Amazon S3 的用户,在尝试访问 S3 存储桶中的对象时,您可能会遇到“访问被拒绝”错误。这些错误表示请求缺少执行所请求操作的有效凭证或权限策略。

在本博文中,我将介绍各种故障排除步骤和配置检查,以解决访问 S3 对象时遇到的“访问被拒绝”错误。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

 

使用 Amazon Systems Manager 自动化文档

亚马逊云科技提供了两个 Systems Manager 自动化文档,可以帮助诊断您的 S3 存储桶的访问问题:

AmazonSupport-TroubleshootS3PublicRead - 使用此文档检查您的S3存储桶的公有读访问问题。

AmazonSupport-TroubleshootS3AccessSameAccount - 使用此文档诊断从您自己的S3存储桶访问被拒绝的错误。

这些文档根据您的存储桶配置自动运行诊断并提供推荐解决方案。我强烈建议将它们用作首要的故障排除步骤。

要运行这些文档:

  1. 打开 Amazon Systems Manager 控制台,进入自动化部分

  2. 搜索文档名称。

  3. 点击“执行自动化”。

  4. 指定所需的参数,如 S3 存储桶名称。

  5. 查看结果并实施建议。

自动化文档将检查存储桶策略、对象所有权、用户凭据等方面以识别根本原因。这可以为您节省数小时的手动故障排除时间。

检查存储桶和对象的所有权

如果正在访问的对象与存储桶具有不同的所有者,可能会发生“访问被拒绝”错误。默认情况下,即使上传者将对象上传到您的存储桶,上传者也拥有该对象。

按照以下步骤检查对象所有权:

  1. 使用 Amazon CLI 获取您的账户的规范 ID:
aws s3api list-buckets --query "Owner.ID" 
  1. 获取对象所有者的规范 ID:
aws s3api list-objects --bucket mybucket --prefix myobject
  1. 如果ID不匹配,对象所有者必须授予您完全控制的 ACL:
aws s3api put-object-acl --bucket mybucket --key myobject --acl bucket-owner-full-control
  1. 通过将对象复制给自己来更新对象所有权:
aws s3 cp s3://mybucket/myobject s3://mybucket/myobject 

为了防止未来发生此问题,要求在对象上传上设置 bucket-owner-full-control ACL,并启用 S3 对象所有权

检查存储桶策略和 IAM 策略

仔细检查存储桶策略和 IAM 用户策略,查看是否存在可能无意中拒绝访问的语句。

要注意:

  • 包含多重认证、IP 地址、VPC 等条件的拒绝语句
  • 缺少诸如 s3:GetObject 或 s3:PutObjectAcl 之类的操作
  • ARN 中存在额外的空格或拼写错误
  • 过于限制性的主体元素

例如,此存储桶策略基于 VPC 拒绝访问:

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17", 
  "Statement": [
    {
      "Sid": "Statement1",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws-cn:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": "*"
    },
    {
      "Sid": "Statement2",
      "Action": [
        "s3:GetObject" 
      ],
      "Effect": "Deny",
      "Resource": "arn:aws-cn:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": "vpce-1a2b3c4d"
        }
      },
      "Principal": "*"  
    }
  ]
}

在上述策略中,Statement1 允许获取对象。 但如果请求不是来自 VPC 端点 vpce-1a2b3c4d,则 Statement2 拒绝相同的 GET 访问。 因此,在该 VPC 端点之外的用户将收到“访问被拒绝”错误。

而此策略缺少关键的 s3:PutObjectAcl 操作:

 
{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [ 
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws-cn:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": {
        "AWS": [
          "arn:aws-cn:iam::111122223333:user/Dave" 
        ]
      }
    }
  ]
}

上述策略仅允许 s3:PutObject 操作。 如果用户尝试使用 s3:PutObjectAcl 修改对象的 ACL,由于未许可该操作,他们将收到“访问被拒绝”错误。

理想情况下,运行亚马逊云科技策略生成器 工具来验证策略没有问题。

如果在标识上设置了 IAM 权限边界,也要检查它们。

检查 S3 公开访问阻止设置

如果在公开对象请求上获得访问被拒绝,请查看账户和存储桶级别的 S3 公开访问阻止设置。这些设置可以覆盖允许公开访问的权限。

使用 S3 控制台检查您的账户和存储桶上的这些设置。

审查用户凭证

确保访问存储桶的 IAM 用户或角色已配置了适当的凭证:

  • 对于 CLI,检查配置的凭证:
aws configure list
  • 对于 EC2,检查实例所附加的角色:
aws sts get-caller-identity
  • 对于通过 STS 获取的临时凭证,检查与所承担角色相关联的会话策略中的S3权限。

检查 VPC 端点策略

如果通过 VPC 端点 访问 S3,请确保端点策略授予所需的权限。该策略控制可以通过该端点访问的存储桶/对象。

例如:

 
{
  "Id": "Policy1234567890123",  
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws-cn:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws-cn:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Principal": "*"
    }
  ] 
}

上述 VPC 端点策略:

  • 允许在 DOC-EXAMPLE-BUCKET 存储桶中获取、放置和列出对象
  • 使用通配符允许访问该存储桶中的任何对象
  • 应用于通过 VPC 端点访问的所有委托人
  • 但仅允许访问 DOC-EXAMPLE-BUCKET 存储桶

检查 S3 访问点策略

如果使用 S3 访问点,访问点策略必须允许访问底层存储桶。 所以要检查访问点策略和存储桶策略。

检查缺失的对象

如果正在访问的对象在存储桶中不存在,S3 会返回“访问被拒绝”错误,而不是 404。检查对象是否实际存在:

aws s3api head-object --bucket mybucket --key myobject

如果它不存在,请解决实际的对象问题。

确认 KMS 加密密钥访问

如果使用 Amazon KMS (SSE-KMS) 加密的 S3 对象无法被拥有有效权限的用户访问,请确保:

  • KMS 密钥策略 授予所需的权限(例如 kms:Decrypt)
  • 如果 IAM 用户与 KMS 密钥不在同一账户中,IAM 策略也包含KMS权限

指定请求方支付参数

如果启用了存储桶的请求方支付,跨账户用户必须传递 --request-payer 参数:

aws s3 cp s3://mybucket/myobject . --request-payer requester

检查 Amazon Organizations 策略

验证 Amazon Organizations 服务控制策略允许您的账户访问 S3。 明确的拒绝策略将覆盖任何允许策略。

这涵盖了在 S3 对象上排查“访问被拒绝”错误时需要检查的主要方面。 一些要点:

  • 使用 Systems Manager 自动化文档自动诊断
  • 审查存储桶策略、对象所有权和访问点策略
  • 检查 IAM 权限以及 VPC 端点策略等资源策略
  • 如果使用临时令牌,验证凭证和会话策略
  • 检查对象是否存在及特殊字符

针对您的配置解决这些问题,您就可以访问 S3 对象而不会遇到任何“访问被拒绝”错误。如果您有任何其他故障排除提示,请在评论中让我知道!

参考文献

[1] 排查 Amazon S3 访问被拒错误

[2] Amazon S3 请求者支付

[3] Amazon S3 对象所有权

[4] 使用存储桶策略和用户策略

[5] Amazon KMS 密钥策略

文章来源:

https://dev.amazoncloud.cn/column/article/64e5c96384d23218430681e9?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=bokey

标签:存储,s3,策略,S3,访问,Amazon,对象
From: https://www.cnblogs.com/AmazonwebService/p/17655463.html

相关文章

  • C++面向对象、类和对象、访问控制限定符
    面向对象和面向过程面向过程:关注如何解决问题,以及解决问题的步骤面向对象:关注的解决问题的"人"即"对象",以及实现能解决问题的"对象"注意:面向对象的细节的本质上还是面向过程,因此面向对象不是解决问题的捷径,而是以更高的维度去思考问题面向对象的四个特性:抽象:先找出(想象)......
  • 办公网络访问k8s集群内部ip和域名
    本地k8s集群pod和办公网互通并实现域名解析背景在微服务场景下,研发团队在进行开发联调测试过程中,需要连接到k8s集群的注册中心中等中间件并和集群内的其他业务服务pod互相通信。网络基本情况网络类型ip段办公网络172.16.0.0/16Pod网络10.233.64.0/18Servic......
  • Electron,VUEJS3,Vite,TypesSript 开发环境配置
    Electron,VUEJS3,Vite,TypesSript开发环境配置项目早期是vue3+vite开发的,后期由于运营需求,要修改为Win安装包。方案还是比较多的:1.WPF-Webview由于目前只需要兼容win,所以可以选择WPF,但WPF需要WebView的,还需要本地架设服务。整体部署比较复杂以及需要熟悉C#与WPF相关开发。2.......
  • h5(html5)+css3前端笔记五
    盒子模型网页布局本质网页布局过程先准备好相关的网页元素,网页元素基本都是盒子Box。利用CSS设置好盒子样式,然后摆放到相应位置PS基本操作综合案例圆角边框盒子阴影文字阴影......
  • adocker yml如何操作才能让搭建的redis集群能通过外网访问ip+端口的集群所有信息
    要在Docker中操作以便通过外部网络访问Redis集群的IP和端口,您需要执行以下操作:首先,您需要创建一个DockerComposeYAML文件(docker-compose.yml),用于定义Redis集群的配置。在此文件中,您可以指定每个Redis节点的配置和网络设置。以下是一个示例配置:version:'3'services:redis1:......
  • Windows中Jenkins更新后无法访问Jenkins网页端
    问题:升级完Jenkins后发现无法访问网页端,利用指令重启出现报错日志:十月17,20225:02:11下午executable.MainverifyJavaVersion严重:RunningwithJavaclassversion52,whichisolderthantheMinimumrequiredversion55.Seehttps://jenkins.io/redirect/java-suppo......
  • Visitor Pattern-访问者模式
    C#中的访问者模式(VisitorPattern)是一种行为型设计模式,它将数据结构和数据操作分离,使得可以在不修改数据结构的前提下定义新的操作。访问者模式的核心思想是将数据结构和数据操作解耦,将数据操作封装到独立的访问者类中。数据结构定义一组元素,每个元素接受访问者的访问并调用相应......
  • springboot之RedisTemplate的访问单机,哨兵,集群模式
    springboot2默认已经使用了lettuce-core,没有使用jedis和Redisson,springboot1使用的是jedis。我使用的springboot版本是2.6.14。(对应的lettuce版本为6.1.10.RELEASE,对应jedis版本为3.7.1)<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactI......
  • word在线预览1.直接预览-格式问题(效果差)2.使用微软接口或第三方收费接口(必须是外网,可
    1.先介绍第一种方案(纯前端)npminstall以下依赖--save"@vue-office/docx":"^1.3.0", "@vue/composition-api":"^1.3.0","vue-demi":"^0.14.5",<template><divclass="app-container"......
  • VCSA7.0访问提示no healthy upstream
    问题:打开VCSA7.0登录页面提示“nohealthyupstream”解决方法:一、登录https://172.22.1.250:5480设备管理后台,发现整体运行状况有警示,按照提示先解决log盘空间问题, 1、登录esxi主机查询vcenter在那个ESXI主机上,然后登录vcenter主机,或者通过ssh连接vcenter主机。 2、编辑......