Debian/Ubuntu Linux如何将SSH用户限制在特定目录
用户ssh登录时,如何限制其只能在home目录进行操作?
在Linux中,如何设置chrooted jail?
什么是chrooted jail?
在Linux中,可以将用户会话限制在某个特定的目录。
可以在用户登录后,将目录的路径名(例如/home/httpd/foo)设置为chroot。
在chroot之后,sshd将工作目录更改为用户的主目录。用户只能在该目录活动。
ChrootDirectory指令
在sshd_config配置文件中。
ChrootDirectory必须包含必要的文件和目录以支持用户会话。对于交互式会话,这至少需要一个shell(通常为sh(1))和基本/dev节点,例如null(4),zero(4),stdin(4),stdout(4),stderr(4),随机(4)和tty(4)设备。对于使用sftp的文件传输会话,如果使用进程内sftp服务器,则无需对环境进行其他配置,尽管使用日志记录的会话确实需要chroot目录中的/dev/log。
您可以授予您不完全信任的用户ssh访问权限。您可以通过设置SSH chroot监狱来限制该用户只能看到或运行ls,date和内部bash命令。
让我们看看如何在Debain或Ubuntu Linux服务器上为OpenSSH服务器创建chroot监狱。
测试环境Debian Linux 8
# lsb_release -a
以root用户身份登录
$ su -
创建chroot监狱
将/home/jails/目录设置为chroot,ssh用户会话将被限制在该目录:
# mkdir -p /home/jails
按照sshd手册页,您还需要以下文件:
# ls -l /dev/{null,zero,stdin,stdout,stderr,random,tty}
输出示例:
crw-rw-rw- 1 root root 1, 3 Jun 11 03:11 /dev/null crw-rw-rw- 1 root root 1, 8 Jun 11 03:11 /dev/random lrwxrwxrwx 1 root root 15 Jun 11 03:11 /dev/stderr -> /proc/self/fd/2 lrwxrwxrwx 1 root root 15 Jun 11 03:11 /dev/stdin -> /proc/self/fd/0 lrwxrwxrwx 1 root root 15 Jun 11 03:11 /dev/stdout -> /proc/self/fd/1 crw-rw-rw- 1 root tty 5, 0 Jun 11 04:43 /dev/tty crw-rw-rw- 1 root root 1, 5 Jun 11 03:11 /dev/zero
使用mknod命令创建所需的/dev节点:
# mkdir -p /home/jails/dev/ # mknod -m 666 /home/jails/dev/null c 1 3 # mknod -m 666 /home/jails/dev/tty c 5 0 # mknod -m 666 /home/jails/dev/zero c 1 5 # mknod -m 666 /home/jails/dev/random c 1 8
设置权限
将/home/jails设置为root所有,其他用户不能写入:
# chown root:root /home/jails # chmod 0755 /home/jails
验证一下:
# ls -ld /home/jails
安装bash shell
创建bin目录:
# mkdir -p /home/jails/bin
将/bin/bash复制到/home/jails/bin /目录:
# cp -v /bin/bash /home/jails/bin
将所需的共享库复制到/home/jails目录。
# ldd /bin/bash
# mkdir -p /home/jails/lib/ # mkdir -p /home/jails/lib64/ # mkdir -p /home/jails/lib/x86_64-linux-gnu/ # cp -v /lib/x86_64-linux-gnu/{libncurses.so.5,libtinfo.so.5,libdl.so.2,libc.so.6} /home/jails/lib/
将/lib64/ld-linux-x86-64.so.2复制到/lib64 /目录:
# cp -v /lib64/ld-linux-x86-64.so.2 /home/jails/lib64/
复制/lib/x86_64-linux-gnu/libnss_files*,输入:
# cp -va /lib/x86_64-linux-gnu/libnss_files* /home/jails/lib/x86_64-linux-gnu/
将用户添加到系统
您还需要将/etc/passwd和/etc/group文件复制到/home/jails/etc/目录:
# mkdir -p /home/jails/etc # adduser tom # adduser jerry
将更新的/etc/{passwd,group}文件复制到/home/jails/etc/目录:
# cp -vf /etc/{passwd,group} /home/jails/etc/
配置sshd
编辑/etc/ssh/sshd_config文件:
# vi /etc/ssh/sshd_config
添加以下两个指令:
Match User tom,jerry ChrootDirectory /home/jails ForceCommand internal-sftp
对tom,jerry这两个用户应用chrooted jail。
对sftp服务应用chrooted jail。
重启sshd服务
如果是Debian 7.x及之前版本,执行:
# /etc/init.d/ssh restart
如果是Debian Linux版本8.x,执行:
# systemctl restart ssh.service
测试chrooted jail
语法为:
ssh user@sever ssh user@sever-ip-here ssh tom@localhost
输出示例:
tom@localhost's password: Last login: Thu Jun 11 04:32:32 2015 from localhost Could not chdir to home directory /home/tom: No such file or directory -bash-4.3$ ls -bash: ls: command not found -bash-4.3$ date -bash: date: command not found -bash-4.3$ pwd / -bash-4.3$
安装其他命令
现在,tom用户可以登录服务器,但不能运行其他命令,例如ls,date等。该用户仅限于/bin/bash。如果需要ls或任何其他命令,则需要像在/bin/bash中一样将它们安装在/home/jails/目录中。
方法如下:
# cd /root/ wget http://www.theitroad.local/files/lighttpd/l2chroot.txt # mv l2chroot.txt l2chroot # chmod +x l2chroot # vi l2chroot
找到BASE行,并进行如下更改:
BASE="/home/jails"
保存并关闭文件。在/home/jails/bin /目录中安装/bin/ls:
# cp -v /bin/ls /home/jails/bin/ # cp -v /bin/date /home/jails/bin/ # /root/l2chroot /bin/ls # /root/l2chroot /bin/date
创建/home/jails/home/tom和/home/jails/home/jerry目录:
# mkdir -p /home/jails/home/{tom,jerry} # chown -R tom:tom /home/jails/home/tom/ # chown -R jerry:jerry /home/jails/home/jerry/ # chmod -R 0700 /home/jails/home/tom/ # chmod -R 0700 /home/jails/home/jerry/
如何将用户的Web服务器(DocumentRoot)映射到/home/jails/目录?
假设/home/httpd/tom_web是tom用户的DocumentRoot,那么:
# mkdir /home/jails/home/tom/web # mount --bind /home/httpd/tom_web /home/jails/home/tom/web # echo "/home/httpd/tom_web/ /home/jails/home/tom/web none bind" >> /etc/fstab