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

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

这是我无法找到太多信息的事情,所以任何帮助将不胜感激。

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

-rw-r-----  1 root        adm   69524 May 21 17:31 debug.1

用户phil无法访问此文件:

phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied

如果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

但是,如果在显式设置 的同时启动进程,user:groupphil:phil无法读取该文件。流程是这样开始的:

nice -n 19 chroot --userspec phil:phil / sh -c "process"

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

nice -n 19 chroot --userspec phil:adm / sh -c "process"

所以问题确实是:

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

答案1

进程使用 uid 和 gid 运行。两者都具有分配给他们的权限。您可以使用用户和组的用户规范来调用 chroot,但实际上该用户并不属于该组。然后,该进程将使用用户 uid 和给定组 gid 执行。

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

root@host:~$ id user
uid=10298(user) gid=20002(student) groups=20002(student)

我有一个文件如下:

root@host:~$ ls -l file
-rw-r----- 1 root root 9 Mai 29 13:39 file

他读不懂:

user@host:~$ cat file
cat: file: Permission denied 

现在,我可以在用户和组cat的上下文中执行该过程。现在,cat 进程拥有必要的权限:userroot

root@host:~$ chroot --userspec user:root / sh -c "cat file"
file contents

看看上面id说的很有趣:

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

嗯,但是该用户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)

对于你的问题:

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

您可以设置解决流程需要执行的任何任务所需的安全流程上下文。每一个进程有一个 uid 和 gid 集供其运行。通常,该进程“采用”调用用户 uid 和 gid 作为其上下文。我所说的“takes”是指内核这样做,否则这将是一个安全问题。

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

因此,您不必位于特定的组中,进程就可以使用您的 uid 和该组的 gid 运行。

答案2

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

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

Linux 中权限的详细文档可在credentials(7)联机帮助页。

答案3

当您登录 Linux 时,登录过程 1 - 验证后您可以登录为菲尔- 获取 phil 的 uid 及其所属的组,将它们设置为一个进程,然后作为您的 shell 启动。uid、gid 和补充组是进程的属性。

此后启动的任何后续程序都是该 shell 的后代,并且仅接收这些凭据的副本。*这解释了为什么更改用户的权限不会影响正在运行的进程。不过,这些更改将在下次登录时生效。

* 例外是设置了 setuid 或 setgid 位的程序,它们将具有不同的有效用户id。这用于例如苏(1)root因此即使由 执行,它也可以以特权运行phil

在您添加phil到该adm组后,他可以运行su phil,并且su将以 root 身份运行 - 验证他确实提供了 phil 的密码,然后将他放入带有 phil 所属的 uid、gid 和补充组的 shell 中。由于这是在将用户添加到组后完成的,因此该 shell 已经在该adm组中。

我不认为 chroot(1) 是最适合的程序以不同用户身份运行,但它确实可以完成工作。该参数--userspec phil:phil使其以 uidphil和 gid运行phil。没有设置其他组(为此您将提供--groups)。因此,子进程不在adm组中。

运行流程的更正常方式是 phil su phil -c "process"。当su从用户数据库信息加载 uid、gid 和补充组时,process将具有与用户当前拥有的相同的凭据。

1 这可能是登录(1)、sshd、su、gdb 或其他程序。此外,它可能是通过 pam 模块进行管理的。

相关内容