【问题标题】:Validate AWS SIGv4 signature in Lambda在 Lambda 中验证 AWS SIGv4 签名
【发布时间】:2019-09-18 00:18:07
【问题描述】:

我们有一个无服务器后端,受 API Gateway 中的 IAM 保护。我们有另一个内部身份验证解决方案,我们希望在我们的服务中支持这两种身份验证机制。我正计划编写一个具有支持多个身份验证的身份验证链的自定义授权器。

但是,我找不到任何方法来验证后端的 AWS Sigv4 签名。我找到了关于如何签署请求或计算 Sigv4 签名([1]、[2]、[3] 和 [4])的 AWS 文档,但是所有这些文档都是从客户端的角度来看的,其中客户端可以访问 ACCESS_KEY_ID、SECRET_ACCESS_KEY和 SESSION_TOKEN。当自定义授权器 lambda 将收到请求时,它将只有 ACCESS_KEY_ID(在 Authorization 标头中)和 SESSION_TOKEN(作为附加标头)。因此,无法在后端重新计算签名。如何在后端验证签名以进行身份​​验证?

此帖子可能与 How to verify AWS SigV4 signing 重复,但仍未得到答复。 Solution suggested 在这个问题中仍然需要 SECRET_ACCESS_KEY。

[1]https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html
[2]https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-examples-using-sdks.html
[3]https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html
[4]https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html

【问题讨论】:

  • 作为签名过程的一部分,密钥被输入到 hmac 算法中。要进行验证,必须重新运行签名过程并验证签名匹配。如果没有密钥,您将无法执行此操作。
  • 您知道 API Gateway 是如何做到的吗?它以某种方式验证了签名,对吧?
  • 它必须在某种程度上可以访问密钥,可能通过将请求传递给具有该信息但永远无法返回它的组件来完成,只是验证签名(并返回它计算 .. 因为 AWS 发回的错误消息将包括它的预期签名)

标签: amazon-web-services aws-sdk aws-api-gateway amazon-iam


【解决方案1】:

(警告:我在这里说得有些自以为是,并没有尝试自己实现这一点,只是违背了第一原则。)

我的理解是 SigV4 是对称加密,因为它使用的是对称的 HMAC。这意味着您的 lambda(不受信任的第 3 方)在没有密钥本身(在本例中为“秘密访问密钥”)的情况下无法验证签名。如果你有那个密钥,那么你就可以冒充那个用户。可能是不受欢迎的:P

使用会话令牌you have to include the session token in a request header, as you mentioned(可能是因为否则没有人知道您使用哪个会话令牌进行签名;没有对应的AWS_SESSION_TOKEN_ID)。这意味着您实际上可以验证签名,但只能验证请求的完整性:您不知道该会话令牌是否真的属于相关用户。

所以我认为除非 AWS 为你验证,否则你会被圈套。

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 2018-04-23
    • 2022-07-23
    • 2016-07-31
    • 2022-11-09
    • 2021-08-09
    • 2018-08-13
    • 2021-09-21
    • 2015-01-05
    相关资源
    最近更新 更多