当进程作为特定组运行时,Linux 权限如何工作?

phi*_*vin 13 linux process chroot permissions chmod

这是我无法找到太多信息的事情,因此将不胜感激。

我的理解是这样的。获取以下文件:

-rw-r-----  1 root        adm   69524 May 21 17:31 debug.1
Run Code Online (Sandbox Code Playgroud)

用户phil无法访问此文件:

phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied
Run Code Online (Sandbox Code Playgroud)

如果phil被添加到adm组中,它可以:

root@server:~# adduser phil adm
Adding user `phil' to group `adm' ...
Adding user phil to group adm
Done.
phil@server:/var/log$ head -n 1 debug.1
May 21 11:23:15 server kernel: [    0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5.1-0-g8936dbb-20141113_115728-nilsson.home.kraxel.org 04/01/2014
Run Code Online (Sandbox Code Playgroud)

然而,如果一个进程开始,同时明确地设置user:groupphil:phil它无法读取该文件。过程是这样开始的:

nice -n 19 chroot --userspec phil:phil / sh -c "process"
Run Code Online (Sandbox Code Playgroud)

如果进程以 启动phil:adm,它可以读取文件:

nice -n 19 chroot --userspec phil:adm / sh -c "process"
Run Code Online (Sandbox Code Playgroud)

所以问题真的是:

运行具有特定用户/组组合的进程有什么特别之处,以防止该进程能够访问该用户的补充组拥有的文件,有什么办法可以解决这个问题?

cha*_*aos 10

一个进程使用 uid 和 gid 运行。两者都有分配给他们的权限。您可以使用用户和组的 userspec 调用 chroot,实际上该用户不在该组中。然后将使用用户 uid 和给定的组 gid 执行该过程。

看一个例子。我有一个用户叫user,他在组中student

root@host:~$ id user
uid=10298(user) gid=20002(student) groups=20002(student)
Run Code Online (Sandbox Code Playgroud)

我有一个文件如下:

root@host:~$ ls -l file
-rw-r----- 1 root root 9 Mai 29 13:39 file
Run Code Online (Sandbox Code Playgroud)

他读不懂:

user@host:~$ cat file
cat: file: Permission denied 
Run Code Online (Sandbox Code Playgroud)

现在,我可以cat在 useruser和 group的上下文中执行该过程root。现在, cat 进程具有必要的权限:

root@host:~$ chroot --userspec user:root / sh -c "cat file"
file contents
Run Code Online (Sandbox Code Playgroud)

看看什么是有趣的id

root@host:~$ chroot --userspec user:root / sh -c "id"
uid=10298(user) gid=0(root) groups=20002(student),0(root)
Run Code Online (Sandbox Code Playgroud)

嗯,但该用户user不在该组 ( root) 中。从哪里id得到它的信息?如果不带参数调用,则id使用系统调用、getuid()getgid()getgroups()。所以id打印自身的进程上下文。我们已经改变了那个上下文--userspec

当使用参数调用时,id只确定用户的组分配:

root@host:~$ chroot --userspec user:root / sh -c "id user"
uid=10298(user) gid=20002(student) groups=20002(student)
Run Code Online (Sandbox Code Playgroud)

对于你的问题:

运行具有特定用户/组组合的进程有什么特别之处,以防止该进程能够访问该用户的补充组拥有的文件,有什么办法可以解决这个问题?

您可以设置解决流程需要执行的任何任务所需的安全流程上下文。每个进程都有一个 uid 和 gid 集,他在其下运行。通常,进程“接受”调用用户的 uid 和 gid 作为他的上下文。对于“takes”,我的意思是内核会这样做,否则这将是一个安全问题。

因此,实际上不是用户没有读取文件的权限,而是进程的权限 ( cat)。但是该进程使用调用用户的 uid/gid 运行。

因此,您不必在特定组中使用您的 uid 和该组的 gid 运行进程。

  • 进程通常只有主组的凭据。它可以通过调用“initgroups(3)”来访问“EUID”所属的辅助组的凭据。然而,`initgroups(3)` 是一个相对昂贵的操作,因为它需要枚举所有组。因此,进程只有在有特定原因时才会调用 `initgroups(3)`。 (2认同)

Ste*_*itt 6

使用--userspecon 选项chroot指定在运行chroot. 要定义补充组,您还需要使用该--groups选项。

默认情况下,进程继承运行它们的用户的主要和补充组,但通过使用--userspec您告诉chmod使用指定的单个组覆盖它。

credentials(7)联机帮助页中提供了 Linux 中权限的详细文档。