我正在学习环境变量。例如,我知道如果我有一个秘密密码,我不应该将其编码在我的代码中。
据我了解,.env文件应该被用来加载秘密和环境变量。
存储变量的更安全的方法是使用 CLI 变量放命令。
所有这些的原因是为了避免您的密码和敏感数据被泄露给未经授权的人员。
现在假设我创建了一个网站,其中有一些 API 机密存储为 CLI 变量,并且黑客能够访问我的服务器,他只需输入命令即可轻松找出 API 机密和密码打印环境在 CLI 上。
使用 CLI 变量比将它们存储在 .env 文件中有什么优势?如何确保这些变量即使对陌生用户也是隐藏的。
答案1
存储变量的更安全的方法是使用 set 命令将其作为 CLI 变量。
不是。首先,这个命令实际上并没有店铺将它们持久化到任何地方;实际环境变量的另一个更重要的一点是它们与安全存储完全相反。它们的全部功能都基于每一个过程获取所有环境变量的免费副本 - 如果您在 Windows 上使用例如setx
使变量持久保留,那么实际上您运行的每个应用程序或工具都会自动获得一份副本,无论它是否要求。
当您看到.env
正在使用的文件时,通常它们要么仅专门加载到 Web 应用程序的环境中,要么根本不用作环境变量(仅模仿熟悉的 API,但实际上将变量加载到普通的旧字典/数组中)。在前一种情况下,变量仍可供 Web 应用程序直接生成的程序使用,但绝不提供给您的常规 SSH CLI – 尽管仍被称为“环境变量”,但这不是预期的用途。
(应用程序本身当然仍然可以访问它们 - 毕竟它需要知道 API 密钥才能使用 API,所以这是不可避免的。遵循推荐的编程实践,以减少攻击者找到运行它的方法的可能性printenv
;例如,不要将外部输入(如文件名)直接放入命令中。
根据您使用的 API,可以将应用程序一分为二 - 有点像微服务 - 这样前端就不会直接访问 API,而是始终通过另一个知道 API 密钥的服务,并且只允许前端执行非常具体的任务。)
答案2
秘密/密码/密钥管理是一个复杂的游戏,需要平衡你愿意投入的精力与风险。以下是一些示例:
- 通过命令行参数传递的秘密:系统上的任何用户都可以看到它们
- 从 text/.env 文件传入的机密:任何具有该文件读取权限的用户都可以窃取它们。如果您使用 CLI放命令,这些命令也会默认显示在你的命令历史记录中
- 从另一台服务器加载的机密:访问该服务器的凭据仍存储在本地
- 机密仅存储在内存中:具有 root 访问权限的用户可以访问和转储原始内存中的数据
如果有人控制了您的服务器,他们只需更改您的代码即可向他们发送密码(例如,窃取信用卡信息的常用方法)。
我建议不要在本地以纯文本形式存储主要机密,因为扫描文件获取密码非常简单。除此之外,一切都取决于你。一些不错的提高安全性的方法是:
- 使用某种加密的密钥库来保存本地机密:只需添加另一个步骤来访问真实密码即可阻止许多简单的攻击
- 使用外部服务器/服务来存储机密,以便只有本地访问权限的人无法轻易获取所有内容