IT技术博客大学习 共学习 共进步

在ssh服务里使用chroot

Linux|系统管理|WEB开发 2010-07-14 09:51:22 浏览 5,842 次

对于虚拟主机而言,平衡用户易用体验和安全是一个挑战,比如如果开发ssh给用户,那么无疑能极大的增加用户操作的灵活性,但是ssh的强大也是得在安全方面让管理员很头疼,如何将用户限制在自己的环境中,就显得尤为重要。幸而openSSH已经了解到了这点,目前的版本均支持chroot功能,下面我简单的描述一下在ubuntu 10.04系统上如何实现,其他系统实现的原理相同,只是一些配置文件和指令不同而已。

1)确定chroot目录
按照传统,chroot的目录都在/var/chroot/下面。我们遵循这种传统,将目录限定在/var/chroot/sshd下面。

2)创建必要的目录和文件。
我们需要在/var/chroot/sshd下创建一个最小的系统环境,特别是需要有交互终端,如果用到一个系统高级的功能,还需要一些特定的设备文件。因为我们这里只是演示最基本的功能,复杂的的功能,可以根据错误提示要按需增加需要的资源。
$sudo mkdir -p /var/chroot/sshd/{bin,home,etc}
$sudo apt-get install busybox-static
$sudo cp /bin/busybox /var/chroot/sshd/bin/

每次敲busybox 显然不够环保,我们还是做一些额外的工作,将所有内置的busybox命令都用软链接的方式导出来,下面的python脚本能快速帮你做到这点。

cat ctlink.py
#!/usr/bin/env python
import commands
import os,sys

output=commands.getoutput('./busybox --help')
c=[x.strip() for x in  output.split('functions:')[1].strip().split(',')]
for x in c:
	os.system("ln -sf busybox %s" % x)

只需要在/var/chroot/sshd/bin/下面执行这个脚本就好了。

为了能让chroot环境能正确识别用户,组等信息,我们需要在etc目录下创建passwd,group,shadow等文件。而用户登录验证的时候,依赖的是chroot之前的/etc/{passwd,shadow,group}文件,这里我们采取硬链接方式来解决这个问题
$cd /var/chroot/sshd/etc
$sudo ln -n /etc/{passwd,group,shadow} .

当然,如果你的/var和/并不是在一个分区上,那么硬链接就不能工作,那你可以尝试在/etc和/var/chroot/sshd/etc来个同步工具。

3)创建测试帐号
我们不用之前的用户帐号,是因为我们需要对帐号的基本信息做一些修改,我们不想破坏你现在的环境,因为来一个测试帐号是比较安全的。
$ sudo useradd -d /var/chroot/sshd/home/test -m -s /bin/sh test
然后修改/etc/passwd文件将
test:x:1001:1001::/var/chroot/sshd/home/test:/bin/sh
修改成
test:x:1001:1001::/home/test:/bin/sh
接着创建密码
$sudo passwd test
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:
passwd:已成功更新密码

4)修改openssh-server配置文件
编辑/etc/ssh/sshd_config文件,在最后一行增加chrootDirectory指令来指定chroot的路径,类似如下:
chrootDirectory /var/chroot/sshd
保存退出。

5)测试,测试
以上步骤完成后,执行
$sudo /etc/init.d/sshd reload
来重新加载配置文件
然后我们可以测试了,下面是一个登录的测试结果:

$ ssh test@localhost
test@localhost's password:
Linux wgzhao-laptop 2.6.32-23-generic #37-Ubuntu SMP Fri Jun 11 07:54:58 UTC 2010 i686 GNU/Linux
Ubuntu 10.04 LTS
~ $ pwd
/home/test
~ $ cd /
/ $ ls
bin   etc   home
/ $

建议继续学习

  1. Linux shell脚本使用while循环执行ssh的注意事项 (阅读 8,063)
  2. 为什么要用公钥/私钥而不是密码去做SSH身份验证 (阅读 5,701)
  3. 如何让ssh登录更加安全 (阅读 5,604)
  4. ssh连接超时解决办法 (阅读 5,504)
  5. 懒人连ssh不输密码若干大法 (阅读 5,483)
  6. SSH无密码登录 (阅读 5,483)
  7. ssh命令 (阅读 5,225)
  8. 共享会话的ssh连接配置 (阅读 4,705)
  9. 一句话crontab实现防ssh暴力破解 (阅读 4,564)
  10. SSH下连接Oracle的方法 (阅读 4,503)