【问题标题】:Exclude headers from s3v4 signature calculation从 s3v4 签名计算中排除标头
【发布时间】:2018-09-12 13:19:45
【问题描述】:

我们在 Intranet 网络中使用 onPrem S3 存储服务器,我们希望将此 Intranet url 公开给 Internet,因此我们使用了一个映射到 Intranet url 的代理。当我们测试 Intranet url 时,它运行良好,但是当我们测试 internet url 时,我们得到 403 错误:

我们计算的请求签名与您提供的签名不匹配。检查您的秘密访问密钥和签名方法。有关详细信息,请参阅 REST 身份验证和 SOAP 身份验证了解详细信息。 (服务:Amazon S3;状态代码:403;错误代码:SignatureDoesNotMatch;请求 ID:0a440c7f:15cc604b1e2:12d3af:24d;S3 扩展请求 ID:空),S3 扩展请求 ID:空

经过调试发现,proxy修改了用于计算签名的host header,以便将请求重定向到内网url...

所以我的问题是如何使用 AWS SDK 或 Boto3 客户端从 V4 签名计算中抑制某些标头。还是有更好的架构来公开 onPrem S3 服务。

提前致谢。 阿米尔。

【问题讨论】:

  • 什么是“onPrem S3 存储服务器”?你的意思是你已经实现了一个本地服务器来缓存来自 S3 的内容?
  • @jarmod 我怀疑它是具有 S3 兼容 API 的本地存储解决方案。
  • @Michael-sqlbot 是的,听起来就是这样,谢谢迈克尔。

标签: amazon-web-services amazon-s3 boto3


【解决方案1】:

基本上有两种解决方案。

第一个更简单:对内部 URL 的请求进行签名,然后只需使用简单的字符串前缀替换来重写签名 URL 的主机部分,使其指向外部代理的主机名。当代理重写 Host 标头时,它最终会将其重写回您签名的内容。

我认为,众所周知,签名 URL 不会被篡改,出于所有实际目的:您不能在不使签名 URL 失效的情况下更改关于签名 URL 的任何内容...但事实并非如此这是什么。更改是暂时的,代理的最终效果是撤消更改。

替代方案要求代理或链中的其他服务(在存储服务之前)知道签名密钥和秘密,以便它可以首先验证传入的请求,如果有效,则修改请求,然后生成一个服务将接受的新签名。我曾经编写了一个服务来执行此操作,以便当请求针对HEAD 时,代理将使用相同的密钥和秘密(它知道)为相同的请求生成签名,但使用GET。如果它与传入请求中的签名匹配,则代理将用HEAD 请求的签名替换现有签名——从而允许客户端使用最初为GET 请求签名的URL,以生成@ 987654326@ 或 HEAD 请求——S3 本身不支持的东西,因为同一对象的 GETHEAD 需要两个不同的签名 URL。不过,这个概念是相同的——在代理中为客户端请求的内容生成一个签名,以验证传入的签名,然后根据需要重新签署请求。我构建的解决方案使用 HAProxy 的 Lua 集成来检查和修改飞行中的请求。

【讨论】:

  • 感谢@Michael-sqlbot。确实,第一个解决方案听起来是一个简单而好主意,我会测试它并告诉你。
猜你喜欢
  • 1970-01-01
  • 2012-04-15
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2015-12-14
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多