2010-11-09 134 views
5

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

我知道我们总是可以对.bashrc/.bash_profile使用文件系统级权限,但是如果某些变量(如db密码)要完全隐藏,该怎么办?做

一种方式是写某种程序/ perl脚本的:从一个纯文本文件

  1. 采取输入和加密/哈希的内容(然后摆脱纯文本文件)
  2. 使用相同的解密文件运行,并从解密的输出 (我知道这个程序可以用来某处转储解密的值,但是我现在我不关心那个)
出口值

有没有其他的b etter和更明显的方式来实现这一目标?

谢谢!

-Gaurav

+3

也许你会更好的问服务器故障。 – rook 2010-11-09 01:34:42

回答

2

你是从谁那里得到保护的?

简短答案是“否”。用户可以看到他们自己的环境变量,除非您将它们充分填满以至于永远不能访问外壳。但你让他们使用哪个编辑器?你说'vim'吗?哦,他们毕竟已经进入了壳。

5

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

+1

这不完全正确 - 在现代内核版本上,environ'文件对其他非root用户不可见。 – 2013-04-16 14:59:29

+0

关键是用户定义环境变量是安全的。只有root用户以及定义环境变量的进程的所有者才能访问'/ proc/$ pid/environ'。但是,也有可能出现用户需要它的情况 - 密钥存储可能选择通过环境变量将密码/登录传输到另一个应用程序。用户可能能够通过这种方法找出密码。我在这里有类似的问题:http://unix.stackexchange.com/a/206219/117221 – YoYo 2015-05-31 17:27:38

+0

你可以在完成使用后取消设置变量吗?它仍会显示在'/ proc//environ'中吗? – richizy 2018-01-24 18:37:01

0

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

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

例如,如果你正在运行的Web站点和CGI脚本/二进制文件是由Apache的,它运行的用户开始:组apache:apache,保存数据库密码的CGI需要成apache:apache与像权限所拥有的文件rw-r-----640)。这样一来,为别人读文件,他需要或者是root,该apache组,或者运行与apache有效的用户或组的读取计划的成员。

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