所以我有一个文件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
以获取他们的信息(如果有的话)。以下是发生的事情:
get_my_secret
以正常权限运行。- 它试图运行
sudo /usr/local/sbin/sget_my_secret
。 sudoers
文件说它可以做到这一点。sget_my_secret
以提升的权限运行。- 提升
grep
对文件的处理。
安全说明:
- 在我的 Debian 中,提到的
env_reset
选项默认是启用的。 - 您可能希望
ALL ALL=(ALL) ...
用限制性更强的一行替换此行。 - 在脚本中我尽可能使用完整路径。
- 任何能够
sget_my_secret
使用欺骗的人$SUDO_USER
都可以检索他人的秘密。我认为如果你能做到这一点,你也可以our_secrets.txt
直接阅读。 - 您可能认为您可以允许用户运行
sudo grep
;但这会允许他们grep
在任意文件执行任意操作!这样做的目的sget_my_secret
是在文件中添加这一个专门的可执行文件sudoers
。