Env*_*vek 2 amazon-web-services pre-signed-url aws-api-gateway sigv4
我正在尝试生成指向 API 网关(使用 IAM 身份验证)的预签名链接,因此客户端可以访问我在此 API 网关后面的 Lambda 函数之一,而无需对请求进行身份验证。这主要是为了方便客户端,因此它可能会透明地使用响应中的一些链接,无论它们指向同一个经过身份验证的 API 网关、某个 S3 存储桶还是 Internet 中的任意 URL。
为此,我使用查询参数制作 API 签名 v4(请参阅文档和示例)
因此,如果我尝试签署以下针对us-west-2区域和execute-api服务范围的链接:
https://example.com/some/path?some=params
Run Code Online (Sandbox Code Playgroud)
我将得到以下结果(使用 Node.jsaws4库,但在这里无关紧要):
https://example.com/some/path?some=params&
X-Amz-Security-Token=<Session Token Removed>
X-Amz-Date=20210330T180303Z&
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=<Access Key Removed>%2F20210330%2Fus-west-2%2Fexecute-api%2Faws4_request&
X-Amz-SignedHeaders=host&
X-Amz-Signature=884f132ad6f0c7a850e6b1d22b5fed169c13e2189b6e0d0d568d11f967f4a8bd
Run Code Online (Sandbox Code Playgroud)
它有效!但只有在一代后的前 5 分钟......
五分钟过去后,我将收到以下错误响应:
https://example.com/some/path?some=params
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅对此问题的回复。
我尝试X-Amz-Expires使用各种值(小于和大于 300 秒)添加文档中提到的查询参数,但没有运气:行为不会改变。
对于由 IAM 实例凭证生成的链接,我至少需要几个小时,最多需要6 个小时,因为链接正在由另一个 Lambda 函数签名。
有没有办法增加 API Gateway 访问的预签名链接有效期?
这是一个非常有趣的问题!起初,我认为X-Amz-Expires所有服务(包括 API 网关)都支持的 S3 文档中清楚地记录了这一点。[1][2]
经过一番研究,发现除了S3之外的其他服务是否支持该X-Amz-Expires参数并不是很清楚。
有各种消息来源声称只有 S3 遵守该参数。以下是在 aws-sdk for go 上工作的 AWS 员工的声明:
过期时间仅与 S3 服务相关。其他服务有自己固定的过期时间。通常这是 15 分钟,但看起来 IoT 数据服务使用了 5 分钟的到期时间。[3]
他们跟进了:
SDK 没有任何可用的元数据数据来提供哪些服务使用或不使用到期值。[4]
然后在GitHub上对应的源代码中添加注释:
所有其他 AWS 服务将使用 15 分钟的固定到期时间。[5]
有大量示例表明 AWS 正在将参数用于 S3 服务,例如 [1][6]。但是,AWS 文档中也有一些示例显示了 IAM 服务参数的使用,例如 [7][8]。这是非常令人困惑的。
AWS 的一位 SDE 发表评论可追溯到 2018 年,他在评论中做出了同样令人困惑的观察 [9]:
如果 S3 是唯一支持此标头的服务,我同意应更新 SDK 的文档以反映这一点 - 在 S3 的 SigV4 文档中此标头的描述中包含一条注释,说明此标头专用于此服务的预签名 URL乐于助人。
FWIW 我与来自 AWS Auth 的一些人进行了交谈,他们知道使用标头的唯一服务是 S3(有趣的是您找到了使用 IAM 的代码示例)。他们建议 STS 预签名 URL 的 15 分钟到期时间不会改变。
另一位前 AWS 员工进一步注意到:
我能够在 AWS SDKs for Go 和 PHP 上使用 EC2、IAM、STS 和 Route 53 的预签名 URL 重现此行为。我观察到的唯一一项在“x-amz”中指定的时间后使预签名 URL 失效的服务-expires” 标头(而不是默认的 15 分钟)是 S3。
因此,我想不可能增加 API 网关访问的预签名链接有效期。我认为 AWS 没有设计签名签名算法来支持您的用例。我认为 S3 预签名 URL 操作是 AWS 允许延长到期期限的罕见例外之一。
在查看他们以这种方式创建签名算法背后的动机时,我注意到他们试图最小化重放攻击的攻击面:
防止潜在的重放攻击
在大多数情况下,请求必须在请求时间戳的五分钟内到达 AWS。否则,AWS 会拒绝该请求。[10]
还有一些资源 [11] [12] 得出的结论是,让客户选择较长的到期值会破坏该参数的原始安全目的。
我认为没有通用的方法来创建一个面向 AWS 服务的 REST API 的预签名 URL 并在未来很长一段时间内执行它。
如果我处于您的位置,我会使用 JWT 和 API Gateway Lambda 授权方来实施自定义身份验证策略。[13] 这样你就可以自己控制签名算法,特别是它的到期时间。我想补充一点,JWT 与 AWS 签名查询字符串参数一样是 URL 安全的。[14]
[1] https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
[2] https://docs.aws.amazon.com/general/latest/gr /sigv4-add-signature-to-request.html
[3] https://github.com/aws/aws-sdk-go/issues/2304#issuecomment-441755864
[4] https://github.com/aws / AWS-SDK-GO /问题/ 2304#issuecomment-441758599
[5] https://github.com/aws/aws-sdk-go/blob/6212dfa8032336d438c526c086918c8d2ceb6432/aws/request/request.go#L310
[6]的https ://github.com/mhart/aws4/blob/master/aws4.js#L130
[7] https://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html
[8]https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html
[9] https://github.com/aws/aws-sdk-go/issues/ 2167#issuecomment-428764319
[10] https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html
[11] https://aws.amazon.com/de/articles/making-secure- requests-to-amazon-web-services/?nc1=h_ls(“重放攻击”部分)
[12] /sf/answers/858718591/
[13] https://docs.aws.amazon。 com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html
[14] /sf/answers/3939176671/
| 归档时间: |
|
| 查看次数: |
448 次 |
| 最近记录: |