【问题标题】:Cache JWKS in Lambda memory vs in temp在 Lambda 内存与临时缓存中缓存 JWKS
【发布时间】:2021-06-30 16:53:40
【问题描述】:

我目前正在为我的 Lambda 自定义授权函数使用 the Auth0 JWKS library 检索 JWKS 密钥。

正如this issue on the JWKS library 中所解释的,显然 JWKS 中内置的公钥 ID 缓存不适用于 lambda 函数,因此他们建议将密钥写入 tmp 文件。

cache=true 不起作用的原因有哪些?

据我所知,应该没有区别会阻止内存缓存与 lambda 函数一起使用,但允许在 tmp 文件夹上进行基于文件的缓存是合适的解决方案。

据我所知,唯一会发生的问题是容器速率限制 JWKS API 的产生,而不是使用创建的容器的内存进行缓存的行为。

在这种情况下,将此令牌外部存储在 Lambda 中的最佳模式是什么?

【问题讨论】:

  • 多么可怕的 github 问题......为什么没有解释或参考为什么原始缓存不起作用。我会用“是”回答你的第一个问题,第二个回答“好问题”,第三个回答“不知道(还)”。
  • @luk2302 正是我的想法。我对此感到非常困惑。是否有任何实现特定的原因来解释为什么 LRU(如果我没记错的话是某种形式的队列系统)缓存不会在 AWS lambda 的内存中保持活动状态?我认为真正的问题是,如果在规模上,打开新的 lambda 容器仍然会限制端点,那么最好将密钥缓存在 redis 之类的东西中。但这与默认缓存是否有效无关 - 更多的是一种优化以确保没有速率限制
  • 我想我会在 Github 上跟进这个问题,询问它为什么不起作用

标签: amazon-web-services aws-lambda jwt aws-api-gateway auth0


【解决方案1】:

有很多选择如何解决这个问题。各有优缺点。

首先,将密钥存储在内存或磁盘上 (/tmp) 在持久性方面具有相同的结果。两者都可通过调用对同一个 Lambda 实例

我建议将密钥存储在内存中,因为内存访问比从文件中读取(在每次请求时)要快得多。

以下是解决此问题的其他选项:

  1. 将密钥存储在 S3 中并在初始化期间下载
  2. 将密钥存储在 EFS 卷上,将该卷装载到您的 Lambda 实例中,在初始化期间从该卷加载密钥。
  3. 在初始化期间从 API 下载密钥。
  4. 使用 Lambdas 部署包打包密钥,并在 在初始化期间从磁盘加载它们。
  5. 将密钥存储在 AWS SSM 参数存储中并在初始化期间加载它们

您可能已经注意到,“初始化期间”阶段是所有这些解决方案中最重要的部分。您不想对每个请求都这样做。

选项 1 和 2 需要您构建的其他“应用程序”定期下载密钥并将它们存储在 S3 或 EFS 卷上。这是额外的努力,但在某些情况下对于更复杂的设置可能是一个好主意。

选项 3 基本上是您目前已经在做的事情,并且可能是简单用例的简单性和合理工程之间的最佳权衡。如前所述,您应该将密钥存储在内存中。

选项 4 是一种有效的“破解”方法,它是获取 Lambda 密钥的最简单方法。我绝不建议这样做,因为突然更改密钥将需要重新部署 Lambda,同时请求无法通过身份验证,从而导致停机。

选项 5 可以是选项 3 的有效替代方案,但需要由另一个应用程序(如选项 1 和 2)进行相同的密钥管理。因此它不一定适合简单的授权方。

【讨论】:

  • 无论如何感谢您的回答@Jens,我将选择选项 1 并使用 S3。当密钥由于向授权方提供不同的 ID 而无效时,我将请求新密钥并用该密钥替换 S3 文件 + 在每次初始化时将其加载到内存中
  • @Jordan 考虑让您的 Lambda 更新存储在 S3 中的密钥。这是不良的关注点分离。从安全的角度来看,授权者对这些密钥具有写访问权是错误的。此外,还可以制作包含错误kid 的恶意 JWT。然后,您将去下载 您的 新 JWKS,其中不包含 kid。这本身不会是一个安全问题,但如果你收到这样的请求 100 万次,它可能会成为一个问题。因此,当您知道它们已更改时,我只会在 S3 上轮换这些键。可能是您的 IDP 的 webhook?
  • 这是有道理的。该密钥只是用于验证而不是签名的公钥,但我可以理解,允许恶意用户向不正确的密钥发送垃圾邮件将是一个问题。不幸的是,Auth0 没有为密钥更改提供任何 webhook。我也许可以设置一个计划的 lambda,它定期 ping 它并在更新 S3 之前检查更改。这会是一个可靠的方法吗?
  • @Jordan 你可以检查一下:Stream Logs to AWS Eventbridge。显然,您可以将有关管理更改的事件发送到事件桥。我认为/希望包括管理员轮换密钥。这意味着,您可以创建一个 Eventbridge 规则来查找那些随后触发密钥更新 Lambda 的更改。我没有测试这个(还),但这可能是你正在寻找的。​​span>
  • 可能是完美的。我去看看,谢谢!甚至不知道那是在那里。今天第一次实现 Auth0,所以很有趣!再次感谢。否则,我将在 cronjob 或某种日程安排上实现某种活动观察者
猜你喜欢
  • 2012-12-19
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多