You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置受限远程登录会话:仅允许用户访问指定只读文件夹并仅可执行特定程序

如何配置受限远程登录会话:仅允许用户访问指定只读文件夹并仅可执行特定程序

嘿,这个需求我之前帮朋友配置过,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 11:43:10