SSH登录Windows时提示“Permission denied”如何解决?
问题:在使用SSH登录Windows服务器时,客户端提示“Permission denied (publickey)”,即使已配置好密钥认证。常见原因包括OpenSSH服务未正确启动、用户权限配置不当、authorized_keys文件路径或权限设置错误(如文件夹权限过宽导致SSH拒绝读取)、或Windows防火墙阻止了SSH连接。此外,若使用非管理员账户且未在组策略中赋予“从网络访问此计算机”权限,也会导致认证失败。如何排查并解决此类权限拒绝问题?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
我有特别的生活方法 2025-12-16 08:36关注一、问题现象与初步排查
当使用SSH客户端(如OpenSSH、PuTTY)尝试通过公钥认证登录Windows服务器时,出现“Permission denied (publickey)”错误,即使已确认私钥正确且
authorized_keys文件已部署。此类问题在企业级远程管理中频繁发生,尤其在混合环境或权限策略严格的系统中。首先应确认以下基础要素:
- OpenSSH Server服务是否已安装并正在运行;
- 目标用户账户是否存在且处于启用状态;
- 客户端使用的私钥是否与服务器上
authorized_keys中的公钥匹配; - 网络连通性是否正常,端口22是否开放。
可通过以下命令检查服务状态:
Get-Service -Name sshd若服务未运行,执行启动操作:
Start-Service sshd二、OpenSSH服务配置深度分析
Windows平台的OpenSSH服务依赖于
sshd_config配置文件进行行为控制,默认路径为:C:\ProgramData\ssh\sshd_config需重点检查如下配置项:
配置项 推荐值 说明 PubkeyAuthentication yes 启用公钥认证 AuthorizedKeysFile .ssh/authorized_keys 指定公钥文件路径 PasswordAuthentication no 禁用密码登录以增强安全 Subsystem sftp sftp-server.exe SFTP子系统路径 修改后需重启服务生效:
Restart-Service sshd三、用户权限与文件系统安全模型(NTFS ACL)校验
Windows SSH服务对密钥文件的访问权限极为敏感。若目录或文件权限设置不当,即使内容正确也会拒绝读取。以下是标准权限要求:
C:\Users\{username}\.ssh目录:仅所有者具有完全控制权,无继承权限;authorized_keys文件:权限应限制为所有者可读写,其他用户无访问权限;- 禁止任何组(如Everyone、Users)拥有写权限。
使用PowerShell设置正确ACL示例:
$acl = Get-Acl "C:\Users\alice\.ssh\authorized_keys" $acl.SetAccessRuleProtection($true, $false) $acl.Access | Where-Object { $_.IdentityReference -ne "NT AUTHORITY\SYSTEM" } | ForEach-Object { $acl.RemoveAccessRule($_) } $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("alice", "ReadAndExecute", "Allow") $acl.AddAccessRule($rule) Set-Acl "C:\Users\alice\.ssh\authorized_keys" $acl四、组策略与本地安全策略影响分析
非管理员账户在默认情况下可能不具备从网络访问计算机的权限,这由本地安全策略控制。需确保目标用户被包含在“从网络访问此计算机”权限列表中。
操作步骤如下:
- 打开“本地组策略编辑器”(gpedit.msc);
- 导航至:计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 用户权利分配;
- 查找“从网络访问此计算机”策略;
- 添加目标用户或所属组(如Users、Domain Users);
- 执行
gpupdate /force刷新策略。
该策略常被忽视,但却是导致“publickey”认证失败的关键因素之一。
五、防火墙与网络层连接验证
Windows防火墙可能阻止SSH默认端口(22)的入站连接。可通过以下命令检查规则状态:
Get-NetFirewallRule -DisplayName "OpenSSH SSH Server"若不存在,需手动创建防火墙规则:
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH SSH Server' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22同时可在客户端使用telnet或Test-NetConnection测试端口可达性:
Test-NetConnection -ComputerName win-server -Port 22六、日志分析与故障定位流程图
Windows OpenSSH将日志输出至Windows事件日志(Event Log),通道为:
Microsoft-Windows-OpenSSH/Operational。常用筛选命令:
Get-WinEvent -LogName "Microsoft-Windows-OpenSSH/Operational" | Where-Object { $_.Id -eq 3 }事件ID 3表示认证失败,可查看具体原因(如密钥格式错误、文件权限拒绝等)。
结合上述排查逻辑,构建如下诊断流程图:
graph TD A[SSH连接失败: Permission denied (publickey)] --> B{sshd服务运行?} B -- 否 --> C[启动sshd服务] B -- 是 --> D{sshd_config配置正确?} D -- 否 --> E[修正PubkeyAuthentication等配置] D -- 是 --> F{authorized_keys路径与权限合规?} F -- 否 --> G[调整NTFS ACL权限] F -- 是 --> H{用户有"从网络访问"权限?} H -- 否 --> I[组策略添加用户] H -- 是 --> J{防火墙放行22端口?} J -- 否 --> K[添加防火墙规则] J -- 是 --> L[检查事件日志定位根源] L --> M[解决问题]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报