将密码作为环境variables(而不是纯文本)存储在configuration文件中是否安全?

我在rails,django(以及一些php)上工作了几个应用程序,其中一些我在其中开始做的事情之一就是在某些configuration文件中将数据库和其他密码存储为环境variables而不是纯文本或在settings.py,为Django的应用程序)。

在与我的一位合作者讨论这个问题时,他认为这是一个不好的做法 – 或许这看起来并不像最初那样完全安全。

所以,我想知道 – 这是一个安全的做法? 将密码作为纯文本存储在这些文件中是否更安全(当然,确保不要将这些文件保存在公共仓库或任何其他文件中)?

在更理论层面上,我倾向于从以下几个方面考虑安全层次(按照强度的增加顺序):

  • 没有安全。 纯文本。 任何知道在哪里寻找的人都可以访问这些数据。
  • 由混淆的安全。 您将数据(明文)存储在某个比较棘手的地方,比如环境variables,或者存储在一个看起来像configuration文件的文件中。 攻击者最终会弄清楚发生了什么,或者偶然发现。
  • 通过encryption提供的安全性是微不足道的,(想想凯撒密码!)。
  • encryption提供的安全性可以通过一些努力来打破。
  • 由encryption提供的安全性对于打破给定的当前硬件是不切实际的。
  • 最安全的系统是一个不能使用的系统! 🙂

环境variables比纯文本文件安全,因为它们是易失性/一次性的,不保存; 也就是说,如果只设置一个本地环境variables,如“set pwd = whatever”,然后运行该脚本,并在脚本结束时退出命令shell,则该variables不再存在。 你的情况属于前两个,我认为是相当不安全的。 如果你打算这样做,我不会build议在你的直接的Intranet /家庭networking之外部署,然后只用于testing目的。

如前所述,一旦您的系统受到威胁,这两种方法都不会提供任何额外的“安全”层。 我相信支持环境variables的最强有力的原因之一就是版本控制 :我已经看到了太多的数据库configuration等等,它们被偶然地存储在像GIT这样的版本控制系统中,供其他开发人员看到(和哎呀!我也是 …)。

不要将您的密码存储在文件中使它们无法存储在版本控制系统中。

任何时候你必须存储密码,这是不安全的。 期。 没有办法安全地存储未encryption的密码。 现在哪个环境variables与configuration文件更“安全”可能是有争议的。 恕我直言,如果你的系统受到了威胁,它的存储位置并不重要,勤奋的黑客可以追踪到它。

对不起,我没有足够的代表来发表评论,但我也想补充一点,如果你不小心,你的shell可能会在命令历史logging中捕获这个密码。 因此,手动运行诸如$ pwd=mypassword my_prog操作并不像您希望的那样是短暂的。