如何配置受限远程登录会话:仅允许用户访问指定只读文件夹并仅可执行特定程序
嘿,这个需求我之前帮朋友配置过,用chroot jail搭配受限shell就能完美实现——既能让用户登录后看到的"根目录"只有你指定的三个文件夹,又能严格限制他们只能用导航类命令和那个特定程序。下面一步步来,保证你能轻松搞定:
1. 先创建专属的受限用户
首先得给这个需求新建一个单独的用户,避免影响其他账号。假设咱们给用户起名叫restricted_user:
# 创建用户并生成临时主目录(后面会替换成jail目录) useradd -m restricted_user # 设置登录密码 passwd restricted_user
2. 搭建Chroot Jail隔离环境
Chroot的作用是把用户的会话"囚禁"在一个指定目录里,这个目录对用户来说就是整个"根目录",完全看不到系统其他部分,正好符合你要的"根目录只显示folderA/B/C"的要求。
2.1 创建jail的目录结构
先建jail的基础目录,然后把允许访问的文件夹绑定进去(用绑定而非复制,既能同步原文件夹内容,又能设置只读):
# 创建jail的核心目录结构 mkdir -p /jail/restricted/{data,usr/local/bin,bin,lib64,etc} # 把指定的只读文件夹绑定到jail中 mount --bind /data/folderA /jail/restricted/data/folderA mount --bind /data/folderB /jail/restricted/data/folderB mount --bind /data/folderC /jail/restricted/data/folderC # 将绑定的文件夹设置为只读,防止用户修改内容 mount -o remount,ro /jail/restricted/data/folderA mount -o remount,ro /jail/restricted/data/folderB mount -o remount,ro /jail/restricted/data/folderC
2.2 复制必要的命令和依赖库
用户需要用导航命令(比如ls、cd、pwd、exit),还有你指定的SomeCommand,得把这些命令和它们的系统依赖库复制到jail里:
- 先处理shell(以bash为例):
# 查看bash的路径 which bash # 一般输出为/bin/bash # 查看bash依赖的系统库 ldd /bin/bash
把输出里的库文件复制到jail的lib64目录(32位系统用lib):
# 示例:根据ldd结果复制依赖,实际请以你的系统输出为准 cp /lib64/libtinfo.so.6 /jail/restricted/lib64/ cp /lib64/libdl.so.2 /jail/restricted/lib64/ cp /lib64/libc.so.6 /jail/restricted/lib64/ cp /lib64/ld-linux-x86-64.so.2 /jail/restricted/lib64/
- 复制导航命令
ls、pwd:
cp /bin/ls /jail/restricted/bin/ cp /bin/pwd /jail/restricted/bin/ # 一键复制它们的依赖库 ldd /bin/ls | awk '{print $3}' | xargs -I {} cp {} /jail/restricted/lib64/ ldd /bin/pwd | awk '{print $3}' | xargs -I {} cp {} /jail/restricted/lib64/
- 复制指定的
SomeCommand:
cp /usr/local/bin/SomeCommand /jail/restricted/usr/local/bin/ # 复制它的依赖库 ldd /usr/local/bin/SomeCommand | awk '{print $3}' | xargs -I {} cp {} /jail/restricted/lib64/
2.3 配置jail的基础系统文件
shell正常工作需要/etc/passwd和/etc/group文件,咱们只复制restricted_user的条目即可:
grep restricted_user /etc/passwd > /jail/restricted/etc/passwd grep restricted_user /etc/group > /jail/restricted/etc/group
3. 配置SSH让用户登录到jail
编辑SSH配置文件/etc/ssh/sshd_config,给这个用户单独设置规则:
# 在文件末尾添加以下内容 Match User restricted_user ChrootDirectory /jail/restricted # 指定jail的根目录 ForceCommand /bin/bash # 强制用户进入bash会话 AllowTCPForwarding no # 禁止端口转发,提升安全性 X11Forwarding no # 禁止X11转发
保存文件后,重启SSH服务让配置生效:
systemctl restart sshd
4. 进一步限制可用命令(可选,更严格)
如果觉得bash还不够受限,比如担心用户执行内置危险命令,可以用**rbash(受限bash)**或者自定义shell脚本:
方式一:用rbash
把jail里的bash链接成rbash:
ln -s /bin/bash /jail/restricted/bin/rbash
修改用户的默认shell为rbash:
usermod -s /bin/rbash restricted_user
方式二:自定义专属shell脚本
如果想精准控制允许的命令,可以写一个简单的脚本,只放行指定操作:
创建/jail/restricted/bin/restricted_shell文件,内容如下:
#!/bin/bash # 定义允许执行的命令列表 allowed_commands=("ls" "pwd" "cd" "exit" "SomeCommand") # 循环接收用户输入 while true; do echo -n "$USER@restricted> " read -r cmd args # 检查命令是否在允许列表内 if [[ " ${allowed_commands[@]} " =~ " ${cmd} " ]]; then if [ "$cmd" = "cd" ]; then # cd是内置命令,用builtin执行 builtin cd "$args" || echo "❌ 无效目录" else # 执行允许的命令 $cmd $args fi else echo "❌ 禁止执行命令: $cmd" fi done
给脚本加执行权限:
chmod +x /jail/restricted/bin/restricted_shell
修改用户的默认shell为这个脚本:
usermod -s /bin/restricted_shell restricted_user
5. 测试验证
最后用另一个终端登录测试:
ssh restricted_user@你的服务器IP
测试要点:
- 执行
ls /,只能看到jail里的data、bin、usr等目录,看不到系统其他文件夹; - 进入
data目录,仅能看到folderA、folderB、folderC,且无法修改其中内容; SomeCommand能正常运行,其他命令(比如rm、cat)会提示不存在或被禁止。
备注:内容来源于stack exchange,提问作者Bri Bri

