ssh chroot 设置
Posted ooops
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ssh chroot 设置相关的知识,希望对你有一定的参考价值。
目的
让特定的用户登录linux服务器后,对其操作权限进行限制:
- 不能使用任何方式杀掉服务器现有的进程
- 最好只能查看相关的目录和文件
- 最好只能运行特定的命令,比如cat、ls、tail等
场景模拟
一台nignx服务器,开发人员需要登录到这台服务上查看nginx的错误日志,并能够上传修改后的nginx.conf文件,但是没有权限重启nginx进程。
想让新修改的nginx.conf文件生效,需要运维人员介入。
操作步骤
- 给开发人员创建帐号并设置密码
# useradd developer # echo ‘123456‘ | passwd --stdin developer
- 修改sshd_config配置文件,并重启ssh服务
# echo ‘Match User developer‘ >> /etc/ssh/sshd_config # echo ‘ChrootDirectory /home/developer‘ >> /etc/ssh/sshd_config # sed -i ‘s/^Subsystem.*$/Subsystem sftp internal-sftp/‘ /etc/ssh/sshd_config # systemctl restart sshd
- 在上面规定的ChrootDirectory的目录下创建dev bin etc lib64 home等文件夹
# cd /home/developer # mkdir ./{dev,etc,bin,lib64,home}
- 设置dev文件夹
# cd /home/developer/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
- 设置bin文件夹
# cd /home/developer/bin # cp /bin/bash . # chroot=/home/developer #定一个变量,赋值为ChrootDirectory定义的路径 # for i in `ldd /bin/bash | awk ‘{print $3}‘| grep ‘^/lib‘`;do cp -v $i $chroot/lib64/;done # for i in `ldd /bin/bash | awk ‘{print $1}‘| grep ‘^/lib‘`;do cp -v $i $chroot/lib64/;done
- 设置etc文件夹
# cd /home/developer/etc # cp /etc/passwd /etc/group . # echo ‘export PATH=$PATH:/bin‘ > profile
- 设置ChrootDirectory文件夹的权限,至此,可以使用登录了,但只能运行bash的内置命令
# chroot=/home/developer #定一个变量,赋值为ChrootDirectory定义的路径 # chown -R root.root $chroot # chmod 755 $chroot
- 给用户添加ls命令
# cd /home/developer/bin # which ls #找到ls的路径,可以看到ls位于/usr/bin/ls,这个路径记下后续有用 # cp /usr/bin/ls . #把ls拷贝到bin下 # ldd /usr/bin/ls #查看ls命令所依赖的共享包 # chroot=/home/developer #定一个变量,赋值为ChrootDirectory定义的路径 # for i in `ldd /usr/bin/ls | awk ‘{print $3}‘| grep ‘^/lib‘`;do cp -v $i $chroot/lib64/;done # for i in `ldd /usr/bin/ls | awk ‘{print $1}‘| grep ‘^/lib‘`;do cp -v $i $chroot/lib64/;done
- 同第8节,添加所需要的命令(例如ls、cat、vi、tail、sftp等),遵循以下几个步骤
① 查找命令在系统中的实际位置,并拷贝到bin目录下(此bin非系统的bin)
② 用ldd命令查找出命令运行时所依赖的共享包
③ 把这些共享包拷贝到lib64下(同样,此lib64非系统的lib64)
④ 可参考第8节,理解这几个步骤,可考虑写个脚本
#!/bin/bash cmdlist="/bin/bash /bin/ls /bin/cp /bin/mkdir /bin/mv /bin/rm /bin/rmdir /usr/bin/ssh /usr/bin/id" # chroot路径 chroot_path="/data" # 判断依赖的库文件 lib_1=`ldd $cmdlist | awk ‘{ print $1 }‘ | grep "/lib" | sort | uniq` lib_2=`ldd $cmdlist | awk ‘{ print $3 }‘ | grep "/lib" | sort | uniq` # 复制命令文件 for i in $cmdlist do if [ ! -d `dirname ${chroot_path}$i` ];then mkdir -p `dirname ${chroot_path}$i` fi cp -a $i ${chroot_path}$i && echo "$i done" done # 复制依赖的库文件(因为是i386,所以是lib,如果是x86_64,则是lib64,) for j in $lib_1 do if [ ! -d `dirname ${chroot_path}$j` ];then mkdir -p `dirname ${chroot_path}$j` fi cp -f $j ${chroot_path}$j && echo "$j done" done for k in $lib_2 do if [ ! -d `dirname ${chroot_path}$k` ];then mkdir -p `dirname ${chroot_path}$k` fi cp -f $k ${chroot_path}$k && echo "$k done" done
- 常见问题
① 执行for循环的时候,cp会提示文件覆盖,这是因为cp实际是cp -i 的别名,去掉别名即可。
② 按照上面的操作,ChrootDirectory是/home/developer,这个目录可以随便指定,假设上述nginx的日志在/var/log/nginx下,则指定ChrootDirectory为/var/log/nginx。
模拟结果
使用developer用户登录服务器的时候,只能运行添加的命令。特别的,需要文件传输的时候,还可以添加sftp命令。
以上是关于ssh chroot 设置的主要内容,如果未能解决你的问题,请参考以下文章