如何配置Windows OpenSSH SFTP 服务器

SFTP是用来传输文件的技术,基于SSH,与FTP相比其数据是加密传输的,相对较为安全。

本文详细介绍如何在 Windows 系统上配置 OpenSSH SFTP 服务器,创建专用用户,并限制用户只能访问指定目录。

环境要求

  • Windows 10 1809 或更高版本 / Windows Server 2019 或更高版本
  • 管理员权限

安装 OpenSSH 服务器

方法一:通过设置安装(推荐)

  1. 打开"设置" → "应用" → "可选功能"
  2. 点击"添加功能"
  3. 找到并选择"OpenSSH 服务器"
  4. 点击"安装"

方法二:通过 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"

高级配置

####使用密钥认证

  1. 生成密钥对:
ssh-keygen -t rsa -b 4096 -f C:\Users\用户名\.ssh\sftp_key
  1. 将公钥复制到服务器:
# 创建 .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"
  1. 在 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

注意事项

  1. Chroot 目录必须由 Administrators 或 SYSTEM 所有
  2. 用户不能对 Chroot 根目录有写权限
  3. 配置文件修改后必须重启服务
  4. 权限设置错误可能导致服务无法启动
  5. 确保防火墙允许 SSH 连接

通过本教程,您应该能够在 Windows 系统上成功配置一个安全的 SFTP 服务器,并限制用户只能访问指定目录。