- 使用 OpenSSH (最推荐):这是最简单、最常见的方法,因为绝大多数 Linux 系统已经安装了 SSH 服务器,我们只需要进行一些配置即可,它不需要额外安装服务,安全性也依赖于久经考验的 OpenSSH。
- 使用 vsftpd +
ssh-vault(较少见):这种方法需要额外安装一个 FTP 服务器和一个包装程序,配置相对复杂,不推荐新手使用。
下面我将详细介绍 使用 OpenSSH 配置 SFTP 的完整步骤,这是业界标准做法。

核心思想:通过 SSH 配置文件限制用户
SFTP 实际上是基于 SSH 协议的文件传输协议,我们配置的不是“SFTP 服务器”本身,而是“SSH 服务器”的行为,我们可以通过修改 SSH 配置文件 (sshd_config),为特定用户或用户组设置一个“沙盒”环境,限制他们只能使用 SFTP 进行文件传输,而不能通过 SSH 登录系统执行其他命令。
详细配置步骤
步骤 1:检查并安装 OpenSSH
大多数 Linux 发行版默认已安装 OpenSSH,如果没有,请安装它。
对于 Debian / Ubuntu:
sudo apt update sudo apt install openssh-server
对于 CentOS / RHEL / Fedora:

sudo yum install openssh-server # 或者使用 dnf (在较新版本中) sudo dnf install openssh-server
安装完成后,SSH 服务通常会自动启动,你可以检查其状态:
sudo systemctl status sshd
如果未启动,使用以下命令启动并设置为开机自启:
sudo systemctl start sshd sudo systemctl enable sshd
步骤 2:创建专用的 SFTP 用户
为了安全和隔离,最好不要让系统用户(如 root, admin)直接使用 SFTP,我们创建一个专门用于 SFTP 的用户组和一个或多个用户。
-
创建 SFTP 用户组
(图片来源网络,侵删)sudo groupadd sftpusers
-
创建 SFTP 用户并添加到组 假设我们要创建一个名为
sftpuser的用户,并将其主目录设置为/home/sftpuser/uploads。# 创建用户,设置密码,并指定主目录 sudo useradd -m -d /home/sftpuser/uploads -s /bin/false -G sftpusers sftpuser # 为新用户设置密码 sudo passwd sftpuser
-m: 自动创建用户主目录。-d /home/sftpuser/uploads: 指定用户的主目录。这个目录将作为用户的 SFTP 根目录。-s /bin/false: 非常重要! 这会禁止该用户使用 SSH 登录(不能ssh sftpuser@server),我们只允许它进行 SFTP 连接。-G sftpusers: 将用户添加到sftpusers组中,方便后续进行批量配置。
-
设置主目录权限 为了让 SFTP 服务能正确地限制用户在其主目录内活动,目录的权限设置非常关键,错误的权限会导致用户无法登录。
# 设置主目录的所有者为 root sudo chown root:root /home/sftpuser/uploads # 设置主目录的权限为 755 sudo chmod 755 /home/sftpuser/uploads
为什么是
root:root和755?- SFTP 服务需要以
root权限来“chroot”(限制)用户到其主目录,如果主目录属于用户自己,chroot操作可能会失败,因为用户没有权限修改其上级目录。 755权限确保了所有者(root)有读写执行权限,组和其他用户有读和执行权限,这是chroot操作所必需的。
- SFTP 服务需要以
-
创建用户可写的子目录 用户无法在其根目录(
/home/sftpuser/uploads)下创建文件,因为该目录不属于它,我们需要在根目录下创建一个子目录,并将其所有权分配给用户。# 在根目录下创建一个名为 "files" 的子目录 sudo mkdir /home/sftpuser/uploads/files # 将这个子目录的所有权分配给 sftpuser 用户 sudo chown sftpuser:sftpuser /home/sftpuser/uploads/files # 设置子目录的权限 sudo chmod 755 /home/sftpuser/uploads/files
sftpuser登录后,只能看到并访问/home/sftpuser/uploads/files目录,并且可以在这个目录里上传、下载、创建文件和文件夹。
步骤 3:配置 SSH 服务器 (sshd_config)
这是最关键的一步,我们需要编辑 OpenSSH 的主配置文件。
-
编辑配置文件
sudo nano /etc/ssh/sshd_config
-
添加或修改配置 在文件末尾添加以下内容:
# Subsystem for SFTP Subsystem sftp internal-sftp # Match for users in the 'sftpusers' group Match Group sftpusers # Force the command to be internal-sftp, ignoring any user's ~/.ssh/rc or ~/.ssh/authorized_keys command ForceCommand internal-sftp # Chroot the user to their home directory ChrootDirectory %h # Allow the user to write files, but not to modify their own home directory (already handled by permissions) # This is often not needed if permissions are set correctly on the root directory # AllowTcpForwarding no # X11Forwarding no配置解释:
Subsystem sftp internal-sftp: 指定 SFTP 子系统使用 OpenSSH 内置的internal-sftp实现,这是最标准的方式。Match Group sftpusers: 这是一个指令块,它后面所有的配置只对sftpusers组中的用户生效。ForceCommand internal-sftp: 强制执行internal-sftp命令,即使用户在~/.ssh/authorized_keys文件中设置了其他的命令(command="..."),也会被忽略,这确保了用户只能进行 SFTP 操作。ChrootDirectory %h: 核心配置,将用户限制(chroot)到其主目录 (%h是一个变量,代表用户的主目录),用户将无法看到或访问其主目录之外的任何文件系统。
-
(可选)禁用密码登录,只允许密钥登录(更安全) 在
sshd_config文件中找到并修改以下行:# PasswordAuthentication yes # 改为 PasswordAuthentication no # 确保 PubkeyAuthentication 是开启的 PubkeyAuthentication yes
你需要为你的用户生成 SSH 密钥对,并将公钥添加到
~/.ssh/authorized_keys文件中,这样即使密码泄露,攻击者也无法登录。
步骤 4:重启 SSH 服务
保存并关闭 sshd_config 文件后,重启 SSH 服务以使配置生效。
sudo systemctl restart sshd
步骤 5:测试 SFTP 连接
你可以使用任何 SFTP 客户端(如 FileZilla, WinSCP, 或命令行 sftp)来测试连接。
使用命令行 sftp 测试:
# 格式: sftp <username>@<server_ip> sftp sftpuser@your_server_ip
如果配置成功,你会看到类似 Connected to your_server_ip. 的提示,并且会直接进入用户的 SFTP 根目录(在用户看来是 ,实际上是 /home/sftpuser/uploads)。
sftp> pwd / sftp> ls files sftp> cd files sftp> pwd /files sftp> put /path/to/local_file.txt Uploading /path/to/local_file.txt to /files/local_file.txt local_file.txt 100% 50 0.0KB/s 00:00 sftp> exit
如果你尝试用 SSH 登录,应该会被拒绝:
ssh sftpuser@your_server_ip # 输出应该类似: # This service allows sftp connections only.
故障排除
如果连接失败,请按以下步骤检查:
- 检查 SSH 服务状态:
sudo systemctl status sshd
- 查看 SSH 日志:
sudo tail -f /var/log/auth.log # Debian/Ubuntu # 或者 sudo tail -f /var/log/secure # CentOS/RHEL
查找与
sshd或sftpuser相关的错误信息,常见的错误是chroot失败,这通常是由于主目录或其父目录的权限不正确导致的。 - 检查文件权限:再次确认
ChrootDirectory(即用户主目录)的权限是755,并且所有者是root。 - SELinux (如果启用):如果系统启用了 SELinux,它可能会阻止
chroot操作,你可以尝试临时禁用 SELinux 来测试:sudo setenforce 0
如果可以连接了,说明是 SELinux 策略问题,你需要为 SFTP 配置正确的 SELinux 上下文,这超出了本教程的范围,但可以搜索 "selinux sftp chroot" 相关资料。
通过以上步骤,你就成功地在 Linux 上配置了一个安全、隔离的 SFTP 服务器,这种方法利用了 OpenSSH 的强大功能,无需额外软件,配置清晰,是生产环境中的首选方案。
