应用场景:建立只读用户,只让该用户访问特定的日志目录,则该用户登陆后只在该目录下,只能查看该目录下的一些内容,无法向上切换目录。
基本思路:建立chroot监狱,一个最基本的chroot环境至少有一个shell(例如sh,bash)和一些必要的系统设备文件(例如/dev/null,/dev/zero),如果要允许用户执行一些命令,那么还要准备相应的命令可执行文件和命令依赖的库文件。
说明:下面所用命令测试基于redhat7或centos7版本
我们现在建立一个用户rouser,并把它限定在/home/readonly目录下
1、建立用户,并修改ssh参数使用户登陆后限制在某个目录中
mkdir -p /home/readonly #要限制用户登陆时的目录,已有的就不需要新建了。
useradd -M rouser #建立用户,不需要建立家目录
echo "rouser" | passwd --stdin rouser #为用户设置登陆密码
/etc/ssh/sshd_config中最后添加
Match User rouser
ChrootDirectory /home/readonly #指定限制的目录
2、在给定的目录中建立chroot监狱环境,创建用户登陆必要的文件
mkdir /home/readonly/{bin,dev,lib64,etc}
mknod /home/readonly/dev/null c 1 3
mknod /home/readonly/dev/zero c 1 5
mknod /home/readonly/dev/random c 1 8
mknod /home/readonly/dev/urandom c 1 9
mknod /home/readonly/dev/tty c 5 0
chmod 0666 /home/readonly/dev/{null,zero,tty}
将/etc/passwd和/etc/group中root和rouser两行分别添加到/home/readonly//etc/passwd和/home/readonly//etc/group中
3、拷贝命令,用于给只读用户添加一些常用的命令
# 要允许执行的文件列表
cmdlist="/bin/bash /bin/ls /bin/vi /bin/vim /bin/pwd /bin/more /bin/less /bin/cat /bin/tail /bin/head"
#chroot路径
chroot_path=/home/readonly/
# 判断依赖的库文件
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
cp -a $i $chroot_path/bin/ && echo "$i done"
done
#复制依赖的库文件(如果是i386,是lib,是x86_64,则是lib64,)
for j in $lib_1
do
cp -f $j $chroot_path/lib64/ && echo "$j done"
done
for k in $lib_2
do
cp -f $k $chroot_path/lib64/ && echo "$k done"
done
4、设置环境变量和selinux上下文
cp /etc/bashrc /home/readonly/etc/
echo 'export PATH=$PATH:/bin' >> /home/readonly/etc/profile
## 升级openssh版本并开启selinx的话,需要更改以下几项,否则会出现用户无法登陆的情况。
chcon -R -t bin_t /home/readonly/bin
chcon -R -t lib_t /home/readonly/lib64
chcon -R -t etc_t /home/readonly/etc
chcon -R -t device_t /home/readonly/dev
chcon -R -t tty_device_t /home/readonly/dev/*
按照惯例一键部署脚本已配置好,有需要点下面链接进行下载
https://download.csdn.net/download/ioryhm/13101523