我有一个用户对系统的访问权限有限(也就是说,他不是 sudoer);我们叫他吧鲍勃。
我有一个脚本或二进制文件,我(系统管理员)信任它,并且以 root 身份运行它不会有任何问题;让我们调用脚本get-todays-passphrase.sh
。该脚本的工作是从位于 的“私有”(由 Bob 甚至 root 以外的用户/组拥有)文件中读取数据/srv/daily-passphrases
,并仅输出文件中的特定行:与今天的日期相对应的行。
像 Bob 这样的用户不是允许知道明天的密码,即使它已列在文件中。因此,该文件/srv/daily-passphrases
受到 Unix 权限的保护,因此像 Bob 这样的非 root 用户不是允许直接访问该文件。然而,他们可以get-todays-passphrase.sh
随时运行脚本,该脚本返回“过滤后的”数据。
总结一下(长话短说版本):
- Bob 无法读取受保护的文件
- 该脚本可以读取受保护的文件
- Bob 可以随时运行可以读取文件的脚本
是否可以在 Unix 文件权限内执行此操作?或者,如果 Bob 启动一个脚本,该脚本是否总是注定以与 Bob 相同的权限运行?
答案1
这实际上很常见并且非常简单。 sudo
允许您限制用户可以调用的特定应用程序。换句话说,您不必给它们全部 root 或什么也不给;你可以给他们sudo
权限运行特定命令。这正是您想要的,对于允许用户通过 SSH 等推送 Git 存储库之类的事情来说,这是非常常见的做法。
为此,您所要做的就是添加一行,/etc/sudoers
看起来像
bob ALL=(root) NOPASSWD: /path/to/command/you/trust
(这NOPASSWD:
部分不是必需的,但在这种情况下很常见。)此时,bob
可以/path/to/command/you/trust
通过 sudo 调用,但不能通过其他方式调用。
也就是说,给某人 root 权限(我们在这里所做的事情)可能并不完全是您想要的。值得注意的是,如果你的脚本中有任何缺陷,你就有可能让你的盒子被扎根。出于这个原因,您可能更喜欢专门创建一个用户来拥有该特殊文件,例如,specialuser
然后将chown
文件交给他们,并让/etc/sudoers
makebob
成为该特殊用户。在这种情况下,您添加的行sudoers
就是
bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust
答案2
前言:
正如评论中所指出的以及原因中所解释的这个答案Linux内核忽略了设置用户标识/设置引导处理脚本时的位。我不会重复本杰明的答案,而是替换脚本和可执行使我的答案正确。
简短回答:使用设置gid
详细步骤:
- 创建一个新组(例如readpass)
- 使该组成为密码文件的所有者
sudo chown :readpass thatfile
- 使文件仅可由所属组读取
sudo chmod g=r,o= thatfile
- 使你的可执行文件sgid读通行证:
sudo chmod g+s thatfile
这样,您的可执行文件将使用所属组的权限运行,从而能够读取该文件。