问题描述
非root用户是否可以在Ubuntu上运行chroot进程?
最佳方案
在Linux上,chroot(2)系统调用只能由特权进程进行。流程所需的功能是CAP_SYS_CHROOT。
您不能chroot作为用户的原因很简单。假设您有一个setuid程序(例如sudo),它会检查/etc /sudoers是否允许您执行某些操作。现在,使用您自己的/etc /sudoers将其放在chroot chroot中。突然,您立即进行特权升级。
可以设计一个程序以chroot自身并作为setuid进程运行,但这通常被认为是不好的设计。 chroot的额外安全性不会激发setuid的安全性问题。
次佳方案
@ imz–IvanZakharyaschev对pehrs的回答发表评论说,引入命名空间可能是可能的,但是尚未对此进行测试并将其发布为答案。是的,的确使非root用户可以使用chroot。
给定一个statically-linked dash
和一个statically-linked busybox
,以及一个以非root用户身份运行的bash
shell:
$ mkdir root
$ cp /path/to/dash root
$ cp /path/to/busybox root
$ unshare -r bash -c 'chroot root /dash -c "/busybox ls -al /"'
total 2700
drwxr-xr-x 2 0 0 4096 Dec 2 19:16 .
drwxr-xr-x 2 0 0 4096 Dec 2 19:16 ..
drwxr-xr-x 1 0 0 1905240 Dec 2 19:15 busybox
drwxr-xr-x 1 0 0 847704 Dec 2 19:15 dash
该名称空间中的root用户ID映射到该名称空间之外的非root用户ID,反之亦然,这就是为什么系统将当前用户拥有的文件显示为用户ID 0所拥有的原因。常规ls -al root
,而没有unshare
,确实将其显示为当前用户拥有。
注意:能够使用chroot
的进程是well-known,能够脱离chroot
。由于unshare -r
会向普通用户授予chroot
权限,因此,如果在chroot
环境中允许这样做,则会带来安全风险。实际上,它是不允许的,并且失败:
unshare: unshare failed: Operation not permitted
符合unshare(2)文档:
EPERM (since Linux 3.9)
CLONE_NEWUSER was specified in flags and the caller is in a chroot environment (i.e., the caller’s root directory does not match the root directory of the mount namespace in which it resides).
第三种方案
这些天来,您希望使用LXC(Linux容器)而不是chroot /BSD监狱。它位于chroot和虚拟机之间,为您提供许多安全控制和常规可配置性。我相信,作为用户运行它所需要做的就是成为拥有必要文件/设备的组的成员,但是其中可能还涉及功能/系统权限。无论哪种方式,它都应该非常可行,因为LXC是很新的,在将SELinux等添加到Linux内核很久之后。
另外,请记住,您只能以root用户身份编写脚本,但可以使用sudo授予用户安全运行这些脚本的权限(如果需要,可以没有密码,但请确保脚本是安全的)。