看过不少文章,讲如何部署ssh/sftp监牢,但所有都是ssh远程登陆后,进入监牢,却没法使用外部命令,即只有pwd、echo、history三个命令可用。通过多方查找,终于找到方法。linux
# mkdir /var/jail
# chown root: /var/jail
# chmod 0755 /var/jailshell
建立一个目录,将用来“囚禁”远程登陆进来的用户,即将他们限制在这个目录内。固然,也能够将他们各自“囚禁”在各自的家目录下。稍咱们再讨论这个话题。vim
# mkdir /var/jail/{bin,dev,lib64}bash
同时建立了三个目录:/var/jail/bin、/var/jail/dev、/var/jail/lib64dom
# ldd $(which bash)ssh
用which命令查看bash的绝对地址,再用ldd查询其依赖的动态连接库。根据查看的结果,它须要如下这几个动态连接库:
linux-vdso.so.1 => (0x00007ffd73b69000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f3d7dc16000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f3d7da12000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3d7d645000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3d7de40000)测试
# cp -r /lib64 /var/jail/spa
# cp -r /usr/bin/* /var/jail/bin
以上大约拷贝了/lib64目录下全部的动态连接库,以及/usr/bin下全部的命令,共13万多个文件。网上大多的教程是用ldd查询,须要哪些,就拷贝哪一些。若是,咱们如须要让被“囚禁”的用户使用ls命令,就:3d
# ldd $(which ls)rest
而后再拷贝上面这个命令列举出来的连接库。此时,就当/var/jail是根目录便可。若是动态连接库在/lib64下,就建立一个/var/jail/lib64,再把那些文件拷贝进来,依此类推。
# cd /var/jail/dev # mknod -m 666 null c 1 3 # mknod -m 666 tty c 5 0 # mknod -m 666 zero c 1 5 # mknod -m 666 random c 1 8
根据man sshd_config的说明,建立运行shell和sftp须要的字符设备,如/dev/tty、/dev/zero、/dev/null、/dev/random。
# groupadd jail # useradd -G jail tom # passwd tom
若是在建立一个蜜罐,就不要把组命名为jail了。黑客进来一看,就不玩了。咱们能够将某个用户或某个组的用户“囚禁起来”。这里,我要把jail组的用户“囚禁”起来。本例可能用不到这个组。你也能够不建立。想好要把哪一个用户“关起来”就行。
# mkdir /var/jail/etc # cp -vf /etc/{passwd,group} /var/jail/etc/
建立一个/var/jail/etc目录。
用vim /etc/ssh/sshd_config,在文件最后面添加如下内容
Match User alan ChrootDirectory /var/jail
这里是将用户alan关起来。固然,你可使用组,以下:
Match Group jail ChrootDirectory %h
%h,表明各用户本身的家目录。若是使用的是这第二种方法,则须要对各用户的家目录进行处理。这个方法至关于将监牢的位置进行了调整。因此前面对/var/jail的处理方法要在/home/alan处使用。/var/jail能够删除了。
# chown root: /home/alan # mkdir /home/alan/{bin,lib64,dev,etc} # cp -r /lib64/* /home/alan/lib64 # cp -r /usr/bin/* /home/alan/bin # chmod 0755 /home/alan # cd /home/alan/dev # mknod -m 666 null c 1 3 # mknod -m 666 tty c 5 0 # mknod -m 666 zero c 1 5 # mknod -m 666 random c 1 8
# mkdir /var/jail/dev/pts # mount --bind /dev /var/jail/dev # mount --bind /dev/pts /var/jail/dev/pts
若是不处理,会出现:/dev/pts/2 not found的错误。
# vim /etc/profile
内容以下:
export PATH=$PATH:/bin
保存退出。而后再:
# source /etc/profile
这一步是绝大部分教程都忽略的一条。若是没有,登陆后,也是找不到命令。
# systemctl restart sshd
重启sshd服务
测试。
# ssh alan@localhost bash_4.2# pwd bash_4.2# ls bash_4.2# touch file.txt
测试成功后,咱们再来配置sftp。此时,仅须要修改/etc/ssh/sshd_config将其最后的内容变成以下:
#Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp Match User alan ChrootDirectory /var/jail ForceCommand internal-sftp AllowTcpForwarding no
而后再重启sshd服务,便可。测试方法以下:
# sftp alan@localhost