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


12

这是我一直无法找到的大量信息,因此我们将不胜感激。

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

-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"

所以问题确实是:

使用特定的用户/组组合运行进程有什么特殊之处,它会阻止进程访问该用户的补充组所拥有的文件,并且有什么办法可以解决?


请注意,shell与它无关:shell不会处理权限。如果他们可以通过编写新的shell来扎根。
ctrl-alt-delor

Answers:


9

使用uid和gid运行进程。两者都分配有权限。您可以使用用户和组的用户规范来调用chroot,实际上该用户不在该组中。然后,将使用用户uid和给定的group 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在用户user和组的上下文中执行该过程root。现在,cat进程具有必要的权限:

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下运行。通常,该过程将调用用户的uid和gid作为其上下文。用“ takes”表示内核可以,否则将是一个安全问题。

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

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


2
进程通常仅具有主要组的凭据。可以EUID通过调用获得辅助组的凭据initgroups(3)。但是,这initgroups(3)是一个相对昂贵的操作,因为它需要枚举所有组。因此,仅initgroups(3)在有特定原因的情况下才调用进程。
lcd047 2015年

6

使用--userspec选项on可以chroot指定用户和运行时要使用的单个组chroot。要定义补充组,您还需要使用该--groups选项。

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

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


2

当您登录Linux时,登录过程¹-确认您可以以phil身份登录后-获取phil及其所属组的uid,将其设置为一个进程,然后将该进程作为您的shell启动。uid,gid和Supplemental组是该过程的属性。

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

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

将您添加phil到该adm组之后,他可以运行su phil,并将su以root用户身份运行- 验证他确实提供了phil的密码,然后将其放入phil属于uid,gid和补充组的shell中。并且在将用户添加到组中之后执行此操作,该外壳将已经在adm组中。

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

像phil一样,更正常的方式运行您的进程su phil -c "process"。随着su负载的UID,从用户数据库信息的gid和补充组,process将用户当前具有相同的凭据。

¹这可以是login(1),sshd,su,gdb或其他程序。另外,它可能通过pam模块进行管理。

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.