Linux 隔离用户目录

目标

新建新用户,只让其使用Mysql查询脚本,但无法进行其它操作,如切换目录,查看脚本等。

方法

创建chroot监狱环境及使用ssh ChrootDirectory配置修改用户登录家目录

1
2
3
chroot监狱环境:在系统中额外创建一个目录用于模拟根目录,将用户限制在此目录下,用户只能使用管理员分配的命令,类似于沙盒环境。

ChrootDirectory设置:利用sshd配置,让用户使用ssh或sftp时登录到管理员分配的家目录。

注意通过ChrootDirectory设置的目录及其所有上级目录属主必须是root且上级目录权限最大只能设置为755。否则通过ssh或sftp登录时会报10053错误,在/var/log/secure会有报错日志’fatal: bad ownership or modes for chroot directory component $PATH [postauth]’

操作流程(全程需要root权限)

一、创建用户并创建密码

1
useradd sqluser;echo -e "password\npassword\n" | passwd sqluser

二、创建chroot监狱环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# /data/permissions/sqluser是用户监狱环境根目录
mkdir -p /data/permissions/sqluser/dev

#创建dev文件,-m设置权限位,c是字符文件,两个数字是文件指向的主要号和次要号
cd /data/permissions/sqluser/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

#创建etc,复制passwd与group,如果后面再添加用户,需要再复制一次passwd与group,安全起见可以把监狱中的passwd删到只剩相关用户
cd /data/permissions/sqluser
mkdir etc
cp -f /etc/{passwd,group} etc/

#创建bin及lib64,同时复制想要的命令及命令相关库文件
cd /data/permissions/sqluser
mkdir bin
mkdir lib64

cp /bin/bash bin #复制命令,bash是必须复制的
ldd /bin/bash #查看命令相关库文件
cp /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} lib64/ #复制相关库文件

#其它命令如上三步骤添加,我们目标需要sh与mysql,所以添加这两个命令即可
#添加mysql命令与库文件
cp /bin/mysql bin
ldd /bin/mysql
cp /lib64/{libpthread.so.0,libz.so.1,libdl.so.2,libssl.so.10,libcrypto.so.10,libncurses.so.5,libtinfo.so.5,libstdc++.so.6,libm.so.6,libc.so.6,ld-linux-x86-64.so.2,libgssapi_krb5.so.2,libkrb5.so.3,libcom_err.so.2,libk5crypto.so.3,libgcc_s.so.1,libkrb5support.so.0,libkeyutils.so.1,libresolv.so.2,libselinux.so.1,libpcre.so.1} lib64/

#添加sh命令,由于sh的库文件都被之前的复制包含了,所以不复制也可
cp /bin/sh bin

三、修改sshd_config文件

1
2
3
4
5
6
7
#修改/etc/ssh/sshd_config,改变用户登录时的家目录
#往/etc/ssh/sshd_config尾部添加下列两行
Match User sqluser
ChrootDirectory /data/permissions/sqluser

#重启sshd服务:
systemctl restart sshd

四、测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1.创建mysql脚本
vi /data/permissions/sqluser/select.sh

# 脚本内容如下,注意这里mysql一定要指定-h,这样才会使用tcp连接,不然会找本地socket文件用于连接。
#!/bin/bash
/bin/mysql -uroot -ppassword -h127.0.0.1 -P3306 -e "show databases;"

# 2.使用sqluser连接,并执行脚本
ssh sqluser@localhost
/bin/sh select.sh
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+

-bash-4.2$ ls
-bash: ls: command not found
-bash-4.2$ cat select.sh
-bash: cat: command not found

参考文档:
如何限制SSH用户访问Linux中指定的目录


- - END - -


腾讯云
0%