在Lambda中验证AWS SIGv4签名

时间:2019-09-18 00:18:07

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

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

但是,我找不到任何方法来验证后端的AWS Sigv4签名。我找到了有关如何签署请求或计算Sigv4签名的AWS文档([1],[2],[3]和[4]),但是所有这些文档都是从客户端角度来看的,客户端可以在其中访问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

1 个答案:

答案 0 :(得分:0)

(注意:我在这里说我的屁股,并没有尝试自己实现这一点,只是遵循了首要原则。)

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

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

因此,除非AWS验证了您的身份,否则我认为您很受宠。