这是我无法找到太多信息的事情,所以任何帮助将不胜感激。
我的理解是这样的。获取以下文件:
-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:group
则phil: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 进程拥有必要的权限:user
root
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
使用--userspec
on 选项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 模块进行管理的。