圆山中庸 2025-12-27 03:40 采纳率: 98.5%
浏览 6
已采纳

SSH远程登录时出现“Permission denied (publickey)”错误

SSH远程登录时出现“Permission denied (publickey)”错误,常见原因之一是服务器端未正确配置公钥认证。用户虽已生成SSH密钥对并将公钥(如id_rsa.pub)内容添加到目标服务器的`~/.ssh/authorized_keys`文件中,但常因文件或目录权限设置不当导致认证失败。例如,`~/.ssh`目录权限应为700,`authorized_keys`文件权限应为600。此外,服务器sshd配置文件中`PubkeyAuthentication yes`未启用、SELinux策略限制或用户主目录拥有者异常也会阻止公钥认证生效。需逐一排查。
  • 写回答

1条回答 默认 最新

  • 关注

    1. 问题背景与现象描述

    在IT运维和系统管理中,SSH(Secure Shell)是远程访问Linux/Unix服务器的标准协议。当用户尝试通过公钥认证方式登录时,常遇到“Permission denied (publickey)”错误。尽管本地已生成密钥对,并将公钥正确复制至目标服务器的~/.ssh/authorized_keys文件中,但认证仍失败。

    该问题通常并非源于密钥本身错误,而是服务器端配置、权限控制或安全策略未满足SSH守护进程(sshd)的严格要求所致。随着DevOps自动化、云原生架构普及,此类问题在CI/CD流水线、容器编排及跳板机部署场景中愈发频繁。

    2. 常见原因分类分析

    • 文件与目录权限不当:OpenSSH出于安全考虑,强制要求特定权限设置。
    • sshd服务配置缺失:关键选项如PubkeyAuthentication yes未启用。
    • SELinux或AppArmor干扰:强制访问控制机制可能阻止sshd读取密钥文件。
    • 用户主目录所有权异常:若家目录被其他用户拥有,sshd会拒绝信任其内容。
    • SSH客户端调试信息不足:未开启详细日志导致排查困难。

    3. 权限配置标准规范

    路径推荐权限说明
    ~/.ssh700 (drwx------)仅用户可读写执行
    ~/.ssh/authorized_keys600 (-rw-------)禁止组和其他人访问
    ~/.ssh/id_rsa600私钥必须受保护
    ~/.ssh/id_rsa.pub644公钥可公开读取
    用户主目录 (~)755 或 750不可被其他用户写入

    4. 配置修复命令示例

    # 确保.ssh目录权限正确
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    
    # 修复主目录权限(避免“Too open”警告)
    chmod 755 /home/username
    
    # 确保文件归属正确
    chown -R username:username /home/username/.ssh
        

    5. SSHD服务端配置检查

    编辑/etc/ssh/sshd_config文件,确认以下关键参数:

    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
    PasswordAuthentication no # 可选,增强安全性
    PermitRootLogin prohibit-password # 若允许root登录

    修改后需重启服务:

    systemctl restart sshd

    6. SELinux影响排查流程

    在CentOS/RHEL等启用SELinux的系统中,即使权限正确也可能因上下文标签错误导致失败。

    1. 检查当前模式:sestatus
    2. 临时禁用测试:setenforce 0
    3. 若问题消失,则需修复文件上下文:
    4. restorecon -R ~/.ssh
    5. 或手动设置:chcon -t ssh_home_t ~/.ssh/authorized_keys

    7. 完整诊断流程图(Mermaid)

    graph TD
        A[SSH登录失败: Permission denied (publickey)] --> B{本地私钥存在?}
        B -->|否| C[生成新密钥对]
        B -->|是| D[公钥已添加到authorized_keys?]
        D -->|否| E[使用ssh-copy-id或手动追加]
        D -->|是| F[检查~/.ssh目录权限=700?]
        F -->|否| G[chmod 700 ~/.ssh]
        F -->|是| H[检查authorized_keys文件权限=600?]
        H -->|否| I[chmod 600 ~/.ssh/authorized_keys]
        H -->|是| J[检查sshd_config中PubkeyAuthentication=yes]
        J -->|否| K[启用并重启sshd]
        J -->|是| L[检查SELinux状态]
        L -->|Enforcing| M[执行restorecon -R ~/.ssh]
        L -->|Permissive| N[检查主目录归属]
        N --> O[成功登录]
        

    8. 高级调试技巧

    使用SSH客户端详细输出定位问题:

    ssh -v -i ~/.ssh/id_rsa user@host

    增加-v级别可至-vvv,观察是否出现:

    • "Offering public key: ..." → 客户端发送公钥
    • "Server accepts key" → 服务端认可
    • "Authentication succeeded" → 成功跳转

    同时查看服务端日志:

    tail -f /var/log/secure   # RHEL/CentOS
    tail -f /var/log/auth.log  # Debian/Ubuntu

    9. 自动化检测脚本建议

    为提升运维效率,可编写Shell脚本自动校验常见项:

    #!/bin/bash
    USER=$1
    HOME_DIR=$(eval echo ~$USER)
    SSH_DIR=$HOME_DIR/.ssh
    
    if [ ! -d "$SSH_DIR" ]; then
        echo "[-] .ssh目录不存在"
    else
        stat -c "%a %n" $SSH_DIR | grep "^700" || echo "[!] .ssh权限不正确"
        stat -c "%a %n" $SSH_DIR/authorized_keys 2>/dev/null | grep "^600" || echo "[!] authorized_keys权限不正确"
    fi
    
    grep -q "PubkeyAuthentication yes" /etc/ssh/sshd_config || echo "[!] PubkeyAuthentication未启用"
        
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月28日
  • 创建了问题 12月27日