我知道如果我在bash中运行命令,那么另一个用户可以使用许多不同的方式查看参数。所以SomeCommand $PASSWORD
是一个坏主意。如果我这样做,我认为同样适用
env PASSWORD="SECRET" SomeCommand PASSWORD
其中SomeCommand现在读取其中的环境变量,比如python中的os.environ["PASSWORD"]
。虽然现在密码的持续时间较短:它是env
的命令行arg,它运行SomeCommand(环境中有PASSWORD,所以有人看{4}}会看到/proc
。注意env PASSWORD="SECRET" SomeCommand PASSWORD
只能由root读取,因为/proc/PID/environ
通常是短暂的,这样更安全,但仍会泄漏其参数)。
但是,如果我使用env
,则同样适用,例如export
因为export PASSWORD="SECRET"; SomeCommand PASSWORD
是内置的bash(即它不会泄漏导出的内容,比如通过export
)?
答案 0 :(得分:2)
SomeCommand $ PASSWORD是个坏主意
是。密码将显示在ps(1)检查的命令行中,并在/ proc中显示SomeCommand的持续时间。
env PASSWORD =" SECRET" SomeCommand PASSWORD
SECRET将在ps
和/ proc中显示env
;它将在SomeCommmand期间驻留在(私有)环境中。这个解决方案稍微(或远)更好。
如果我使用导出,则同样适用export PASSWORD =" SECRET&#34 ;; SomeCommand PASSWORD,因为导出是内置的bash?
export
是一个bash内置的事实并不意味着什么。这个解决方案更糟糕,因为现在PASSWORD=secret
将在/ proc中显示SomeCommand的持续时间(作为SomeCommand的environ var),并且永远存在于您自己的环境中!除非你后来取消它;那么,它与使用env
的情况相同。
也许您可以将密码存储在您拥有的文件中,而其他人无法读取,SomeCommand应该从该文件中获取密码。或者,更好的是,实现一些使密码唯一的机制:例如,根据当前日期/时间,用某些东西来扰乱你的秘密,并让SomeCommand解密这个秘密。即使某人(root?)读取了混乱的秘密,也不会很快破坏安全性。
评论后更新:假设没有人可以隐藏任何[魔鬼命名] root,那么问题就是专注于隐私vs 其他普通用户。文件/ proc / PID / environment对他们来说是不可读的,因此可以认为环境是安全的。鉴于此,解决方案
export PASSWORD = secret; SomeCommand PASSWORD
是最好的,因为它会在安全自己的环境中编写 secret ,然后启动SomeCommand PASSWORD
,这将在ps(1)中可见,但是不包含实际的秘密。
另一种解决方案,
env PASSWORD = secret SomeCommand PASSWORD
非常相似,但是,短时间内,ps(1)将可以看到 secret 。在那么短的时间之后,env
和export
方式是等价的。
使用export
将PASSWORD=secret
保留在当前环境中,而env
则不会:但假设环境是安全的,因为bash历史文件(包含最后一个文件的文件)是安全的命令已执行)。
在下面的rici发表评论后更新:对 - 没有必要使用导出。简单的PASSWORD=secret SomeCommand PASSWORD
具有不在ps中可见的优点,并且都不会将秘密存储在当前环境中。如此简单......一个证明3个大脑比2个好的演示!
最后注意事项:如上所述,如果root用户可以访问SomeCommand的源,则可以通过root来破坏秘密。如果源无法访问,root仍然可以反汇编SomeCommand。 root可以看到系统的所有内存,如果需要的话。换句话说,root用户必须是可信任的......