首页 > 解决方案 > 在 Lambda 中验证 AWS SIGv4 签名

问题描述

我们有一个无服务器后端,受 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(作为附加标头)。因此无法在后端重新计算签名。如何在后端验证签名以进行身份​​验证?

这篇文章可能是如何验证 AWS SigV4 签名的副本,但仍未得到答复。这个问题中建议的解决方案仍然需要 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

标签: amazon-web-servicesaws-sdkaws-api-gatewayamazon-iam

解决方案


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

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

使用会话令牌,您必须在请求标头中包含会话令牌,正如您所提到的(可能是因为否则没有人可以知道您使用哪个会话令牌进行签名;没有对应的AWS_SESSION_TOKEN_ID)。这意味着您实际上可以验证签名,但只能验证请求的完整性:您不知道该会话令牌是否实际上属于相关用户。

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


推荐阅读