CentOS 7部署chroot ssh和sftp监牢

折月煮酒 提交于 2020-03-18 13:37:03

某厂面试归来,发现自己落伍了!>>>

看过很多文章,讲如何部署ssh/sftp监牢,但全部都是ssh远程登录后,进入监牢,却无法使用外部命令,即只有pwd、echo、history三个命令可用。经过多方查找,终于找到方法。

第01步

# mkdir /var/jail
# chown root: /var/jail
# chmod 0755 /var/jail

创建一个目录,将用来“囚禁”远程登录进来的用户,即将他们限制在这个目录内。当然,也可以将他们各自“囚禁”在各自的家目录下。稍我们再讨论这个话题。

第02步

# mkdir /var/jail/{bin,dev,lib64}

同时创建了三个目录:/var/jail/bin、/var/jail/dev、/var/jail/lib64

第03步

# ldd $(which bash)

用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)

第04步

# cp -r /lib64 /var/jail/

# cp -r /usr/bin/* /var/jail/bin
以上大约拷贝了/lib64目录下所有的动态链接库,以及/usr/bin下所有的命令,共13万多个文件。网上大多的教程是用ldd查询,需要哪些,就拷贝哪一些。如果,我们如需要让被“囚禁”的用户使用ls命令,就:

# ldd $(which ls)

然后再拷贝上面这个命令列举出来的链接库。此时,就当/var/jail是根目录即可。如果动态链接库在/lib64下,就创建一个/var/jail/lib64,再把那些文件拷贝进来,依此类推。

第05步

# 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。

第06步

# groupadd jail
# useradd -G jail tom
# passwd tom

如果在创建一个蜜罐,就不要把组命名为jail了。黑客进来一看,就不玩了。我们可以将某个用户或某个组的用户“囚禁起来”。这里,我要把jail组的用户“囚禁”起来。本例可能用不到这个组。你也可以不创建。想好要把哪个用户“关起来”就行。

第07步

# mkdir /var/jail/etc
# cp -vf /etc/{passwd,group} /var/jail/etc/

创建一个/var/jail/etc目录。

第08步

用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

第09步

# mkdir /var/jail/dev/pts
# mount --bind /dev /var/jail/dev
# mount --bind /dev/pts /var/jail/dev/pts

如果不处理,会出现:/dev/pts/2 not found的错误。

第10步

# vim /etc/profile

内容如下:

export PATH=$PATH:/bin

保存退出。然后再:

# source /etc/profile

这一步是绝大部分教程都忽略的一条。如果没有,登录后,也是找不到命令。

第11步

# systemctl restart sshd

重启sshd服务

第12步

测试。
 

# 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

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!