在多用户的服务器环境中,为了增强系统安全性、限制用户的访问范围以及防止用户误操作或恶意行为对系统造成破坏,管理员常常需要将用户“囚禁”在其特定的家目录中,在 CentOS 系统中,实现这一目标主要通过 chroot
(change root)机制,它能够改变一个进程及其子进程所能看到的根目录,从而创建一个隔离的运行环境。
SFTP 服务的目录锁定
最常见的需求是限制 SFTP 用户,使其只能访问自己的目录,而不能浏览服务器的其他文件系统,这可以通过配置 OpenSSH 服务轻松实现,是安全且推荐的做法。
创建监狱根目录
我们需要创建一个作为 chroot
环境根目录的文件夹,这个目录不属于任何用户的家目录,/home/sftp_jail
。
sudo mkdir -p /home/sftp_jail
创建用户并设置家目录
创建一个专门用于 SFTP 访问的用户,关键在于将其家目录指向监狱内的一个子目录,并将其 shell 设置为 /sbin/nologin
,以禁止其通过 SSH 登录获得 shell。
sudo useradd -d /upload -s /sbin/nologin sftpuser sudo passwd sftpuser
这里的 -d /upload
指的是该用户的家目录在 chroot
环境中看起来是 /upload
,它在服务器上的实际路径是 /home/sftp_jail/upload
。
配置目录权限
权限设置是 chroot
成功的关键,监狱的根目录(/home/sftp_jail
)必须由 root
用户拥有,且其他用户不可写入,而用户的上传目录则由该用户自己拥有。
# 在监狱根目录下创建用户实际的上传目录 sudo mkdir /home/sftp_jail/upload # 设置监狱根目录权限 (必须由root拥有) sudo chown root:root /home/sftp_jail sudo chmod 755 /home/sftp_jail # 设置用户上传目录权限 sudo chown sftpuser:sftpuser /home/sftp_jail/upload
配置 SSH 服务
编辑 SSH 的配置文件 /etc/ssh/sshd_config
,在文件末尾添加以下配置:
Match User sftpuser
ChrootDirectory /home/sftp_jail
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
这段配置的含义是:
Match User sftpuser
: 仅对sftpuser
用户应用以下规则。ChrootDirectory /home/sftp_jail
: 将该用户的根目录chroot
到指定路径。ForceCommand internal-sftp
: 强制执行 SFTP 的内部进程,不提供 shell。X11Forwarding no
和AllowTcpForwarding no
: 禁用端口转发和X11转发,增强安全性。
重启服务并测试
保存配置文件后,重启 SSH 服务使配置生效。
sudo systemctl restart sshd
使用 sftpuser
账户登录,你会发现用户被成功地限制在了 /upload
目录中,无法向上浏览到服务器的其他路径。
为用户提供 Shell 的 Chroot 环境
如果需要为用户提供一个受限的 shell 环境,过程会复杂一些,你不仅需要 chroot
目录,还需要在其中构建一个最小化的 Linux 运行环境,包括必要的二进制文件(如 bash
, ls
)和它们所依赖的共享库,可以使用 ldd
命令查看一个二进制文件依赖哪些库,然后将它们一一复制到 chroot
目录的对应路径下(如 lib
或 lib64
)。
下表小编总结了构建基础 shell chroot 环境通常需要的目录结构:
目录路径 | 用途 |
---|---|
bin | 存放用户可执行的二进制命令,如 bash , ls , cat |
lib / lib64 | 存放 bin 目录下命令所依赖的共享库文件 |
etc | 包含基本的配置文件,如 passwd , group |
home | 被囚禁用户的家目录 |
dev | 创建必要的设备文件节点,如 null , zero , tty |
这种方法虽然提供了更大的灵活性,但维护起来也更繁琐,通常不建议除非有特殊需求。
相关问答 (FAQs)
A1: 这通常是权限问题。chroot
的根目录(/home/sftp_jail
)必须由 root
用户拥有,并且权限不能超过 755,用户在其 chroot
环境中的家目录(/home/sftp_jail/upload
)必须授予该用户完全的读写执行权限(chown user:user /home/sftp_jail/upload
),如果权限配置错误,用户将无法正常访问其目录或执行操作。
A2: 这是因为在 sshd_config
配置中,我们使用了 ForceCommand internal-sftp
指令,这个指令强制用户登录后只能启动 SFTP 服务,而无法获得一个交互式的 shell,如果你希望用户能够获得 shell,你需要:1) 确保用户的 shell 不是 /sbin/nologin
;2) 移除或注释掉 ForceCommand internal-sftp
;3) 在 chroot
目录中手动构建一个包含 shell 及其依赖库的完整运行环境,这是一个更复杂的配置,仅建议在确实需要时使用。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复