类别:CentOS / 日期:2026-07-24 / 浏览:2596 / 评论:0
在CentOS 7上部署一个安全、功能正常的SFTP服务器,核心是使用系统自带的OpenSSH服务,并通过internal-sftp和ChrootDirectory来限制用户只能访问自己的目录。以下是详细的步骤:
整个部署过程可以清晰地分为六个步骤,请按顺序执行。
1. 安装与启动SSH服务(默认已安装,可跳过这步骤)
CentOS 7默认已安装OpenSSH,但最好先确认一下。
# 安装OpenSSH服务器(如果尚未安装) sudo yum install -y openssh-server # 启动SSH服务并设置开机自启 sudo systemctl start sshd sudo systemctl enable sshd # 检查服务运行状态 sudo systemctl status sshd
sftp依赖于SSH服务,无需额外安装。另外,请确保防火墙放行了SSH端口(默认为22):
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload
2. 创建专用用户组和用户
为了便于管理,建议创建一个专门用于SFTP的用户组,并添加一个没有Shell登录权限的用户。
# 创建用户组(例如命名为sftpusers) sudo groupadd sftpusers # 创建用户,指定家目录,加入组,并禁止Shell登录 # -g: 指定主组,-d: 指定家目录,-s: 指定Shell,/sbin/nologin 表示禁止登录 sudo useradd -g sftpusers -d /home/sftpuser -s /sbin/nologin sftpuser # 为用户设置密码 sudo passwd sftpuser
3. 创建目录结构并设置权限(关键步骤)
这是最容易出错的地方。ChrootDirectory指定的根目录必须由root拥有,且权限不能超过755,否则用户无法登录。
# 1. 创建用户的家目录(作为Chroot的根目录) sudo mkdir -p /home/sftpuser # 2. 将家目录的所有者改为root,组改为sftpusers,权限设为755 # 这样用户才能进入这个目录,但没有写入权限 sudo chown root:sftpusers /home/sftpuser sudo chmod 755 /home/sftpuser # 3. 在根目录下创建一个用于上传文件的子目录(例如upload) # 用户将拥有此目录的写入权限 sudo mkdir -p /home/sftpuser/upload # 4. 将此子目录的所有权交给sftpuser用户 sudo chown sftpuser:sftpusers /home/sftpuser/upload
为什么需要这样设置?:用户登录后会被锁定在/home/sftpuser目录下。为了保证这个“监狱”的安全,用户不能对这个监狱的“牢门”(根目录)有写权限。因此,需要一个由root拥有且用户只读的根目录,并在其中创建一个用户自有权限的upload文件夹来存放文件。
4. 配置SSH服务
编辑SSH的主配置文件/etc/ssh/sshd_config。
sudo vi /etc/ssh/sshd_config
注释掉原有的Subsystem行(大约在第80行),前面加个#号
# 找到这一行(大约在第80行) # Subsystem sftp /usr/libexec/openssh/sftp-server
在文件末尾添加以下配置:
# 使用更安全的 internal-sftp 子系统,而不是 sftp-server Subsystem sftp internal-sftp # 对 sftpusers 组的用户应用以下规则 Match Group sftpusers # 将用户限制在自己的家目录 ChrootDirectory %h # 强制使用 SFTP,禁止执行任何Shell命令 ForceCommand internal-sftp # 禁用端口转发和X11转发以增强安全性 AllowTcpForwarding no X11Forwarding no PermitTTY no
参数解释:%h是一个变量,代表用户的家目录。
5. 重启服务并测试
配置完成后,需要重启SSH服务并测试连接。
# 1. 检查配置文件语法是否正确 sudo sshd -t # 2. 如果语法无误,重启SSH服务 sudo systemctl restart sshd # 3. 在本地或另一台机器上进行测试 sftp sftpuser@你的服务器IP
如果登录失败,请查看日志/var/log/secure获取详细错误信息,这通常是权限设置不正确引起的。
6. 处理SELinux(如需要)
如果系统启用了SELinux,即使权限设置正确,也可能因上下文问题导致无法访问。作为排查手段,可以先临时关闭SELinux进行测试:
sudo setenforce 0
如果关闭后问题解决,则需要配置SELinux策略或永久关闭它。永久关闭需编辑/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled,然后重启系统。生产环境建议通过设置chcon或semanage来配置正确的安全上下文,而非直接关闭。
⚠️ 关键注意事项
权限是核心:ChrootDirectory指定的目录及其所有上级目录,都必须是root所有,且权限不大于755。这是导致连接失败的最常见原因。
使用internal-sftp:这是OpenSSH的内置SFTP服务,配置和管理上比独立的sftp-server更简单、更安全。
禁止Shell登录:为用户指定/sbin/nologin或/bin/false作为Shell,可以防止用户通过SSH登录到系统执行命令,仅用于SFTP传输文件


