类别: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传输文件


打赏

感谢您的赞助~

打开支付宝扫一扫,即可进行扫码打赏哦~

版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。

 可能感兴趣的文章