Debian/Ubuntu Linux如何将SSH用户限制在特定目录

时间:2019-11-20 08:53:12  来源:igfitidea点击:

用户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/

再次测试

sftp命令的语法如下:

sftp user@server
sftp user@server-ip-here
sftp [email protected]

如何将用户的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