Linux - 保护环境变量

时间:2010-11-09 01:14:44

标签: linux security bash

只是想知道是否有任何方法可以保护* nix系统中的环境变量,使得它们无法从任何纯文本文件中读取,但在环境中可用。

我知道我们总是可以使用.bashrc / .bash_profile的文件系统级别权限,但如果要完全隐藏某些变量(如数据库密码)呢?

一种方法是将某种程序/ perl脚本写入:

  1. 从纯文本文件中获取输入并加密/散列内容(然后删除纯文本文件)
  2. 使用相同的方法解密文件运行时并从解密的输出中导出值 (我知道这个程序可以用来在某处转储解密的值,但我现在并不关心)
  3. 还有其他更好,更明显的方法来实现这个目标吗?

    谢谢!

    -Gaurav

3 个答案:

答案 0 :(得分:5)

没办法。即使您将其隐藏在文本文件中,它仍然可以从/proc/<pid>/environ(linux)或ps e(其他unix)获得。

答案 1 :(得分:2)

你是谁来保护他们的?

简短的回答是“不”。用户可以看到他们自己的环境变量,除非你把它们装瓶得太彻底,以至于他们永远无法访问shell。但是你让他们使用哪个编辑器?你说'vim'了吗?哦,毕竟他们可以进入外壳。

答案 2 :(得分:1)

这是可能的,但非常间接。您需要将敏感数据保存到一个文件中,该文件只能由启动环境变量中需要它的进程的进程读取。 /proc/###/environ只能由正在运行进程的用户读取,因此数据在那里是安全的。

但是,更直接地说,隐藏数据库密码之类的东西的正确方法是将它们保存在只能由读取它们的程序运行的用户和/或组读取的文件中。不要在环境变量中传递它们(除非你真的需要出于某种原因),只需让进程从文件中读取它们。

例如,如果您正在运行一个Web站点并且Apache以启动用户:group apache:apache启动CGI脚本/二进制文件,请将CGI所需的数据库密码保存到{{0}所拥有的文件中。 {1}}拥有apache:apacherw-r-----)等权限。这样,对于有人阅读文件,他需要是640root组的成员,或者使用有效用户或apache组运行读取程序。

使用环境变量的唯一好处是可以在启动子进程之前将其从环境中删除,而如果子进程由同一用户拥有,则可以读取安全文件。