You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何隐藏S3与CloudFront内容?阻止目录列表泄露方法咨询

我之前也碰到过一模一样的问题,这种目录列表泄露确实挺头疼的,还好AWS提供了好几层防护手段,咱们一步步来解决:

1. 先把S3存储桶的列表权限彻底关掉(最关键)

问题的根源其实是S3默认允许桶列表访问,只要没做限制,任何人访问不带文件名的桶URL都会拿到XML目录。所以第一步必须锁死这个权限:

  • 更新桶策略:打开S3控制台,找到你的桶,进入「权限」→「桶策略」,添加一条拒绝所有用户(包括匿名)列表桶内容的规则。比如这样:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Deny",
                "Principal": "*",
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::你的存储桶名称"
            }
        ]
    }
    
    如果你之前有允许s3:ListBucket的策略,直接删掉或者用这条Deny规则覆盖就行。
  • 检查IAM权限:如果你的CloudFront用了Origin Access Identity(OAI)或者其他IAM角色,确保这些实体只被授予s3:GetObject权限,绝对不能有s3:ListBucket——哪怕是给CloudFront的权限,也只需要能获取文件,不需要列表。
2. 给CloudFront加一层防护,避免缓存或泄露

就算S3关了列表,有时候CloudFront可能缓存了之前的目录页面,或者转发请求时出问题,所以还要做这些配置:

  • 用OAC/OAI限制CloudFront权限:推荐用新版本的Origin Access Control(OAC),在CloudFront控制台的「源」设置里,把S3源的访问方式改成OAC,它会自动生成最小权限的策略,确保CloudFront只能拉取对象,不能列表桶内容。旧版的OAI也可以用,但OAC更灵活。
  • 配置自定义错误页面:当用户访问不带文件名的URL时,S3会返回403禁止访问,这时候可以让CloudFront把这个403重定向到你的网站首页或者自定义404页面,避免暴露任何S3的信息。操作路径是:CloudFront分发→「错误页面」→「创建自定义错误响应」,选择403状态码,把响应页面路径设为你的自定义页面(比如/404.html),响应状态码可以设为200或者404。
  • 禁用默认根对象(可选):如果你的CloudFront分发不需要根路径(比如cloudfront-domain.com/)返回任何内容,可以把「默认根对象」留空,这样访问根路径时直接触发403,不会尝试加载索引文件或者列表。
3. 额外的加固手段(推荐加上)
  • 给PDF文件统一加前缀/放子目录:比如把所有PDF都放在/assets/pdf/下面,然后在S3桶策略里只允许访问这个前缀下的对象,进一步缩小权限范围,就算有漏洞也只会影响这个目录。
  • 开启S3访问日志:在S3桶的「属性」里开启服务器访问日志,这样可以监控谁尝试访问目录列表,及时发现异常请求。
  • 用签名URL(如果需要授权访问):如果你的PDF不是完全公开的,可以用CloudFront签名URL或者S3预签名URL,只有拿到签名的合法用户才能访问,彻底杜绝匿名用户的未授权请求。

最后一定要测试:访问不带文件名的S3和CloudFront URL,应该返回403或者你设置的自定义页面,而不是XML目录;同时直接访问具体的PDF URL,确保能正常打开或下载。

内容的提问来源于stack exchange,提问作者Hellyar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:49:51