SFTP是用来传输文件的技术,基于SSH,与FTP相比其数据是加密传输的,相对较为安全。
本文详细介绍如何在 Windows 系统上配置 OpenSSH SFTP 服务器,创建专用用户,并限制用户只能访问指定目录。

环境要求
- Windows 10 1809 或更高版本 / Windows Server 2019 或更高版本
- 管理员权限
安装 OpenSSH 服务器
方法一:通过设置安装(推荐)
- 打开"设置" → "应用" → "可选功能"
- 点击"添加功能"
- 找到并选择"OpenSSH 服务器"
- 点击"安装"
方法二:通过 PowerShell 安装
# 检查可用组件
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
# 安装 OpenSSH 服务器
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
基本配置
启动 SSH 服务
# 启动服务
Start-Service sshd
# 设置开机自启
Set-Service -Name sshd -StartupType 'Automatic'
# 验证服务状态
Get-Service sshd
配置防火墙
# 检查防火墙规则
Get-NetFirewallRule -Name *ssh*
# 如果不存在规则,创建新规则
New-NetFirewallRule -Name "OpenSSH-Server-TCP-22" -DisplayName "OpenSSH Server (sshd)" -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
创建 SFTP 专用用户
创建用户
# 创建新用户
$password = ConvertTo-SecureString "您的密码" -AsPlainText -Force
New-LocalUser -Name "sftpuser" -Password $password -Description "SFTP User" -PasswordNeverExpires $true
准备用户目录
# 创建用户专属目录
New-Item -ItemType Directory -Path "D:\SFTPRoot" -Force
New-Item -ItemType Directory -Path "D:\SFTPRoot\sftpuser" -Force
配置目录限制访问(Chroot)
设置目录权限
# 设置根目录权限(关键步骤)
icacls "D:\SFTPRoot" /setowner "Administrators"
icacls "D:\SFTPRoot" /inheritance:r
icacls "D:\SFTPRoot" /grant "Administrators:(OI)(CI)F"
icacls "D:\SFTPRoot" /grant "SYSTEM:(OI)(CI)F"
icacls "D:\SFTPRoot" /grant "sftpuser:(OI)(CI)RX"
# 设置用户子目录权限
icacls "D:\SFTPRoot\sftpuser" /inheritance:r
icacls "D:\SFTPRoot\sftpuser" /grant "sftpuser:(OI)(CI)F"
配置 SSH 服务器
编辑配置文件 C:\ProgramData\ssh\sshd_config:
# 在文件末尾添加以下配置
Match User sftpuser
ForceCommand internal-sftp
ChrootDirectory D:\SFTPRoot
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
PasswordAuthentication yes
重启服务应用配置
Restart-Service sshd
测试连接
本地测试
sftp -P 22 sftpuser@localhost
远程测试
使用 SFTP 客户端(如 WinSCP、FileZilla)连接:
- 主机:您的服务器 IP
- 端口:22
- 用户名:sftpuser
- 密码:您设置的密码
故障排除
####服务无法启动
# 检查配置文件语法
C:\Windows\System32\OpenSSH\sshd.exe -t
# 查看详细错误信息
Get-EventLog -LogName Application -Source "OpenSSH" -Newest 5 | Format-List *
####连接被拒绝
# 检查端口监听状态
netstat -ano | findstr :22
# 检查防火墙设置
Get-NetFirewallRule -Name *ssh* | Format-Table Name, Enabled, Action
权限问题
# 检查目录权限
icacls "D:\SFTPRoot"
icacls "D:\SFTPRoot\sftpuser"
高级配置
####使用密钥认证
- 生成密钥对:
ssh-keygen -t rsa -b 4096 -f C:\Users\用户名\.ssh\sftp_key
- 将公钥复制到服务器:
# 创建 .ssh 目录
mkdir "D:\SFTPRoot\sftpuser\.ssh" -Force
# 设置权限
icacls "D:\SFTPRoot\sftpuser\.ssh" /inheritance:r
icacls "D:\SFTPRoot\sftpuser\.ssh" /grant "sftpuser:(OI)(CI)F"
# 复制公钥
Copy-Item "公钥路径" "D:\SFTPRoot\sftpuser\.ssh\authorized_keys"
# 设置 authorized_keys 文件权限
icacls "D:\SFTPRoot\sftpuser\.ssh\authorized_keys" /inheritance:r
icacls "D:\SFTPRoot\sftpuser\.ssh\authorized_keys" /grant "sftpuser:F"
- 在 sshd_config 中启用密钥认证:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
多用户配置
为每个用户添加独立的 Match 块:
Match User user1
ForceCommand internal-sftp
ChrootDirectory D:\SFTPRoot\user1
Match User user2
ForceCommand internal-sftp
ChrootDirectory D:\SFTPRoot\user2
常用命令参考
服务管理
# 启动服务
Start-Service sshd
# 停止服务
Stop-Service sshd
# 重启服务
Restart-Service sshd
# 检查状态
Get-Service sshd
权限管理
# 查看权限
icacls "目录路径"
# 修改所有者
icacls "目录路径" /setowner "用户名"
# 授予权限
icacls "目录路径" /grant "用户名:(权限)"
# 移除继承
icacls "目录路径" /inheritance:r
注意事项
- Chroot 目录必须由 Administrators 或 SYSTEM 所有
- 用户不能对 Chroot 根目录有写权限
- 配置文件修改后必须重启服务
- 权限设置错误可能导致服务无法启动
- 确保防火墙允许 SSH 连接
通过本教程,您应该能够在 Windows 系统上成功配置一个安全的 SFTP 服务器,并限制用户只能访问指定目录。