Answers:
从理论上讲,我倾向于以下列方式(按照强度递增的顺序)来考虑安全级别:
环境变量比纯文本文件更安全,因为它们是易失性/一次性的,不保存。即,如果仅设置一个本地环境变量(例如“ set pwd = whatever”),然后运行脚本,并且脚本末尾退出命令外壳,则该变量将不再存在。您的案件属于前两个案件,我想这是相当不安全的。如果要执行此操作,我建议您不要在直接的Intranet /家庭网络之外进行部署,而仅出于测试目的。
如前所述,一旦系统受到威胁,这两种方法都不会提供任何额外的“安全性”层。我相信,支持环境变量的最重要原因之一是版本控制:我已经看到太多的数据库配置等被意外地存储在像GIT这样的版本控制系统中,其他所有开发人员都可以看到(呵呵!我也是 ...)。
如果不将密码存储在文件中,则无法将其存储在版本控制系统中。
每当您必须存储密码时,它都是不安全的。期。无法安全地存储未加密的密码。现在,哪个环境变量与配置文件更“安全”可能值得商bat。恕我直言,如果您的系统受到威胁,那么它的存储位置并不重要,勤奋的黑客可以追踪到它。
cat /proc/1/environ
例如。
ps axe
。strace -e open ps axe
显示它是从那里获取此信息的,该信息/proc/[pid]/environ
具有权限执行(因此有open("/proc/19795/environ", O_RDONLY) = -1 EACCES (Permission denied)
)。
ps
是setuid,可以很高兴地向您展示几乎所有环境)。
抱歉,我没有足够的代表对此发表评论,但是我也想补充一点,如果您不小心,您的外壳程序也可能会在命令历史记录中捕获该密码。因此,$ pwd=mypassword my_prog
手动运行这样的操作并不像您希望的那样短暂。
read -s MY_PASS_VAR
它将保护免受炮弹历史搜索和肩膀冲浪者的攻击。
HISTCONTROL
设置为ignorespace
或的情况下ignoreboth
,才能在命令前加上空格作为前缀,因此从技术上讲可以将其打开/关闭。
我认为您应该尽可能将凭据存储在gitignored文件中,而不应作为环境变量存储。
在将凭证存储在ENV(环境)变量与文件中时,要考虑的一件事是,使用的任何库或依赖项都可以很容易地检查ENV变量。
可以通过恶意或不通过恶意方式进行此操作。例如,库作者可以将堆栈跟踪信息和ENV变量通过电子邮件发送给自己,以进行调试(不是最佳实践,但可以这样做)。
如果您的凭据在文件中,则很难深入了解它们。
具体来说,考虑节点中的npm。对于npm,如果要查看您的凭据是否在ENV中,则很简单process.ENV
。另一方面,如果它们在文件中,则还有很多工作要做。
您的凭据文件是否受版本控制是一个单独的问题。并非版本控制您的凭据文件将其暴露给更少的人。无需所有开发人员都知道生产凭据。由于这符合最小特权原则,因此我建议git忽略您的凭据文件。
这取决于您的威胁模型。
您是否在尝试防止用户在可能被忘记和处理不当的整个文件系统上散布密码?如果是这样,则是,因为环境变量的持久性不如文件。
您是否要防止直接针对您程序的恶意软件的侵害?如果是这样,则否,因为环境变量没有文件具有相同级别的访问控制。
就个人而言,我认为疏忽的用户比有动机的对手更常见,因此我会选择环境变量方法。