我最近正在准备安全专业考试,我遇到了一个问题,是选择使用参数存储来存储可以保存密码的 secret 数据库连接 URL,还是使用 Lambda 中的 KMS 加密环境变量。
IMO 环境变量是更可取的,因为否则对于每天调用数千或数十万次的 Lambda 函数,这可能会开始花费大量成本,甚至可能导致达到账户限制。
此外,每次调用获取参数都会增加延迟,这可能并不重要,但仍然会累加起来。总的来说,我希望看到为 Lambda 环境变量实现的引用语法解析为 AWS SSM 参数值,类似于现在为 SSM 和 secret 管理器的 Cloudformation 实现的内容。
但在此之前,考虑到增加的成本和延迟,为什么 SSM 优于使用 KMS 加密环境变量? (这是我在练习考试中看到的推荐)
最佳答案
This article有一些有用的要点:
- Hard to share configs across projects
- Hard to implement fine-grained access control
- [SSM Parameter Store] records a history of changes
所以使用SSM通常是一个更灵活的架构。也就是说,如果这些好处真的不适用于您,那么您仍然可以使用环境变量并减少延迟,正如您所指出的那样。与其说一个是错误的,不如说另一个是通常被认为更像是一种“架构良好”的方法。但具体情况可能需要其他实现方式。
This article提到它带来的更好的安全性。
"While this approach [using environment variables] is simple and straightforward, it comes with considerable security drawbacks - the secrets exist in plaintext in the environment. Any other process, library, or dependency running inside the process has access to the environment which has already been exploited multiple times."
安全性是一个重要的考虑因素,与不太安全的替代方案相比,为提高安全性所做的大部分工作都会带来延迟或处理成本。
需要考虑的其他一些想法:
关于aws-lambda - Lambda 的参数存储与加密环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64607075/