我可以让文件只能被脚本访问,而不是用户吗?

IQA*_*eas 12 root permissions access-control

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

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

像鲍勃用户容许知道明天的密码,即使它的文件中列出。出于这个原因,该文件/srv/daily-passphrases是由Unix许可保护的,所以非root用户喜欢鲍勃没有允许直接访问文件。但是,它们可以随时运行get-todays-passphrase.sh脚本,从而返回“过滤后的”数据。


总结一下(TL;DR版本):

  1. Bob 无法读取受保护的文件
  2. 脚本可以读取受保护的文件
  3. 任何时候,Bob 都可以运行可以读取文件的脚本

是否可以在 Unix 文件权限内执行此操作?或者,如果 Bob 启动了一个脚本,该脚本是否总是注定要以与 Bob 相同的权限运行?

Ben*_*ack 14

这实际上很常见,也很简单。 sudo允许您限制用户可以调用的特定应用程序。换句话说,您不必给它们全部 root 或什么都不给;您可以授予他们运行特定命令的sudo权限。这正是您想要的,并且对于允许用户通过 SSH 等推送 Git 存储库之类的事情来说,这是非常常见的做法。

要做到这一点,你所要做的就是添加一行/etc/sudoers看起来像

bob ALL=(root) NOPASSWD: /path/to/command/you/trust
Run Code Online (Sandbox Code Playgroud)

(该NOPASSWD:部分不是必需的,但在这种情况下很常见。)此时,bob可以/path/to/command/you/trust通过 sudo调用,但没有其他方法。

也就是说,给予某人根 - 我们在这里所做的 - 可能并不完全是您想要的。值得注意的是,如果您的脚本中有任何缺陷,您就有可能让您的盒子扎根。出于这个原因,您可能更喜欢创建一个专门拥有特殊文件的用户 - 例如,specialuser- 然后chown将文件交给他们,并让/etc/sudoersmakebob成为该特殊用户。在这种情况下,您添加的sudoers行将只是

bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust
Run Code Online (Sandbox Code Playgroud)

  • 我建议不要采用“root”方式 - 为此创建一个特殊的用户/组。 (8认同)

gun*_*ert 8

前言:

正如评论中指出的那样,出于本答案中解释的原因,Linux 内核在处理脚本时会忽略setuid / setguid位。我不会复制本杰明的答案,而是用executabe替换脚本以使我的答案正确。


简短回答:使用setgid

详细步骤:

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

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

  • Setgid 和 setuid 在脚本上不容易使用,对吗? (3认同)
  • 您不能在 Linux 上创建脚本 setgid:setgid 位将被忽略。相反,添加一条 sudo 规则,允许 bob 使用“readpass”组运行“thatfile”。 (2认同)