我们有一个无服务器后端,该后端在 API 网关中受 IAM 保护。我们有另一个内部身份验证解决方案,我们希望在我们的服务中支持这两种身份验证机制。我计划编写一个具有支持多个身份验证的身份验证链的自定义授权方。
但是,我找不到任何方法来验证后端的 AWS Sigv4 签名。我找到了有关如何签署请求或计算 Sigv4 签名([1]、[2]、[3] 和 [4](的 AWS 文档,但是所有这些文档都是从客户端的角度出发的,客户可以访问ACCESS_KEY_ID、SECRET_ACCESS_KEY和SESSION_TOKEN。当自定义授权方 lambda 收到请求时,它将只有ACCESS_KEY_ID(在授权标头中(和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
(警告:我在这里说了一点我的屁股,并没有尝试自己实现这一点,只是偏离了第一原则。
我的理解是SigV4是对称加密,因为它使用的是对称的HMAC。这意味着您的 lambda(不受信任的第三方(无法在没有密钥本身(在本例中为"秘密访问密钥"(的情况下验证签名。如果你有那个密钥,那么你就可以模拟那个用户了。可能是不受欢迎的:P
使用会话令牌,您必须将会话令牌包含在请求标头中,正如您提到的(可能是因为否则没有人知道您用哪个会话令牌对其进行签名;没有相应的AWS_SESSION_TOKEN_ID
(。这意味着您实际上可以验证签名,但只能验证请求的完整性:您不知道该会话令牌是否真的属于相关用户。
所以我认为除非AWS为你验证它,否则你会被箍。