免责声明:
我正在使用 Ubuntu 20.04,但我认为我的问题与特定的 Linux 发行版无关。我在互联网上搜索了很长一段时间,发现了很多其他类似的问题和答案,但对我的具体问题没有什么特别的。
我想做的事:
我有一个脚本,我想在用户登录时运行(通过 ssh 或控制台)。因此,我认为我必须在 /etc/profile.d 中放置一个脚本,该脚本需要凭据才能运行,比如说通过curl 进行 REST 调用的令牌。所有用户所需的凭据都是相同的,而不是特定于用户的。我不希望用户看到凭据。
我的问题似乎是:
/etc/profile.d 中的脚本似乎在登录的用户帐户下运行。如果我将凭据存储在环境变量中,用户可以看到它。如果我将凭据存储在文件中,用户需要能够读取该文件,否则脚本无法读取它们。如果我将凭据存储在数据库中,我需要凭据才能访问数据库,并使用另一个密码来面对最初的问题。
我想出了什么:
我通过 sudo 以 root 身份间接运行脚本,访问只能以 root 身份读取的凭据文件:
我添加了一个脚本 /etc/profile.d/run-my-script.sh 包含sudo my-script.sh $USER
. ($USER
需要知道m̀y-script.sh
谁最初登录)然后我做了一个chmod 600 my-script.sh
(所有者根)并将我的凭据存储在一个文件中.credentials
(也是 chmod 600,所有者根)。
我my-script.sh
从文件中读取了凭据read TOKEN < /etc/profile.d/.credentials
,并在运行结束时执行了unset TOKEN
.
最后我通过 visudo 添加了
ALL ALL=(ALL) NOPASSWD: /etc/profile.d/other-script.sh
我的问题:
尽管我的“解决方案”有效,但对于很可能是常见问题的事情来说却感觉很笨拙。有没有更简单的方法来达到同样的效果?我是否错过了一个漏洞?我的解决方案是否以意外的方式泄露了凭据?
谢谢。