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


11

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

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

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


总结(TL; DR版本):

  1. 鲍勃无法读取受保护的文件
  2. 该脚本可以读取受保护的文件
  3. Bob可以随时运行可以读取文件的脚本

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

Answers:


13

这实际上很常见,也很简单。 sudo允许您限制用户可以调用的特定应用程序。换句话说,您不必全力以赴,也不需付出任何代价。您可以授予他们运行特定命令的sudo权限。这正是您想要的,并且是诸如允许用户通过SSH推送Git存储库之类的事情的非常普遍的做法。

为此,您所要做的就是在其中添加一行内容/etc/sudoers,如下所示:

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

(该NOPASSWD:部分不是必需的,但在这种情况下很常见。)在这一点上,bob可以/path/to/command/you/trust通过sudo 进行调用,但不能进行其他任何操作。

就是说,让某人扎根-我们在这里正在做的事情-可能并不是您想要的。值得注意的是,如果您的脚本中存在任何缺陷,则有使自己的盒子扎根的风险。出于这个原因,你可能反而更喜欢专门创建一个用户拥有特殊的文件,比如说,specialuser-那么chown该文件给他们,并让/etc/sudoers化妆bob是特殊的用户。在这种情况下,您添加到的行sudoers就是

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

7
我建议不要采用“ root”方式-为此目的创建一个特殊的用户/组。
guntbert 2014年

好点子; 我会补充答案。
本杰明·波拉克

7

前言:

正如注释中指出的那样,由于此答案中解释的原因,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

这样,您的可执行文件将在拥有组的权限下运行,从而能够读取文件。


2
Setgid和setuid在脚本上不容易使用,对吗?
muru

1
您无法在Linux上创建脚本setgid:setgid位将被忽略。而是添加一个sudo规则,使bob可以thatfile与group 一起运行readpass
吉尔(Gilles)“所以,别再邪恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.