前提条件有点复杂,所以上下文如下:
- 有一个程序,通过 shell 脚本启动;
- shell脚本通过.jar文件启动程序;
- 我希望这个程序将其缓存存储在
/var/opt/
子文件夹中,例如/var/opt/program/
; - 缓存内容不应直接访问,只能通过程序访问
- 该程序应该可供系统中的所有本地用户使用
我提出的主要想法是创建一个具有读取和编辑缓存文件夹内容所需的所有权限的组。我不想手动将用户添加到组中,因此正在寻找替代选项。如果我理解正确的话,setgid
位应该非常适合我。我的理解如下:
- 设置了该位的文件夹
setgid
会强制其所有内容具有与该文件夹相同的所有者组,并强制其所有子文件夹遵循相同的规则。同时,它不会为不包含在文件夹所有者组中的用户提供任何额外的权限,即带有掩码drwxrws--x的文件夹不允许其他人编辑和读取其内容。 - 设置了该位的程序
setgid
始终代表所有者组运行,允许用户执行尊重组权限的操作。
我的步骤如下:
- 我创建了一个群组我的组;
- 我创建了一个文件夹
/var/opt/program/
并将其所有者组设置为我的组; - 我
setgid
为文件夹设置了位 - 我将程序 shell 脚本所有者组设置为我的组;
- 我
setgid
为 shell 脚本设置了位
问题是该程序无法在没有 root 权限的用户启动的缓存文件夹中创建和编辑文件。任何建议将被认真考虑。
UPD环境:
操作系统:Ubuntu 16.04.2 LTS
答案1
- 设置了 setgid 位的文件夹强制其所有内容具有与该文件夹相同的所有者组
是的。新创建的文件获得目录的组,文件的组当然可以随后更改。(我们称它们为目录,而不是文件夹。)
- 设置了 setgid 位的程序始终代表所有者组运行
是的。不过,如果您仅通过 setgid 二进制文件创建文件,则不需要在目录上使用 setgid。 setgid 程序将相关组作为主要组,因此它创建的任何文件默认都归该组所有(而不是调用用户的组)。
- 我为 shell 脚本设置了 setgid 位
这是不起作用的部分。大多数系统不尊重解释脚本上的 setuid 和 setgid 位,因为它很容易导致许多安全问题。
你需要做的是编写一个执行脚本的C程序包装器,并使包装器设置gid;或者(最好)使用类似的方法sudo
来允许您的用户以另一个组的权限运行脚本。 (sudo
已经处理了诸如清理可能有问题的环境变量之类的事情。)在这两种情况下,请确保脚本及其解释器位于用户无法修改的目录中。
对于sudo
,所需的配置(在/etc/sudoers
)将是这样的:
username ALL=(:privgroup) /path/to/script
这将允许用户作为组username
运行。您可以使用而不是允许所有成员运行该脚本。用户需要使用 来运行脚本,因为默认情况下会尝试将命名命令运行为,而我们不允许这样做。但您可以为该命令编写一个包装器。/path/to/script
privgroup
%groupname
username
groupname
sudo -g privgroup /path/to/script
sudo
root
答案2
大多数操作系统都会忽略脚本上的 setgid。该目录/var/opt/program
应该是组可写的并且是 setgid 的。ls -ld /var/opt/program
应该输出类似的东西drwxrwsr-x 159 root mygroup 5406 Jun 15 10:25 /var/opt/program
。任何需要执行该程序的常规(非 root)用户都应该有mygroup
一个补充组。使用类似于每个用户替换的usermod
命令添加它们usermod -a -G mygroup LOGIN
登录和他们的用户名。或者编辑/etc/group
并附加带有 mygroup 的行以及这些用户的逗号分隔列表。例如:mygroup:x:5000:joe,frank,ellen,mark
用户 joe、frank、ellen 和 mark 将执行该脚本。