ssh chroot jail的完美解决:ssh jail,restrict shell , ssh virtual machine

这几天折腾chroot,目的想实现用户5test只能访问它自己的目录/home/5test,并且能实现有限的命令行,如cp\mv\ls\mysql导入导出等。

测试使用了N个工具:包括lshell、rssh:lshell无限虚拟机:并将用户限制在指定的文件夹;限制指定的命令

但包括lshell、rssh在内的网上众多一键包,都有个缺点:权限、限制不严格,例如可以通过一些promt的办法实现 service httpd restart, 这不是我想要的。

后来认认真真想通了这个问题:chroot jail , 要100%完美解决这个问题,要搞定权限、软件依赖、chroot、selinux安全性或防火墙,而且必须要手动敲些代码(希望有空我能折腾一个sh文件出来,免得麻烦)。

基于centos 6.5

1.要实现chroot jail,首先要搞明白,是哪个软件的chroot jail :(我一始错误地以为chroot只要设置一次就行了)

nginx\apache\php-fpm\ssh这几个都是经常要用到chroot jail的,所以要分开考虑,一次chroot设置并不能让上面几个软件同时实现chroot jail的。

所以,对我目前的这个需求,就是要实现ssh级别的chroot jail了。

而针对php-fpm的chroot jail,可以参考nginx+php-fpm,给php-fpm分配独立的用户、独立进程, unix socket模式

2.ssh的chroot jail,核心要配置openssh  , 设置也很简单:

vi /etc/ssh/sshd_config

在最后加上下面两行(创建用户useradd、改用户密码passwd等过程略过)

Match User 5test
ChrootDirectory /home/5test

3.权限设置:root必须为根所有者:

按第2步做了后如果直接运行ssh 5test@localhost进行测试 的话,

假设你的openssh是默认安装的,没有修改上面的第2步就是mach的话,你直接测试ssh 5test@localhost是一点问题都没有的

反而设置了openssh后出问题了,会报错Write failed: Broken pipe

原来openssh的官方要求/home/5test的所有者以及其所有上级的所有者必须为root,但其内的文件夹则不必须了

所以可以执行:

chown root:5test /home/5test

4.软件依赖:还是报错:/bin/bash: No such file or directory

既然chroot jail了,你必须要至少将/bin/bash复制到/home/test/bin/bash吧,同时要解决这个命令的依赖性,同理ls\rar\mysql等命令也一样解决

以解决bash为例:

mkdir -p /home/5test/{dev,etc,lib,usr,bin}

ldd命令要吧解决软件的依赖性:ldd  /bin/bash , 然后看依赖一个个复制……(放心,网上有现成的命令)

我用的是http://bash.cyberciti.biz/web-server/nginx-chroot-helper-bash-shell-script/ (个人认为这个最好用)

还有同样作用的命令如:http://www.cyberciti.biz/tips/howto-setup-lighttpd-php-mysql-chrooted-jail.html、http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/

将命令保存为copyShareLibs.sh文件(sh文件的运行方法\权限设置略过),将其中的chroot设置改为你自己的chroot jail path:我这里改为/home/5test

注意了:bash是必须的,ls命令我用来测试,你还可以加wget\tar\rar\dir\cp自己试试

./copyShareLibs.sh /bin/bash
cp /bin/bash /home/5test/bin/
./copyShareLibs.sh /bin/ls
cp /bin/ls /home/5test/bin/

5.验证ssh 5test@localhost

这时候,你应该能使用ls命令,其他dir什么的,如果你没复制过去,是用不了的

再试试 ls / 看看能不能看到根目录,我指的是root的根目录:应该不行的

达到这一步,则完美实现ssh chroot jail了

6.selinux等安全性或防火墙问题

selinux默认打开,会导致一些莫明其妙的问题,例如openssh会在登陆成功的一瞬间立即退出……

selinux类似win的内部防火墙,但比它更严格,会导致很多的问题,大部分人建议关闭之(略过)

测试过程中可以setenforce 0 直接关闭selinux , 但这只是临时的关闭。

修改/etc/selinux/config文件中的SELINUX=”” 为 disabled ,然后重启。
如果不想重启系统,使用命令setenforce 0

7.举一反三,回过头来看php-fpm的chroot, 如果将ssh chroot + php-fpm chroot结合,就能完美实现ssh virtual machine了。

后来我再想想,印象中apache和nginx也支持chroot,不过没折腾了,GOOGLE上的确有人这么干,不过我目的已经达到。

8.下一步:我想写个完善的bash script (sh文件)出来,这样就不用次次都这么折腾了,虽然我猜网上一定有人已经这么做了,但GOOGLE半天没发现。这么做有什么用?大有可为!

9.在chroot环境下使用mysql: openssh chroot mysql socket problem solved,link

10.在已经chroot的ssh中再使用sftp和ssh命令,即用于跳转

转自: http://www.trackself.com/archives/2472.html


发表评论 0

Your email address will not be published. Required fields are marked *