在开此之前,我们需要先搞清chroot、pam_chroot.so、/etc/security/chroot.conf三者之间的关系。chroot,即 change root directory (更改 root 目录),也就是将用户原始的根目录更换到一个受限的目录,里面仅给定用户所需要的命令、lib库等相关文件;chroot功能的实现,需要在对应服务的pam文件中调用pam_chroot.so库文件,且该文件默认会读取/etc/security/chroot.conf配置文件(该文件中指定了哪些用户是受限的)。对于chroot的使用,我其实在linux下自建ssh堡垒机一篇中有提到的。

一、创建测试用户

1[root@server0 ~]# useradd test
2[root@server0 ~]# echo "361way.com"|passwd --stdin test
3Changing password for user test.
4passwd: all authentication tokens updated successfully.

二、创建chroot相关目录

以下是创建chroot环境对应的文件的目录,并创建用户的家目录:

1[root@server0 ~]# mkdir -p /chroot/{etc,dev,proc,lib,bin,lib64,home,usr}
2[root@server0 ~]# mkdir -p /chroot/usr/bin
3[root@server0 ~]# mkdir -p /chroot/home/test
4[root@server0 ~]# chown test /chroot/home/test

三、修改pam文件和chroot.conf

这部分才是本文的关键,具体哪个服务要使用pam_chroot.so模块,就在对应的服务的pam配置文件中增加相应的配置,这里以ssh服务为例,在/etc/pam.d/sshd最后一行增加的配置如下:

1session    required     pam_chroot.so

在chroot.conf中增加的配置如下:

1[root@server0 ~]# cat /etc/security/chroot.conf
2test    /chroot

四、可用命令及依赖关系

以后我们只想让test用户使用bash,并且可以使用的命令只有ls、mv、ssh等,就需要将这部分可执行文件copy到chroot对应的目录下,并且需要将对应的so库文件也拷贝到chroot下的lib目录下。这里以bash为例:

chroot-ldd
chroot-ldd

拷贝对应的文件,并通过chroot命令进行测试:

1[root@server0 ~]# cp /bin/bash /chroot/bin/
2[root@server0 ~]# cp /lib64/libtinfo.so.5 /lib64/libdl.so.2 /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 /chroot/lib64/
3[root@server0 lib64]# chroot /chroot/   //该命令执行后没有报错信息,表示上面的操作没有问题
4bash-4.2#

注:此处也可以考虑使用busybox,编译软链的方式到这个位置。因为该工具里面包含了相关多的常用工具。

五、指定pts、环境文件和设备文件

此时虽然chroot相关的部分已经配置好,不过直接ssh连接时还是会报错,因为当前没有pty可供使用,直接ssh会收到如下的报错:

1[root@localhost ~]# ssh test@server0
2test@server0's password:
3PTY allocation request failed on channel 0
4/bin/bash: Permission denied
5Connection to server0 closed.
6[root@localhost ~]#

可以如下操作,临时指定pts和proc文件,如下:

1[root@server0 ~]# mount --bind /dev /chroot/dev
2[root@server0 ~]# mount -t devpts -o gid=5,mode=620 devpts /chroot/dev/pts
3[root@server0 ~]# mount -t proc /proc /chroot/proc/

不过这个增加是临时的,想在重启后有效,需要在/etc/fstab中增加如下配置:

1/dev    /chroot/dev none        bind    0 0
2devpts  /chroot/dev/pts devpts  gid=5,mode=620 0 0
3none    /chroot/proc proc defaults 0 0

环境变更相关的文件需要拷贝如下文件:

1[root@server0 ~]# cp /etc/environment /chroot/etc/

同样,如果有需要用到/dev/null、/dev/zero、/dev/random等相关文件,也可以通过如下方法创建(不过其对chroot的使用影响不用,如果不需要,可以不创建)

1mknod /chroot/dev/null c 1 3
2mknod /chroot/dev/zero c 1 5
3chmod 666 /chroot/dev/null zero
4mknod -m 666 /chroot/dev/tty c 5 0
5mknod -m 666 /chroot/dev/random c 1 8