在这个例子中,建立了一个"迷你监狱"用来测试一个只有 ls 命令的 Bash shell。首先用 mkdir 命令设定好 abc "监狱" 路径。
1.创建用户abc
useradd abc
passwd abc
2.用root用户建立目录 :
mkdir -p /chroot/{etc,dev,proc,lib,bin,lib64,home,usr}
mkdir -p /chroot/usr/bin
mkdir -p /chroot/home/abc
chown abc /chroot/home/abc
3. 创建passwd文件
tail -1 /etc/passwd >/chroot/etc/passwd
4.把bash文件拷贝到/chroot/bin下.(对于RHEL6,应该使用cp -a来拷贝文件。)
cp -a /bin/bash /chroot/bin/
5. 查看bash命令需要哪些.so文件,拷贝到chroot相应的目录中(为ldd /bin/bash的结果)
cp -a /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /chroot/lib64/
拷贝完成后,ls -l,会发现拷贝的是软链接文件:
# ll /lib64/
total 0
lrwxrwxrwx. 1 root root 10 Feb 6 13:58 ld-linux-x86-64.so.2 -> ld-2.12.so
lrwxrwxrwx. 1 root root 12 Feb 6 13:58 libc.so.6 -> libc-2.12.so
lrwxrwxrwx. 1 root root 13 Feb 6 13:58 libdl.so.2 -> libdl-2.12.so
lrwxrwxrwx. 1 root root 15 Jan 16 22:36 libtinfo.so.5 -> libtinfo.so.5.7
拷贝原始文件:
cp -a /lib64/{ld-2.12.so,libc-2.12.so,libdl-2.12.so,libtinfo.so.5.7} /chroot/lib64/
简单测试一下,看看chroot命令是否可以用该目录当做/环境。
chroot /chroot
没有错误信息即可,正常应显示bash的信息。
6、ssh设置
/etc/ssh/sshd_config
确保
UsePAM yes
默认即为yes
7. pam验证增加chroot模块
vim /etc/pam.d/sshd
在最下面添加一行:
session required pam_chroot.so
一定要确保输入正确,否则可能造成ssh无法登陆。
pam_chroot.so执行后会读取配置文件以决定是否使用chroot环境。
vim /etc/security/chroot.conf
# /etc/security/chroot.conf
# format:
# username_regex chroot_dir
#matthew /home
添加一行
abc /chroot
8、调试ssh服务
测试:
登陆失败,打开/var/log/secure日志查看:
Jun 6 09:40:42 abc sshd[18769]: pam_env(sshd:setcred): Unable to open config file: /etc/security/pam_env.conf: No such file or directory
Jun 6 09:40:42 abc sshd[18694]: error: openpty: No such file or directory
Jun 6 09:40:42 abc sshd[18769]: error: session_pty_req: session 0 alloc failed
#cp -a /etc/security /chroot/etc
为chroot准备dev环境,准备pts环境
mount --bind /dev /chroot/dev
mount -t devpts -o gid=5,mode=620 devpts /chroot/dev/pts
准备proc环境
mount -t proc /proc /chroot/proc/
再次登陆测试:
Jun 6 09:50:04 abc sshd[21426]: pam_env(sshd:setcred): Unable to open env file: /etc/environment: No such file or directory
Jun 6 09:50:04 abc sshd[21390]: error: ssh_selinux_setup_pty: security_compute_relabel: No such file or directory
cp -a /etc/environment /chroot/etc/
重新测试:
[email protected]'s password:
-bash-4.1$
OK,可以正常登陆了。
如果访问系统的某个目录?
mount --bind /usr/local/123 /chroot/usr/local/123
9、复制 ls 命令所需的库文件到chroot相应的目录中。用 ldd 命令打印出 ls 命令依赖的共享库:
cp -a /bin/ls /chroot/bin/
ldd /bin/ls
输出样例:
linux-vdso.so.1=>(0x00007fff68dff000)
libselinux.so.1=>/lib64/libselinux.so.1(0x00000032f8a00000)
librt.so.1=>/lib64/librt.so.1(0x00000032f7a00000)
libcap.so.2=>/lib64/libcap.so.2(0x00000032fda00000)
libacl.so.1=>/lib64/libacl.so.1(0x00000032fbe00000)
libc.so.6=>/lib64/libc.so.6(0x00000032f7200000)
libdl.so.2=>/lib64/libdl.so.2(0x00000032f6e00000)
/lib64/ld-linux-x86-64.so.2(0x00000032f6a00000)
libpthread.so.0=>/lib64/libpthread.so.0(0x00000032f7600000)
libattr.so.1=>/lib64/libattr.so.1(0x00000032f9600000)
你可以一个个的复制库文件,为了更高效的作业,我们也可以使用bash shell 的循环指令实现:
list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"
for i in $list;do cp -a "$i" /chroot/"${i}";done
拷贝原始文件:
list=`ll $(ldd /bin/ls | egrep -o '/lib.*\.[0-9]') |awk -F '>' '{print $2}'`
for i in $list;do cp -a /lib64/"$i" /chroot/lib64/"${i}";done
最后,chroot 到你的新abc:
chroot /chroot/home/abc /bin/bash
尝试浏览一下 /etc 或 /var:
# ls /
10、环境设置
最简单的就是不设置环境,使用bash版本号作为提示符。
或者也可以按正常的用户一样设置提示符,需要做的操作比较多。
#cp -a /etc/{profile,profile.d,bashrc} /chroot/etc/
[email protected]'s password:
-bash: id: command not found
-bash: id: command not found
-bash: uname: command not found
-bash: /bin/grep: No such file or directory
-bash: /bin/grep: No such file or directory
-bash: /bin/grep: No such file or directory
-bash: /usr/bin/id: No such file or directory
-bash: [: =: unary operator expected
#whereis id
id: /usr/bin/id /usr/share/man/man1p/id.1p.gz /usr/share/man/man1/id.1.gz
cp -a /usr/bin/id /chroot/usr/bin/
cp -a /bin/grep /chroot/bin/
cp -a /bin/uname /chroot/bin/
# ldd /chroot/usr/bin/id
linux-vdso.so.1 => (0x00007fff4cba1000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003690200000)
libc.so.6 => /lib64/libc.so.6 (0x000000368e600000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000368ea00000)
/lib64/ld-linux-x86-64.so.2 (0x000000368e200000)
按上面的方法解决即可。