我可以使文件只能由脚本访问,而不能由用户访问吗?

我可以使文件只能由脚本访问,而不能由用户访问吗?

我有一个用户对系统的访问权限有限(也就是说,他不是 sudoer);我们叫他吧鲍勃

我有一个脚本或二进制文件,我(系统管理员)信任它,并且以 root 身份运行它不会有任何问题;让我们调用脚本get-todays-passphrase.sh。该脚本的工作是从位于 的“私有”(由 Bob 甚至 root 以外的用户/组拥有)文件中读取数据/srv/daily-passphrases,并仅输出文件中的特定行:与今天的日期相对应的行。

像 Bob 这样的用户不是允许知道明天的密码,即使它已列在文件中。因此,该文件/srv/daily-passphrases受到 Unix 权限的保护,因此像 Bob 这样的非 root 用户不是允许直接访问该文件。然而,他们可以get-todays-passphrase.sh随时运行脚本,该脚本返回“过滤后的”数据。


总结一下(长话短说版本):

  1. Bob 无法读取受保护的文件
  2. 该脚本可以读取受保护的文件
  3. 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/sudoersmakebob成为该特殊用户。在这种情况下,您添加的行sudoers就是

bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust

答案2

前言:

正如评论中所指出的以及原因中所解释的这个答案Linux内核忽略了设置用户标识/设置引导处理脚本时的位。我不会重复本杰明的答案,而是替换脚本可执行使我的答案正确。


简短回答:使用设置gid

详细步骤:

  1. 创建一个新组(例如readpass)
  2. 使该组成为密码文件的所有者sudo chown :readpass thatfile
  3. 使文件仅可由所属组读取sudo chmod g=r,o= thatfile
  4. 使你的可执行文件sgid读通行证:sudo chmod g+s thatfile

这样,您的可执行文件将使用所属组的权限运行,从而能够读取该文件。

相关内容