在 Ubuntu 16.04 中,日志记录每个 sudo 命令,其中一些命令包含我不想留在日志中的敏感参数(例如明文密码)。我对如何防止这种情况有一些想法,但我想知道是否有任何正式的方法可以做到这一点,理想情况下应该足够简单和通用。
例如,如下命令。
$ sudo set_account.sh --password SbdLb9W --pin-number 1234 --other-options
日志日志可能会像这样呈现。
sudo set_account.sh --password ... --pin-number ... --other-options
谢谢。
感谢大家非常有用的答案和评论。我想我会继续使用环境变量加包装脚本的方法。
答案1
不要将密码放在命令选项中。
正确的方法是使用环境变量,例如
$ MY_PASSWORD=s3cr3t ./mycommand
但是,mycommand
需要知道在环境中查找密码
该密码将出现在您的 shell 历史记录中,但其他用户看不到:https://security.stackexchange.com/questions/138071/are-environment-variables-entered-directly-before-a-command-visible-to-other-
如果您不希望它出现在 shell 历史记录中,请将上述命令放入脚本中并运行该脚本
如果mycommand
调用其他进程,注意不要传递MY_PASSWORD
给子进程
答案2
你可以这样做:
$ rm -f /home/somewhere/new_account_john
$ touch /home/somewhere/new_account_john
$ chmod 600 /home/somewhere/new_account_john
$ echo "--password SbdLb9W --pin-number 1234" > /home/somewhere/new_account_john
$ sudo set_account.sh --read-options-from /home/somewhere/new_account_john --other-options
$ rm -f /home/somewhere/new_account_john
这仍然存在安全风险,有人可以读取进程列表ps
并查看echo
命令。第二个风险是竞争,即有人在您之前写入文件,或者在您之前更改文件sudo
(或者从文件中读取)。
但是,它可以解决您的直接请求。
如果您无法更改set_account.sh
命令,那么您可以尝试类似的操作
$ sudo sh -c 'set_account.sh `cat /home/somewhere/new_account_john` --other-options'
而不是上面的其他sudo
命令,并尝试在 sudo 之后是否调用 cat (它应该,但这取决于 shell 的引用语法)。其他命令保持不变。