目的

让特定的用户登录linux服务器后,对其操作权限进行限制:

  • 不能使用任何方式杀掉服务器现有的进程
  • 最好只能查看相关的目录和文件
  • 最好只能运行特定的命令,比如cat、ls、tail等

场景模拟

一台nignx服务器,开发人员需要登录到这台服务上查看nginx的错误日志,并能够上传修改后的nginx.conf文件,但是没有权限重启nginx进程。
想让新修改的nginx.conf文件生效,需要运维人员介入。

操作步骤

  • 给开发人员创建帐号并设置密码
# useradd developer
# echo '' | 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 null c
# mknod -m tty c
# mknod -m zero c
# mknod -m random c  
  • 设置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 $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 设置的更多相关文章

  1. linux远程ssh一键设置服务器时间

    cmd="sudo date -s \"$1\""; ssh mrdTomcat@*.*.*.* "$cmd" 是不是遇到过很多问题 ssh ...

  2. 服务器SSH连接时间设置

    用SSH客户端连接linux服务器时,经常会出现与服务器会话连接中断现象,造成这个问题的原因便是SSH服务有自己独特的会话连接机制. 解决方案: 1.设置服务器向SSH客户端连接会话发送频率和时间 v ...

  3. LINUX | 谷歌云开启SSH及设置root密码

    一.设置root密码 1.先选择从浏览器打开ssh连接服务器 2.切换到root账号 sudo -i 3.设置root密码 passwd 然后会要求输入新密码,然后再重复一次密码,输入密码的时候不会显 ...

  4. Linux下设置SSH Server设置时间链接限制

    OpenSSH基于安全的理由,如果用户连线到SSH Server后闲置一段时间,SSH Server会在超过特定时间后自动终止SSH连线.本人习惯长时间连接,需要做如下修改: 1.打开ssh配置文件: ...

  5. 利用Bitvise SSH Client设置二级代理

    浏览器设置代理 chrome: 插件:SwitchyOmega 二级代理 软件:Bitvise SSH Client 友情连接:链接: https://pan.baidu.com/s/1fdth_TZ ...

  6. Kali Linux开启ssh服务设置自启

    几天没写 水一些今天遇到的问题 0x01 配置SSH参数 修改sshd_config文件,命令为:   vi /etc/ssh/sshd_config 将#PasswordAuthentication ...

  7. git bash push 本地的commit到远程 -- ssh keys设置

    1.  检查是否已经创建 ssh keys git bash 下,cd ~/.ssh 如何出现“No such file or directory”,则表示需要创建一个ssh keys. 2. 创建新 ...

  8. VirtualBox中安装的CentOS开启SSH并设置访问外网

    1.全局设置NAT网络 打开VirtualBox->管理->全局设定 网络->添加按钮->添加一个NAT网络(使用默认的就行,不用改动) 2.设置用来本机于VirtualBox ...

  9. detain ssh server 设置

    ssh connection refused 处理方法 一般这种情况是 opens server 没安装 或 没启动 检查 openssh 是否安装 su 登录root账号,安装 openssh se ...

随机推荐

  1. vue2.x学习笔记(十一)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12586416.html. 表单的输入绑定 表单的输入绑定是一块很重要的内容,因为所有的业务系统都离不开基础表单的录 ...

  2. [YII2] COOKIE的操作使用

    PHPcookie的设置 setcookie('username',$data['username'],time()+3600*24*7); YII2cookie的设置 $cookies = Yii: ...

  3. Java 虚拟机中的运行时数据区分析

    本文基于 JDK1.8 阐述分析 运行过程 我们都知道 Java 源文件通过编译器编译后,能产生相应的 .Class 文件,也就是字节码文件.而字节码文件通过 Java 虚拟机中的解释器,编译成特定机 ...

  4. ansible的role(6)

    roles的优点 roles能够根据层次型结构自动的装载变化量文件,task,以及handles等. 要使用肉了是只需要在playbook中使用include引入即可. 主要使用场景复制代码较高的情况 ...

  5. Java反射机制概念及使用

    反射机制 —— 将类中的所有成员反射成对于的类. 以“com.test.Person”类为例                      转换对应的类                获取方法      ...

  6. mac OS 安装配置 Tomcat

    Apache Tomcat官网 http://tomcat.apache.org/ 选择一个版本 本文以tomcat 9为例 选择Mac OS 对应的压缩包下载 把文件解压然后  在主用户里新建一个目 ...

  7. BigDecimal 01 - 在JAVA中怎么比较Double类型数据的大小?

    2019独角兽企业重金招聘Python工程师标准>>>  非整型数,运算由于精度问题,可能会有误差,建议使用BigDecimal类型! double a = 0.001;  doub ...

  8. 工具 在 Nuget 发布自己的包

    MSDN : https://docs.microsoft.com/zh-cn/nuget/quickstart/create-and-publish-a-package-using-visual-s ...

  9. python 类C数组的两种形式:list -->内容可变, tuple --->内容不可变

    python 中的列表相当与 C 中的数组,列表:list 初始化使用[ ], 元组:tuple 初始化使用(): 一.列表list 1 #!/usr/bin/python  2   3 #list初 ...

  10. Spring LDAP的使用

    LDAP入门http://www.jianshu.com/p/7e4d99f6baaf Spring LDAP,是Spring的一个组件,实现对LDAP的操作. 在编程操作MySQL时,我们除了用JD ...