在服务器文件传输场景中,FTP与SFTP是主流传输协议,但多数开发者容易混淆二者核心差异,且在手动配置SFTP服务时,频繁遇到权限报错、登录失败、目录无法访问、用户越权等各类问题。
本文主打干货实操、无废话教学,全方位对比 SFTP 与 FTP 核心区别,手把手带你搭建生产级安全隔离 SFTP 服务,实现用户目录隔离、禁止终端登录、权限加固,适配 CentOS、Ubuntu 全系 Linux 发行版,所有命令可直接复制落地使用。
一、SFTP与FTP核心区别详解
SFTP(SSH文件传输协议)与 FTP(文件传输协议)虽然功能一致,均用于服务器文件上传、下载、传输,但底层安全机制、连接逻辑天差地别。核心结论:FTP 明文传输、安全性极低,仅适合内网临时测试;SFTP 基于 SSH 加密隧道传输、权限隔离严谨,是企业生产环境唯一推荐方案。
1.1 安全性对比(核心差异)
SFTP 安全机制
-
基于SSH安全隧道传输,全程链路加密,自带加密、校验、身份认证机制。
-
账号、密码、文件数据全程加密,网络抓包无法窃取、篡改,无数据泄露风险。
-
支持密码、密钥对等多种认证方式,满足生产安全规范。
FTP 安全机制
-
原生FTP为明文传输,所有传输数据可被直接拦截、窃取,安全性极差。
-
扩展FTPS加密方式配置繁琐、兼容性差,生产环境极少使用。
-
无原生数据校验机制,传输可靠性低。
1.2 连接方式与端口
SFTP 连接特性
-
复用SSH服务,仅使用默认22端口,控制、数据传输共用单端口。
-
防火墙适配性强,云服务器默认放行22端口,无需额外配置穿透规则。
-
无主动/被动模式区分,连接稳定,无端口冲突问题。
FTP 连接特性
-
双端口通信:21端口负责控制连接,随机高位端口负责数据传输。
-
随机数据端口易被防火墙拦截,需批量放行端口,配置复杂且有安全隐患。
-
分主动、被动两种工作模式,适配复杂,新手极易配置出错。
1.3 传输性能
SFTP
-
因加密解密运算存在轻微性能开销,海量小文件、超高并发场景速度略低于FTP。
-
常规业务场景下性能差异可忽略,完全满足业务需求。
FTP
-
无加密开销,理论传输速度更快。
-
硬件与带宽升级后,二者性能差距持续缩小,FTP性能优势远抵不上安全缺陷。
1.4 易用性与兼容性
SFTP
-
依托系统自带OpenSSH服务,Linux、Mac、Windows均无需额外安装服务端。
-
主流客户端WinSCP、FileZilla、Xshell全兼容,配置统一、上手简单。
FTP
-
需独立部署vsftpd等专用服务,客户端需单独安装。
-
端口、模式、权限配置繁琐,易出现连接、读写异常问题。
1.5 服务器部署要求
SFTP
-
依托系统默认预装的OpenSSH运行,无需部署独立服务。
-
可与SSH远程登录共存,支持用户、权限统一管控。
FTP
-
必须部署独立FTP服务,与系统SSH服务完全隔离。
-
运维、权限、日志需单独配置,运维成本更高。
二、生产级SFTP服务完整配置教程(Linux)
本次采用用户组隔离+根目录锁定+禁止SSH终端登录安全方案,实现SFTP用户仅能访问指定目录,杜绝越权访问,适配生产环境。
环境适配:CentOS7/8、Ubuntu18.04+ 全通用
2.1 创建SFTP专属用户组
单独创建用户组统一管理SFTP用户,方便批量运维和权限管控。
# 创建sftpgroup用户组
sudo groupadd sftpgroup
2.2 创建SFTP专属用户
创建专用传输用户,禁止终端登录,仅保留SFTP文件传输权限。
# 创建用户,指定目录、归属组,禁止终端登录
sudo useradd -d /tdb/sftp/tuser -m -s /bin/false -g sftpgroup tuser
参数说明:
-
-d:指定用户家目录
-
-m:自动创建对应目录
-
-s /bin/false:禁止SSH终端登录
-
-g:加入指定SFTP用户组
2.3 设置用户登录密码
# 为SFTP用户设置密码
sudo passwd tuser
执行后输入自定义密码即可,建议采用「数字+字母+特殊符号」组合,提升安全性。
2.4 创建SFTP根目录并配置权限
关键避坑:SFTP Chroot根目录必须归属root用户,否则直接登录报错。
# 创建SFTP总根目录
sudo mkdir /tdb/sftp_root
# 根目录权限绑定root,保证安全合规
sudo chown root:sftpgroup /tdb/sftp_root
sudo chmod 750 /tdb/sftp_root
2.5 创建用户专属传输目录
根目录无用户写入权限,需单独创建用户子目录用于文件读写。
# 创建用户专属目录并配置读写权限
sudo mkdir /tdb/sftp_root/tuser
sudo chown tuser:sftpgroup /tdb/sftp_root/tuser
sudo chmod 750 /tdb/sftp_root/tuser
2.6 修改SSH核心配置文件
通过修改sshd_config,启用内置SFTP服务、锁定用户目录、关闭高危权限。
# 编辑SSH配置文件
sudo vi /etc/ssh/sshd_config
1、替换默认SFTP子系统配置
注释原有配置,替换为内置模式:
# 原配置(注释/删除,禁用独立sftp-server)
# Subsystem sftp /usr/lib/openssh/sftp-server
# 新配置(使用系统内置SFTP服务,支持Chroot权限隔离)
Subsystem sftp internal-sftp
2、文件末尾添加隔离规则(必须放文末)
# 仅对 sftpgroup 用户组生效,不影响服务器普通SSH用户
Match Group sftpgroup
# 锁定用户根目录,%u 自动匹配当前登录用户名,实现单用户独立目录
ChrootDirectory /tdb/sftp_root/%u
# 强制仅启用SFTP文件传输,禁止终端登录、命令交互
ForceCommand internal-sftp
# 关闭端口转发,杜绝端口穿透安全风险
AllowTcpForwarding no
# 关闭图形界面转发,最小化权限暴露
X11Forwarding no
重点注意:该组匹配规则必须放在 sshd_config 文件最末尾,否则会全局生效,导致普通服务器用户无法 SSH 登录。
2.7 重启SSH服务生效
# CentOS/Rocky Linux
sudo service sshd restart
# Ubuntu/Debian
sudo service ssh restart
配置完成后,可执行 systemctl status sshd 查看服务状态,确保配置无报错、服务正常运行,避免配置错误导致登录异常。
三、SFTP连接测试与使用
使用WinSCP、FileZilla等客户端连接,参数如下:
-
传输协议:SFTP
-
连接地址:服务器内网/公网IP
-
端口:22(默认端口无需修改)
-
用户名:tuser
-
密码:自定义用户密码
连接成功后,该 SFTP 用户会被严格锁定在专属目录 /tdb/sftp_root/tuser,无法切换到系统根目录及其他业务目录,完美实现权限隔离、安全受控的生产要求。
四、常见问题与避坑总结
-
登录报错Permission denied:Chroot根目录权限异常,根目录必须为root归属、权限750,子目录归属对应用户。
-
能登录但无法上传文件:根目录仅用于权限锁定,无写入权限,所有文件操作需在用户专属子目录内执行。
-
普通用户SSH无法登录:SFTP的Match Group规则未放在配置文件末尾,导致全局配置异常,移至文末即可解决。
-
系统适配报错:CentOS重启服务为sshd,Ubuntu为ssh,核心配置语法完全通用。
-
客户端连接超时:检查服务器防火墙、云平台安全组是否放行22端口,确认SSH服务正常运行。
五、进阶配置:SFTP密钥登录(免密、高安全)
传统密码登录方式存在暴力破解、密码泄露等安全风险,无法满足生产安全规范。企业生产环境强制推荐密钥对免密登录,安全性远超密码登录,且无需手动输入密码、适配自动化传输场景。本节在原有密码登录配置基础上,新增密钥登录方案,支持「密码/密钥双模式」或「纯密钥模式」,可按需切换。
5.1 原理说明
密钥登录采用「公私钥配对校验机制」:私钥唯一留存本地客户端,严禁泄露、外传;公钥上传至服务器对应用户目录。客户端发起连接时,服务端自动校验密钥匹配度,校验通过即可免密登录,杜绝密码爆破风险。
5.2 客户端生成密钥对
推荐使用Xshell、WinSCP或系统自带工具生成,默认生成RSA加密密钥(兼容性最强)。
Windows/Mac通用命令生成(本地终端执行):
# 生成rsa密钥对,默认生成 id_rsa(私钥)、id_rsa.pub(公钥)
ssh-keygen -t rsa
执行命令后全程回车默认配置即可,无需自定义参数,密钥对会自动生成在本地系统默认 SSH 目录下,兼容性最佳。
5.3 服务器配置公钥授权
登录服务器,为SFTP用户创建密钥授权目录,导入客户端公钥,严格配置权限(权限过大会导致密钥登录失效)。
# 切换至SFTP用户目录,创建.ssh隐藏目录
sudo mkdir -p /tdb/sftp_root/tuser/.ssh
# 将本地生成的 id_rsa.pub 公钥内容写入授权文件
sudo vim /tdb/sftp_root/tuser/.ssh/authorized_keys
将本地生成的 id_rsa.pub 公钥文件内的全部内容,粘贴至该文件中,保存退出。
5.4 关键权限配置(必做,避坑核心)
SSH 密钥认证对目录和文件权限极其严苛,权限过宽会被系统判定为不安全,直接导致免密登录失败,以下为必须执行的权限固化命令:
# .ssh目录权限 700
sudo chmod 700 /tdb/sftp_root/tuser/.ssh
# 授权文件权限 600
sudo chmod 600 /tdb/sftp_root/tuser/.ssh/authorized_keys
# 归属绑定SFTP用户
sudo chown -R tuser:sftpgroup /tdb/sftp_root/tuser/.ssh
5.5 配置SSH支持密钥登录
编辑SSH配置文件,开启密钥认证(默认开启,核对即可):
sudo vi /etc/ssh/sshd_config
确保以下两项参数开启(去除注释、参数设为 yes,系统默认开启,仅需核对):
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
修改完成重启SSH服务:
# CentOS
sudo service sshd restart
# Ubuntu
sudo service ssh restart
5.6 客户端密钥登录测试
打开WinSCP/FileZilla/Xshell,连接参数修改:
-
协议:SFTP
-
IP/端口:保持不变
-
用户名:tuser
-
登录方式:选择「密钥登录」,导入本地私钥文件 id_rsa
配置完成后无需输入密码,可直接连接登录,文件上传、下载、修改、删除功能完全正常,适配自动化脚本、定时传输等业务场景。
5.7 进阶加固:关闭密码登录(生产推荐)
密钥登录测试正常、确认无问题后,可直接关闭服务器密码登录功能,彻底杜绝暴力破解、密码泄露风险,适配企业生产安全标准:
sudo vi /etc/ssh/sshd_config
修改参数:
PasswordAuthentication no
重启 SSH 服务后,服务器将彻底禁用密码登录,仅支持密钥免密登录,服务安全性拉满。
5.8 生产加固:修改SFTP/SSH默认22端口
默认22端口为公网周知端口,极易被端口扫描、暴力破解攻击。生产环境建议修改SSH默认端口,SFTP跟随SSH端口生效,无需单独配置,是低成本、高收益的安全加固手段。
原理:SFTP 完全复用 SSH 服务端口,修改 SSH 端口后,SFTP 连接端口同步变更。
1、编辑SSH配置文件
sudo vi /etc/ssh/sshd_config
2、修改端口配置
找到 #Port 22 配置项,取消注释,修改为自定义端口(建议选择 10000–65535 区间未占用端口,示例以22022为例):
# Port 22 # 注释默认22端口
Port 22022 # 自定义新端口
3、防火墙/安全组放行新端口(必做)
云服务器必操作:登录云平台控制台,在安全组放行自定义端口 22022,否则无法连接。
服务器本地防火墙放行(CentOS):
# 放行新端口
firewall-cmd --permanent --add-port=22022/tcp
# 重载防火墙
firewall-cmd --reload
Ubuntu 放行端口:
ufw allow 22022/tcp
ufw reload
4、重启SSH服务生效
# CentOS/Rocky
sudo service sshd restart
# Ubuntu/Debian
sudo service ssh restart
5、客户端连接方式变更
后续 SFTP / SSH 连接,端口不再使用22,需填写自定义端口 22022,协议依旧为 SFTP。
端口修改核心注意事项
-
禁止使用1000以下知名端口,避免与系统服务端口冲突;
-
修改端口前务必放行新端口,避免重启SSH后直接失联;
-
端口修改后,所有自动化SFTP脚本、客户端连接参数需同步更新;
-
SFTP无独立端口,完全跟随SSH端口,无需额外配置。
六、全文总结
1、安全性层面:SFTP全程加密、权限隔离,完胜明文传输的FTP,是目前生产环境唯一推荐的文件传输协议;FTP仅适用于内网临时测试场景,严禁外网使用。
2、运维层面:SFTP依托系统自带SSH服务,无需额外部署程序,防火墙适配性强,配置简单、维护成本低。
3、基础安全配置核心:用户组隔离、禁止终端登录、Chroot根目录锁定、关闭高危转发权限,杜绝用户越权访问。
4、高阶安全方案:优先使用密钥免密登录,关闭密码认证,彻底规避账号暴力破解风险,完全满足企业生产安全规范。