PHP - 如何缓存从 AWS KMS Parameter Store 检索的数据库凭证

问题描述

我正在运行一个 PHP 应用程序,该应用程序使用用户名和密码连接到 RDS 数据库以向客户端提供数据。 用户名和密码是使用 AWS SSM 客户端从 AWS KMS 中作为加密字符串检索的。 我对 PHP 应用程序的每个请求都执行此操作,以打开与数据库的连接。

所以流程看起来像这样

传入请求 -> 从 AWS 检索数据库凭证 -> 打开数据库连接 -> 查询 -> 返回数据

在此流程中,每个请求都发送到 AWS 以获取数据库凭证,使用 KMS 对安全字符串进行解密,最终结果是 KMS 的高使用率导致更高的账单。 它还为每个 API 请求引入了延迟。

我想知道是否有一些 PHP 缓存库可以用来在 EC2 实例本地安全地存储凭证,这样我就不需要一直获取它。

我阅读了很多论坛,我看到有些人说将它们存储在 root 之外的文件中,甚至 .env 也可以存储在 root 之外的文件中,其他人说使用 memcache,但大多数人们说缓存凭据只是一种行不通的模式。

我知道没有 100% 安全这样的东西,但是任何有关缓存凭据的建议以及用于 PHP 的流行工具都将不胜感激。

解决方法

事实证明,高额账单是由于使用 KMS 进行解密的安全字符串参数过多造成的。 我将大部分参数转换为普通字符串类型,只留下敏感字符串作为加密类型,从而降低了 KMS 的使用率。 在 AWS 文档中,我忽略了“Parameter Store 不收取任何费用来创建 SecureString 参数,但使用 AWS KMS 加密的费用确实适用”的地方 同样对于缓存库,我发现 phpfastcache 真的很容易使用。但是,我决定暂时保持原样,因为随着 KMS 使用量的减少,KMS 定价似乎合理。

,

也许您可以将您的凭据存储在快速访问的 Redis 实例中,这样您就不会持续访问 KMS 和 SSM Parameter Store 服务,但在这种情况下,我建议您在 Redis 中放置一个非常低的 TTL,以便这些凭证可以在短时间内失效以避免任何安全事件。使用此解决方案,您可以实现单例模式,该模式始终从 redis 请求凭据,如果没有凭据,则从 SSM 请求凭据并临时存储它们以备后用。

** redis 实例应该与服务器/应用程序有直接信任关系,以减少安全事件。