本文介绍 OpenSSH Server(sshd)的特定于 Windows 的配置。
OpenSSH 在 OpenSSH.com 在线维护详细的配置选项文档,本文档集中未包含重复内容。
OpenSSH 配置文件
OpenSSH 具有服务器和客户端设置的配置文件。 OpenSSH 是开源的,从 Windows Server 2019 和 Windows 10(版本 1809)开始,被加到 Windows Server 和 Windows 客户端操作系统中。 因此,此处不会重复 OpenSSH 配置文件的开源文档。 可在 ssh_config手动页上 找到客户端配置文件,对于 OpenSSH 服务器配置文件,可以在 sshd_config手动页上找到。
默认情况下,打开 SSH 服务器(sshd)从 %programdata%\ssh\sshd_config 读取配置数据,或者可以通过使用-f
参数启动sshd.exe
来指定其他配置文件。 如果文件不存在,sshd 服务在启动时会生成一个具有默认配置的文件。
在 Windows 中,OpenSSH 客户端(ssh)按以下顺序从配置文件读取配置数据:
- 启动
ssh.exe
并使用-F
参数,指定配置文件的路径以及该文件中的条目名称。 - %userprofile%\.ssh\config 的用户配置文件。
- 系统范围配置文件位于%programdata%\ssh\ssh_config。
在 Windows 中为 OpenSSH 配置默认 shell
默认命令行界面提供用户在使用 SSH 连接到服务器时看到的体验。 初始默认 Windows 是 Windows 命令 shell(cmd.exe)。 Windows 还包括 PowerShell,第三方命令 shell 也可用于 Windows,并可能配置为服务器的默认 shell。
若要设置默认命令行界面,请先确认 OpenSSH 安装文件夹位于系统路径上。 对于 Windows,默认安装文件夹 %systemdrive%\Windows\System32\openssh。 以下命令显示当前路径设置,并将默认的 OpenSSH 安装文件夹添加到其中。
命令 shell | 要使用的命令 |
---|---|
指令 | path |
PowerShell | $env:path |
通过将 shell 可执行文件 HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
的完整路径添加到字符串值 DefaultShell
中,在 Windows 注册表中配置默认 ssh shell。
例如,以下提升的 PowerShell 命令将默认 shell 设置为 powershell.exe
:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
Sshd_config 中的 Windows 配置
在 Windows 中,sshd 默认从 %programdata%\ssh\sshd_config 读取配置数据,或者可以通过使用-f
参数启动sshd.exe
来指定其他配置文件。
如果文件不存在,sshd 会在启动服务时生成一个具有默认配置的文件。
以下元素提供了通过 sshd_config 中的条目可以实现的特定于 Windows 的配置。 可以在其中实现的其他一些配置设置在此处没有列出,因为在线 Win32 OpenSSH 文档中详细介绍了它们。
小窍门
OpenSSH 服务器(sshd)在服务启动时读取配置文件。 对配置文件所做的任何更改都需要重启服务。
AllowGroups、AllowUsers、DenyGroups、DenyUsers
使用 AllowGroups、 AllowUsers、 DenyGroups 和 DenyUsers 指令控制哪些用户和组可以连接到服务器。 允许/拒绝指令按以下顺序进行处理:DenyUsers、AllowUsers、DenyGroups,最后是AllowGroups。 所有帐户名称都必须以小写形式指定。 有关ssh_config中的 PATTERNS 和通配符的详细信息,请参阅 sshd_config OpenBSD 手册页。
当使用域用户或组配置基于用户/组的规则时,请使用以下格式:user?domain*
。
Windows 允许多种格式指定域主体,但可能与标准 Linux 模式冲突。
因此,添加了 *
来涵盖 FQDN。
此外,此方法使用?
而不是@
,以避免与username@host格式冲突。
工作组用户/组和连接到 internet 的帐户始终解析为其本地帐户名称(不包括域部分,类似于标准 Unix 名称)。 域用户和组严格解析为 NameSamCompatible 格式:domain_short_name\user_name。 所有基于用户/组的配置规则都需要遵循此格式。
以下示例拒绝 contoso\admin 从主机 192.168.2.23 访问,并阻止来自 contoso 域的所有用户。 以下示例还允许属于 contoso\sshusers 组和 contoso\serveroperators 组成员的用户。
DenyUsers contoso\admin@192.168.2.23
DenyUsers contoso\*
AllowGroups contoso\sshusers contoso\serveroperators
以下示例允许用户 本地用户 从主机 192.168.2.23 登录,并允许组 sshusers 的成员。
AllowUsers localuser@192.168.2.23
AllowGroups sshusers
身份验证方法
对于 Windows OpenSSH,唯一可用的身份验证方法是 password
和 publickey
。
重要
目前不支持使用 Microsoft Entra 帐户进行身份验证。
AuthorizedKeysFile
默认值为 .ssh/authorized_keys
。 如果路径不是绝对路径,则采用相对于用户的主目录的路径(或配置文件映像路径),例如,C:\Users\username。 如果用户属于管理员组,则改用 %programdata%/ssh/administrators_authorized_keys 。
小窍门
administrators_authorized_keys 文件必须只具有 NT Authority\SYSTEM 帐户和 BUILTIN\Administrators 安全组的权限条目。 必须向 NT Authority\SYSTEM 帐户授予完全控制权限。 管理员需要 BUILTIN\Administrators 安全组才能管理授权密钥,可以选择所需的访问权限。 若要授予权限,可以打开提升的 PowerShell 提示符并运行命令 icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
。
ChrootDirectory (v7.7.0.0 中添加的支持)
此指令仅支持 sftp 会话。 到 cmd.exe
的远程会话不遵循 ChrootDirectory
。 若要设置仅限 sftp 的 chroot 服务器,请设置为 ForceCommand
internal-sftp。 还可以使用 chroot 设置 scp,方法是实现仅允许 scp 和 sftp 的自定义 shell。
GSSAPI身份验证
配置 GSSAPIAuthentication
参数指定是否允许基于 GSSAPI 的用户身份验证。 默认值 GSSAPIAuthentication
为 no。
GSSAPI 身份验证还要求在使用 OpenSSH 客户端时使用 -K
指定主机名的开关。 或者,可以在 SSH 客户端配置中创建相应的条目。 在 Windows 中,OpenSSH 客户端默认从 %userprofile%.ssh\config 读取配置数据。
可以看到 GSSAPI OpenSSH 客户端配置示例:
# Specify a set of configuration arguments for a host matching the pattern SERVER01.contoso.com
# Patterns are case sensitive
Host SERVER01.contoso.com
# Enables GSSAPI authentication
GSSAPIAuthentication yes
# Forward (delegate) credentials to the server.
GSSAPIDelegateCredentials yes
重要
GSSAPI 仅在 Windows Server 2022、Windows 11 和 Windows 10 xxxx 中可用。
HostKey
默认值为:
#HostKey __PROGRAMDATA__/ssh/ssh_host_rsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_dsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_ecdsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_ed25519_key
如果默认值不存在,sshd 会在服务启动时自动生成它们。
匹配
使用一个或多个条件匹配条件。 匹配后,将应用后续配置参数。 匹配使用 AllowGroups、AllowUsers、DenyGroups、DenyUsers 节中所述的模式规则。 用户和组名称应采用小写形式。
PermitRootLogin
在 Windows 中不适用。 若要防止管理员登录,请使用 Administrators 和 DenyGroups 指令。
SyslogFacility
如果需要基于文件的日志记录,请使用 LOCAL0。 日志在 %programdata%\ssh\logs 下生成。 对于任何其他值(包括默认值),AUTH 会将日志记录定向到 ETW。 有关详细信息,请参阅 Windows 中的日志记录设施。
配置参数
从 Windows Server 2022、Windows 11 和 Windows 10 xxxx 开始,可以使用以下配置参数:
- GSSAPI认证
以下配置参数在 Windows Server 和 Windows 客户端随附的 OpenSSH 版本中不可用:
- AcceptEnv
- AllowStreamLocalForwarding
- AuthorizedKeysCommand
- AuthorizedKeysCommandUser
- AuthorizedPrincipalsCommand
- AuthorizedPrincipalsCommandUser
- ExposeAuthInfo
- GSSAPICleanupCredentials
- GSSAPIStrictAcceptorCheck
- HostbasedAcceptedKeyTypes
- 基于主机的身份验证
- HostbasedUsesNameFromPacketOnly
- IgnoreRhosts
- IgnoreUserKnownHosts
- KbdInteractiveAuthentication
- KerberosAuthentication
- KerberosGetAFSToken
- Kerberos或本地密码
- KerberosTicketCleanup
- PermitTunnel
- PermitUserEnvironment
- PermitUserRC
- PidFile
- PrintLastLog
- PrintMotd
- RDomain
- StreamLocalBindMask
- StreamLocalBindUnlink
- StrictModes
- X11DisplayOffset
- X11Forwarding
- X11UseLocalhost
- XAuthLocation