普通网友 2025-12-16 08:35 采纳率: 98.6%
浏览 14
已采纳

SSH登录Windows时提示“Permission denied”如何解决?

问题:在使用SSH登录Windows服务器时,客户端提示“Permission denied (publickey)”,即使已配置好密钥认证。常见原因包括OpenSSH服务未正确启动、用户权限配置不当、authorized_keys文件路径或权限设置错误(如文件夹权限过宽导致SSH拒绝读取)、或Windows防火墙阻止了SSH连接。此外,若使用非管理员账户且未在组策略中赋予“从网络访问此计算机”权限,也会导致认证失败。如何排查并解决此类权限拒绝问题?
  • 写回答

1条回答 默认 最新

  • 关注

    一、问题现象与初步排查

    当使用SSH客户端(如OpenSSH、PuTTY)尝试通过公钥认证登录Windows服务器时,出现“Permission denied (publickey)”错误,即使已确认私钥正确且authorized_keys文件已部署。此类问题在企业级远程管理中频繁发生,尤其在混合环境或权限策略严格的系统中。

    首先应确认以下基础要素:

    1. OpenSSH Server服务是否已安装并正在运行;
    2. 目标用户账户是否存在且处于启用状态;
    3. 客户端使用的私钥是否与服务器上authorized_keys中的公钥匹配;
    4. 网络连通性是否正常,端口22是否开放。

    可通过以下命令检查服务状态:

    Get-Service -Name sshd

    若服务未运行,执行启动操作:

    Start-Service sshd

    二、OpenSSH服务配置深度分析

    Windows平台的OpenSSH服务依赖于sshd_config配置文件进行行为控制,默认路径为:

    C:\ProgramData\ssh\sshd_config

    需重点检查如下配置项:

    配置项推荐值说明
    PubkeyAuthenticationyes启用公钥认证
    AuthorizedKeysFile.ssh/authorized_keys指定公钥文件路径
    PasswordAuthenticationno禁用密码登录以增强安全
    Subsystemsftp sftp-server.exeSFTP子系统路径

    修改后需重启服务生效:

    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

    四、组策略与本地安全策略影响分析

    非管理员账户在默认情况下可能不具备从网络访问计算机的权限,这由本地安全策略控制。需确保目标用户被包含在“从网络访问此计算机”权限列表中。

    操作步骤如下:

    1. 打开“本地组策略编辑器”(gpedit.msc);
    2. 导航至:计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 用户权利分配
    3. 查找“从网络访问此计算机”策略;
    4. 添加目标用户或所属组(如Users、Domain Users);
    5. 执行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[解决问题]
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月17日
  • 创建了问题 12月16日