如何防止在使用 sudo 时将敏感的 CLI 参数记录在 Journalctl 中?

如何防止在使用 sudo 时将敏感的 CLI 参数记录在 Journalctl 中?

在 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 的引用语法)。其他命令保持不变。

相关内容