如何使用 Bash 脚本包装一个合理的文本文件,以允许每个用户查找 $USER?

如何使用 Bash 脚本包装一个合理的文本文件,以允许每个用户查找 $USER?

所以我有一个文件data.txt,里面存储着用户名和一些数据,每个用户一行。我想要一个用户可以运行的 Bash 脚本,并允许他们调用

grep -w "^$USER" data.txt

检索他们的信息片段,但无法读取全部data.txt。是否有任何简单的 setuid 技巧可以做到这一点?

不一定是 Bash,任何 C 或 Perl 解决方案都可以。

答案1

这是使用 Bash 脚本的解决方案。

我假设你不能对脚本使用 setuid,如这个 U&L 答案。其中的建议是使用

净化环境的包装器(例如sudo使用env_reset选项)。


在此示例中,我使用/etc/our_secrets.txt而不是data.txt。首先限制对文件的访问:

sudo chown root: /etc/our_secrets.txt
sudo chmod 600 /etc/our_secrets.txt

然后创建一个脚本/usr/local/sbin/sget_my_secret。这是脚本:

#!/bin/sh
exec /bin/grep -w "^$SUDO_USER" /etc/our_secrets.txt

及其权限:

sudo chown root: /usr/local/sbin/sget_my_secret
sudo chmod 744 /usr/local/sbin/sget_my_secret

现在您应该运行sudo visudo并修改sudoers文件以允许用户调用sudo /usr/local/sbin/sget_my_secret。最基本的方法是添加

ALL ALL=(ALL) NOPASSWD: /usr/local/sbin/sget_my_secret

到文件。现在任何用户都可以运行sudo sget_my_secret。为方便起见,您需要另一个脚本/usr/local/bin/get_my_secret

#!/bin/sh
exec /usr/bin/sudo /usr/local/sbin/sget_my_secret

其权限:

sudo chown root: /usr/local/bin/get_my_secret
sudo chmod 755 /usr/local/bin/get_my_secret

此时,任何用户都可以运行get_my_secret以获取他们的信息(如果有的话)。以下是发生的事情:

  1. get_my_secret以正常权限运行。
  2. 它试图运行sudo /usr/local/sbin/sget_my_secret
  3. sudoers文件说它可以做到这一点。
  4. sget_my_secret以提升的权限运行。
  5. 提升grep对文件的处理。

安全说明:

  • 在我的 Debian 中,提到的env_reset选项默认是启用的。
  • 您可能希望ALL ALL=(ALL) ...用限制性更强的一行替换此行。
  • 在脚本中我尽可能使用完整路径。
  • 任何能够sget_my_secret使用欺骗的人$SUDO_USER都可以检索他人的秘密。我认为如果你能做到这一点,你也可以our_secrets.txt直接阅读。
  • 您可能认为您可以允许用户运行sudo grep;但这会允许他们grep在任意文件执行任意操作!这样做的目的sget_my_secret是在文件中添加这一个专门的可执行文件sudoers

相关内容