在 Linux 服务器上配置 SFTP 的完整指南(2025 最新安全实践)
适用对象:需要在 Linux 服务器上为团队、客户或应用安全传输文件的开发者与系统管理员。
适用系统:Ubuntu / Debian / CentOS / Rocky / AlmaLinux / RHEL 等。
更新时间:2025 年 10 月。
一、为什么要使用 SFTP?
SFTP(SSH File Transfer Protocol) 是一种基于 SSH 的安全文件传输协议。
与传统 FTP 不同,它:
- 只使用 22 端口(无需额外开放端口);
- 传输过程 全程加密;
- 可以直接复用现有的 SSH 用户体系;
- 支持目录隔离(Chroot)、日志审计、密钥认证等安全机制。
SFTP 是企业和个人服务器最常用、最安全的文件上传方式之一。
二、准备工作:安装并启动 OpenSSH
SFTP 依赖于 OpenSSH Server,一般系统已自带。若未安装,可手动安装:
Ubuntu / Debian
sudo apt update && sudo apt install -y openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
CentOS / RHEL / Rocky / AlmaLinux
sudo yum install -y openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
检查状态:
sudo systemctl status ssh # 或 sshd
三、创建 SFTP 专用用户与组
为避免安全风险,不应让普通 SSH 用户直接使用 SFTP。
我们新建一个受限用户组和用户:
sudo groupadd sftpusers
sudo useradd -m -g sftpusers -s /usr/sbin/nologin sftpuser
sudo passwd sftpuser
说明:
-s /usr/sbin/nologin
禁止该用户获得 shell 登录权限;sftpusers
组将作为 SFTP 登录的唯一匹配组。
四、配置文件存储目录与权限
为了实现安全隔离,我们使用 Chroot 限制用户访问范围。
sudo mkdir -p /data/sftp/uploads
sudo chown root:root /data/sftp
sudo chmod 755 /data/sftpsudo chown sftpuser:sftpusers /data/sftp/uploads
sudo chmod 700 /data/sftp/uploads
🔒 权限说明
路径 | 拥有者 | 权限 | 说明 |
---|---|---|---|
/data/sftp | root:root | 755 | Chroot 根目录,必须为 root 拥有 |
/data/sftp/uploads | sftpuser:sftpusers | 700 | 用户实际可写目录 |
五、修改 SSH 配置文件(关键步骤)
编辑 /etc/ssh/sshd_config
:
sudo nano /etc/ssh/sshd_config
确认或添加以下配置:
Subsystem sftp internal-sftpPasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
然后在文件底部添加以下段落:
Match Group sftpusersChrootDirectory /data/sftpForceCommand internal-sftpAllowTcpForwarding noX11Forwarding noPermitTunnel no
✅ 配置解读
配置项 | 含义 |
---|---|
Subsystem sftp internal-sftp | 启用内置 SFTP 服务 |
ChrootDirectory /data/sftp | 限制用户在该路径内活动 |
ForceCommand internal-sftp | 禁止执行任何 shell 命令 |
AllowTcpForwarding no | 禁止端口转发 |
PermitTunnel no | 禁止隧道连接 |
X11Forwarding no | 禁止图形界面转发 |
保存并退出。
六、重启 SSH 服务
应用配置:
sudo systemctl restart ssh # Ubuntu / Debian
sudo systemctl restart sshd # CentOS / RHEL
七、测试连接
在本地客户端使用命令行或图形工具测试:
sftp sftpuser@your_server_ip
输入密码后,应出现:
sftp>
在交互模式下可执行:
sftp> pwd
sftp> cd uploads
sftp> put test.txt
sftp> get test.txt
上传与下载应都能正常工作。
八、安全强化(2025 推荐做法)
1. 使用 SSH 密钥认证(推荐)
在客户端生成密钥:
ssh-keygen -t ed25519
将公钥复制到服务器:
mkdir -p /home/sftpuser/.ssh
echo "你的公钥内容" | sudo tee /home/sftpuser/.ssh/authorized_keys
sudo chmod 700 /home/sftpuser/.ssh
sudo chmod 600 /home/sftpuser/.ssh/authorized_keys
sudo chown -R sftpuser:sftpusers /home/sftpuser/.ssh
然后编辑 sshd_config
禁用密码登录:
PasswordAuthentication no
PubkeyAuthentication yes
重启服务即可。
2. 设置磁盘配额(防止滥用)
通过 quota
或 systemd
限制用户资源:
sudo apt install quota
sudo edquota -u sftpuser
可设定最大磁盘占用、文件数等。
3. 启用日志与审计
所有登录与文件传输操作会记录在:
/var/log/auth.log # Ubuntu / Debian
/var/log/secure # CentOS / RHEL
如需更详细记录,可安装 auditd
:
sudo apt install auditd
sudo auditctl -w /data/sftp/uploads -p war -k sftp_watch
这样所有文件写入、读取都会被记录。
4. 定期升级 OpenSSH 与系统补丁
保持系统最新:
sudo apt update && sudo apt upgrade -y
或设置自动安全更新:
sudo apt install unattended-upgrades
5. 拓展建议(企业级场景)
场景 | 推荐方案 |
---|---|
多用户隔离 | 每个用户独立子目录,如 /data/sftp/user1/uploads |
审计与监控 | 使用 ELK / Graylog 收集 SFTP 日志 |
容器化部署 | 在 Docker / Podman 容器中运行 SFTP 服务 |
自动化管理 | 使用 Ansible / Terraform 批量配置 |
九、常见错误与解决方法
报错信息 | 可能原因 | 解决办法 |
---|---|---|
bad ownership or modes for chroot directory | 根目录权限非 root 拥有 | sudo chown root:root /data/sftp |
subsystem request failed on channel 0 | SSH 配置中未启用 internal-sftp | 添加 Subsystem sftp internal-sftp |
登录成功但无法写入 | 上传目录权限不正确 | 检查 /data/sftp/uploads 权限是否为 700 |
十、总结
目标 | 推荐做法 |
---|---|
安全传输文件 | 使用 SFTP(基于 SSH) |
防止越权访问 | 配置 Chroot 隔离 |
禁止 Shell 登录 | ForceCommand internal-sftp |
防止暴力破解 | 使用 SSH 公钥认证 |
服务器安全性 | 定期更新 OpenSSH + 开启日志审计 |
配置完成后,你的服务器就能在保证安全的前提下,稳定地提供 SFTP 文件服务。
📚 延伸阅读
- OpenSSH 官方手册
- Ubuntu Server Guide: SFTP Setup
- RHEL 9 System Administrator Guide – Secure File Transfer
- CIS Benchmark for Linux SSH