实现指定的用户从ssh登录后只能在指定的目录下工作并只能运行指定的命令或脚本。
方案:通过搭配使用pam内的chroot module来进行限制。
1、部署目录环境
创建一个目录,目录结构与实际的/目录结构类似
创建用户
将chroot目录设置在/chroot下
- mkdir -p /chroot/{etc,dev,proc,lib,bin,lib64,home,usr}
- mkdir -p /chroot/usr/bin
- mkdir -p /chroot/home/xjc
需要说明一下,后面还会遇到很多拷贝文件的操作,对于RHEL5,没有selinux的问题,但是对于RHEL6,如果使用cp拷贝文件,不加-a参数,拷贝的文件会有selinux权限的问题。可以通过ls -Z来查看拷贝的文件与原始的文件是存在差别的:
原始文件的权限为:
- #ls -Z /etc/passwd
- -rw-r--r-- root root user_u:object_r:etc_t /etc/passwd
而如果直接cp的话,权限会有变化,造成selinux的权限问题。
所以,对于RHEL6,应该使用cp -a来拷贝文件。
对于RHEL5
- grep xjc /etc/passwd >/chroot/etc/passwd
对于RHEL6,使用上面的方法创建passwd文件也会有权限问题,解决的办法就是cp -a /etc/passwd /chroot/etc/passwd,然后删除里面的无关用户。
- cp -a /bin/bash /chroot/bin/
查看bash命令需要哪些.so文件,拷贝到chroot相应的目录中
- #ldd /bin/bash
- linux-vdso.so.1 => (0x00007fff569ff000)
- libtinfo.so.5 => /lib64/libtinfo.so.5 (0x000000369d200000)
- libdl.so.2 => /lib64/libdl.so.2 (0x000000368ea00000)
- libc.so.6 => /lib64/libc.so.6 (0x000000368e600000)
- /lib64/ld-linux-x86-64.so.2 (0x000000368e200000)
拷贝
- cp -a /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /chroot/lib64/
拷贝完成后,ls -l,会发现拷贝的是软链接文件:
- # ll
- 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命令是否可以用该目录当做/环境。
没有错误信息即可,正常应显示bash的信息。
2、ssh设置
/etc/ssh/sshd_config
确保
UsePAM yes
默认即为yes
3、pam验证增加chroot模块
/etc/pam.d/sshd
在最下面添加一行:
session required pam_chroot.so
一定要确保输入正确,否则可能造成ssh无法登陆。
pam_chroot.so执行后会读取配置文件以决定是否使用chroot环境。
/etc/security/chroot.conf
# /etc/security/chroot.conf
# format:
# username_regex chroot_dir
#matthew /home
添加一行
xjc /chroot
4、调试ssh服务
测试:
ssh xjc@127.0.0.1
登陆失败,打开/var/log/secure日志查看:
Jun 6 09:40:42 sjz 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 sjz sshd[18694]: error: openpty: No such file or directory
Jun 6 09:40:42 sjz 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/
再次登陆测试:
ssh xjc@127.0.0.1
Jun 6 09:50:04 sjz sshd[21426]: pam_env(sshd:setcred): Unable to open env file: /etc/environment: No such file or directory
Jun 6 09:50:04 sjz sshd[21390]: error: ssh_selinux_setup_pty: security_compute_relabel: No such file or directory
- cp -a /etc/environment /chroot/etc/
重新测试:
ssh xjc@127.0.0.1
xjc@127.0.0.1's password:
-bash-4.1$
OK,可以正常登陆了。
如果访问系统的某个目录?
- mount --bind /usr/local/123 /chroot/usr/local/123
5、环境设置
最简单的就是不设置环境,使用bash版本号作为提示符。
或者也可以按正常的用户一样设置提示符,需要做的操作比较多。
cp -a /etc/{profile,profile.d,bashrc} /chroot/etc/
ssh xjc@127.0.0.1
xjc@127.0.0.1'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)
按上面的方法解决即可。
参考:
http://lccnetvip.pixnet.net/blog/post/32937893--%E7%8E%A9%E7%8E%A9-ssh-%2B-chroot-%E7%B0%A1%E6%98%93%E7%92%B0%E5%A2%83%E6%9E%B6%E8%A8%AD
阅读(10348) | 评论(0) | 转发(0) |