欢迎光临
我们一直在努力

Linux 小白吃透 OpenSSH 远程免密登录 + 故障排查全实操

Linux 小白吃透 OpenSSH 远程免密登录 + 故障排查全实操

前言

很多刚接触 Linux 的小白一上来就踩两大坑:

  • 用 telnet 远程登录,密码裸奔明文传输,服务器分分钟被抓包盗号;
  • 服务启动失败两眼一抹黑,不知道去哪看日志、怎么定位报错。
  • 今天这篇笔记一次性解决两大核心知识点:OpenSSH 安全远程管理 + Linux 两套日志系统 rsyslog/journald,全程带完整实验步骤、每行命令注释、参数拆解、4 类高频故障完整排错思路,虚拟机跟着敲就能复现,零基础也能看懂!

    📌 前置环境说明 准备两台 CentOS/RHEL 虚拟机:

    • client 客户端:jhl 操作主机,用来远程连接服务器
    • server 服务端:开启 sshd、rsyslog、systemd-journald 服务 全文所有命令提示符统一替换为 [jhl@client ~]$ / [root@server ~]#

    目录

  • OpenSSH 是什么?为什么淘汰 telnet?
  • SSH 五层连接流程 + 两种加密原理(表格图解)
  • ssh 客户端三种登录方式实操(命令逐行注释)
  • 自定义客户端 ssh 配置文件,简化登录
  • SSH 密钥免密登录完整实验(无交互一键生成密钥)
  • SSH 登录失败权限故障深度排错
  • SSH 服务安全加固 4 大生产方案(禁 root 密码 / 禁密码登录等)
  • Linux 日志体系:rsyslog 文本日志详解
  • rsyslog 自定义日志实战
  • systemd-journald 二进制日志持久化 + 查询命令大全
  • 3 个真实服务报错日志排错完整案例
  • 学习总结 + 面试高频考点

  • 一、OpenSSH 基础介绍

    1.1 SSH 是什么?

    SSH 全称 Secure Shell,属于应用层安全协议,专门用来替代老旧不安全的远程工具:telnet、rsh、rlogin、ftp、rcp。

    ❌ 传统工具致命缺点(文本框警示)

    ⚠️ 高危提醒框 telnet、ftp 等工具所有数据(账号、密码、操作指令)明文传输,局域网抓包工具直接就能看到你的 root 密码,线上服务器绝对禁止使用!

    ✅ OpenSSH 优势

    OpenSSH 分为两部分:

  • 客户端 ssh:本地连接远程机器
  • 服务端 sshd:服务器监听 22 端口,处理远程连接 全程采用加密传输,拦截抓包也无法解析数据,是 Linux 远程运维标准工具。
  • 1.2 SSH 建立连接 5 大阶段(清晰表格)

    表格

    阶段核心作用小白通俗解释
    1. 协议版本协商 区分 SSH1/SSH2,默认使用 SSH2 两端先统一用哪个版本协议,SSH1 存在安全漏洞,现在全部弃用
    2. 密钥 & 加密算法协商 协商加密、解密、哈希算法 双方商量一套共同的加密规则,保证数据不乱码
    3. 双向身份认证 校验客户端、服务器身份 确认对方不是伪装的钓鱼服务器,防止中间人攻击
    4. 会话请求申请 申请终端、端口转发、X11 等功能 告诉服务器我要交互式 shell、传文件还是端口映射
    5. 交互会话传输 正常执行命令、传输文件 加密通道建立完成,所有操作加密收发

    1.3 两种加密类型对比表

    表格

    加密类型密钥特点作用优缺点
    对称加密 单一把密钥,加密解密共用 传输业务数据,速度快 速度极高;密钥分发不安全,不适合初次握手
    非对称加密 一对密钥:公钥 + 私钥 身份校验、加密对称密钥 安全性极强;运算慢,不适合大量数据传输

    关键知识点文本框

    💡 核心逻辑:SSH 不是全程只用非对称加密!

  • 先用非对称加密交换对称加密密钥
  • 后续所有操作使用对称加密传输,兼顾安全和速度
    • 公钥:对外公开,只用来加密数据
    • 私钥:本地保密,只能自己持有,用来解密公钥加密的数据

    1.4 SSH 双向加密完整流程

  • 服务器提前在 /etc/ssh/ 生成主机密钥对(ssh_host_ecdsa_key 私钥、ssh_host_ecdsa_key.pub 公钥)
  • 客户端发起连接,服务器把自己的公钥发给客户端
  • 客户端保存服务器公钥到 ~/.ssh/known_hosts,下次连接自动比对,防止服务器被篡改
  • 客户端生成自身密钥对,用服务器公钥加密自己的公钥,发给服务端
  • 两端互相持有对方公钥 + 自身私钥,形成双向加密通道
    • 客户端发数据:服务器公钥加密 → 服务器私钥解密
    • 服务器回数据:客户端公钥加密 → 客户端私钥解密
  • 初次连接提示代码(带逐行注释)

    [jhl@client ~]$ ssh server
    # 提示:无法确认主机server的身份
    The authenticity of host 'server (10.1.8.10)' can't be established.
    # ECDSA密钥指纹,用来校验服务器公钥是否被篡改
    ECDSA key fingerprint is SHA256:KTP3/4VydNwCIpOUzpd0C5IhvjfirH+y1U8IHIt8ZdM.
    # MD5格式指纹,另一种校验方式
    ECDSA key fingerprint is MD5:33:24:9b:48:f7:d2:c5:73:3e:40:d0:38:0e:a7:da:7c.
    # 询问是否信任该服务器公钥,输入yes保存到known_hosts
    Are you sure you want to continue connecting (yes/no)? yes


    二、ssh 访问远端 CLI = 远程连上服务器的命令行窗口

    方式 1:仅填写 IP / 主机名登录

    # 通过IP地址连接远程服务器10.1.8.10
    [jhl@client ~]$ ssh 10.1.8.10
    # 首次连接弹出主机指纹校验,输入yes
    Are you sure you want to continue connecting (yes/no)? yes
    # 输入服务器jhl用户密码
    jhl@10.1.8.10's password: redhat
    # 登录成功,切换到服务器终端
    [jhl@server ~]$

    # 通过主机名server连接(提前配置hosts解析)
    [jhl@client ~]$ ssh server

    方式 2:指定登录用户名(两种写法等效)

    # 写法1:用户名@主机/IP,最常用
    [jhl@client ~]$ ssh root@server

    # 写法2:-l 参数指定登录用户
    [jhl@client ~]$ ssh -l root server

    方式 3:登录同时执行远程命令,执行完立刻返回本机

    # 登录jhl用户,执行hostname查看服务器主机名,执行完毕不进入远程终端
    [jhl@client ~]$ ssh jhl@server hostname
    jhl@server's password: redhat
    server.laoma.cloud
    # 执行完成,提示符依旧是本地client,没有留在服务器
    [jhl@client ~]$
    客户端告诉服务器:我只需要执行一条命令 hostname,不需要交互式终端
    ssh 检测到命令行末尾附带了参数 hostname,会主动向 sshd 服务发送指令:
    # 多条命令用单引号包裹,分号分隔
    [jhl@client ~]$ ssh root@server '
    hostname;id'
    root@server'
    s password: redhat
    server.laoma.cloud
    uid=0(root) gid=0(root)=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

    三、客户端 ssh 配置文件简化登录

    简化操作:通过 config 配置永久预设用户名、关闭主机密钥弹窗,缩短 ssh 登录命令,提升操作效率

    3.1 两个配置文件优先级

    表格

    配置文件路径生效范围权限要求优先级
    ~/.ssh/config 当前登录用户 jhl 专属 必须 600,权限过大会报错 高(优先读取)
    /etc/ssh/ssh_config 系统所有用户全局配置 644 即可

    3.2 完整配置实验(每行注释)

    # 1. 创建用户ssh目录,权限700仅自己可读写,防止其他用户读取密钥
    [jhl@client ~]$ mkdir -m 700 .ssh

    # 2. 编辑用户专属ssh配置文件
    [jhl@client ~]$ vim ~/.ssh/config
    # 文件内写入以下内容
    # Host * 匹配所有远程服务器
    Host *
    # StrictHostKeyChecking no 关闭主机密钥校验,不再弹出yes确认
    StrictHostKeyChecking no
    # 默认登录用户root
    User root
    # 优先使用密码认证登录
    PreferredAuthentications password

    # 3. 修改配置文件权限为600,仅文件所有者读写,否则ssh报错
    [jhl@client ~]$ chmod 600 .ssh/config

    # 4. 清空历史服务器公钥,测试效果
    [jhl@client ~]$ > .ssh/known_hosts

    # 5. 直接ssh server,无需输入用户名,不弹出主机校验提示
    [jhl@client ~]$ ssh server
    Warning: Permanently added 'server,10.1.8.10' (ECDSA) to the list of known hosts.
    root@server's password:

    权限报错故障演示 + 排错思路

    ❌ 故障现象文本框 配置文件权限过大时登录报错:Bad owner or permissions on /home/jhl/.ssh/config 🧠 排错思路:

  • ssh 安全机制不允许其他用户读写 config,防止恶意篡改登录配置
  • 解决方案:执行 chmod 600 .ssh/config 收紧文件权限
  • # 模拟报错:权限未修改直接登录
    [jhl@client ~]$ ssh server
    Bad owner or permissions on /home/jhl/.ssh/config

    # 修复命令
    [jhl@client ~]$ chmod 600 .ssh/config

    # 修复后正常登录
    [jhl@client ~]$ ssh server
    root@server's password:


    四、SSH 密钥免密登录完整实验(告别密码)

    4.1 交互式生成密钥对(分步注释)

    # 客户端生成rsa公私钥对
    [jhl@client ~]$ ssh-keygen
    Generating public/private rsa key pair.
    # 私钥存储路径,直接回车使用默认路径/home/jhl/.ssh/id_rsa
    Enter file in which to save the key (/home/jhl/.ssh/id_rsa): 回车
    # 私钥加密密码,回车代表不设置密码,免密登录更方便
    Enter passphrase (empty for no passphrase): 回车
    # 重复确认密码,再次回车
    Enter same passphrase again: 回车

    # 生成完成,查看.ssh目录文件
    [jhl@client ~]$ ls .ssh/
    config id_rsa id_rsa.pub known_hosts
    # id_rsa:私钥(严禁泄露);id_rsa.pub:公钥(可分发到服务器)

    # ssh-copy-id 推送本地公钥到服务器jhl用户
    [jhl@client ~]$ ssh-copy-id jhl@server

    # 验证免密登录,无需输入密码直接执行命令
    [jhl@client ~]$ ssh jhl@server hostname
    server.jhl.cloud

    # 推送公钥相当于:
    # 将公钥内容保存到目标服务器上目标用户家目录下.ssh/authorized_keys中
    [jhl@client ~]$ cat .ssh/id_rsa.pub
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDtFoo/sD+pB1uBw9XMuXLcO//RgghgHeYjdibXMCtw5UUf/H5lYcP4ZjCbQTdmH7n0ZkxYriIU+Q6atY0Jel3+sWzCD3K9DSU8g5Ux2wjCrVhFJGTtsMXeI+XqQW0MqY2Gn9KtC098JKlzikUz+SbDe61vyqCYHVeBNmWtTtZORhywHlN4HxLIGOlGvnPrXI8+uhdgBqV6Sxo0XkpOvB2y+0Kjxb0SQUCYpdkT/cJqUz2Bm/diPEDmHPvlVn3/chD7Uvt++wQhGCFEPGBawQIsb7sT73UpIQ20vaxjs8okQ1XZNzHW1KnLBhYskrtWU7HIHHTWObpw5mwoXj64wcPX jhl@client.laoma.cloud

    # 在server端查看
    [jhl@server ~]$ cat .ssh/authorized_keys
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDtFoo/sD+pB1uBw9XMuXLcO//RgghgHeYjdibXMCtw5UUf/H5lYcP4ZjCbQTdmH7n0ZkxYriIU+Q6atY0Jel3+sWzCD3K9DSU8g5Ux2wjCrVhFJGTtsMXeI+XqQW0MqY2Gn9KtC098JKlzikUz+SbDe61vyqCYHVeBNmWtTtZORhywHlN4HxLIGOlGvnPrXI8+uhdgBqV6Sxo0XkpOvB2y+0Kjxb0SQUCYpdkT/cJqUz2Bm/diPEDmHPvlVn3/chD7Uvt++wQhGCFEPGBawQIsb7sT73UpIQ20vaxjs8okQ1XZNzHW1KnLBhYskrtWU7HIHHTWObpw5mwoXj64wcPX jhl@client.laoma.cloud

    # 推给目标主机root用户
    [root@server ~]# mkdir -m 700 .ssh
    [root@server ~]# cp ~jhl/.ssh/authorized_keys .ssh

    # 客户端验证
    [laoma@client ~]$ ssh root@server hostname
    server.jhl.cloud

    在这里插入图片描述

    实验过程中遇到的问题:要想使用密钥认证免密登录成功,配置文件.ssh/config中的内容必须与上图保持一致。

    原理说明文本框

    💡 ssh-copy-id 做了什么? 自动把本地 id_rsa.pub 公钥内容,追加到服务器对应用户家目录 .ssh/authorized_keys 文件,sshd 服务读取该文件匹配客户端公钥,匹配成功免密登录。

    4.2 无交互一键生成密钥(脚本常用)

    # -t rsa 指定加密算法;-N '' 私钥无密码;-f 指定密钥文件名
    [jhl@client ~]$ ssh-keygen -t rsa -N '' -f id_rsa_new

    # 查看生成的新密钥文件
    [jhl@client ~]$ ls *new*
    id_rsa_new id_rsa_new.pub

    4.3 ssh 常用参数补充

    # -i 指定自定义私钥文件位置登录
    [jhl@client ~]$ mv .ssh/id_rsa /tmp
    [jhl@client ~]$ ssh -i /tmp/id_rsa root@server hostname
    server.laoma.cloud

    # -p 指定sshd自定义端口(默认22,修改端口后必须加-p)
    [jhl@client ~]$ ssh -l root -p 1022 server hostname

    五、密钥免密登录仍提示输密码?完整故障排错

    故障现象

    配置完 ssh-copy-id 免密登录,连接服务器依旧要求输入密码

    [jhl@client ~]$ ssh root@10.1.8.10 hostname
    root@10.1.8.10's password:

    故障复现

    修改服务器 root 家目录权限为 777(所有人可读可写)

    [root@server ~]# chmod 777 /root

    🧠 完整排错思路(分三步)

  • 查看安全日志定位报错 sshd 登录认证日志存放在 /var/log/secure,实时监控日志
  • # 服务器实时监控登录日志
    [root@server ~]# tail -f /var/log/secure
    # 报错关键字:Authentication refused: bad ownership or modes for directory /root
    # 翻译:/root目录权限过宽,存在安全风险,sshd拒绝密钥认证

  • 检查目录权限
  • # 查看root家目录详细权限
    [root@server ~]# ls -ld /root
    drwxrwxrwx. 3 root root 4096 Jul 31 16:09 /root
    # 777权限任何人可修改,ssh安全策略拦截密钥登录

  • 修复权限,验证登录
  • # 修改家目录权限为550,仅root读写执行
    [root@server ~]# chmod 550 /root
    # 客户端重新免密登录,无需密码
    [jhl@client ~]$ ssh root@server hostname
    server.jhl.cloud

    ⚠️ 拓展知识点 ssh 对以下目录 / 文件权限有严格校验,权限过宽都会导致密钥失效: 用户家目录、~/.ssh 文件夹、authorized_keys、私钥 id_rsa


    六、SSHD 服务四大安全加固方案(生产必用)

    sshd 服务配置文件:/etc/ssh/sshd_config 修改后重载服务生效:systemctl reload sshd

    📌 区分:客户端 config 修改立即生效;服务端 sshd_config 必须重载 / 重启

    加固参数对照表

    表格

    配置参数作用生产场景推荐值
    PermitRootLogin yes 允许 root 任意方式登录 prohibit-password / no
    PermitRootLogin prohibit-password root 仅允许密钥登录,禁止密码登录 推荐
    PermitRootLogin no 完全禁止 root 远程登录 高安全服务器使用
    PasswordAuthentication no 关闭所有用户密码登录,仅密钥 线上生产强制开启
    AllowUsers jhl 仅允许指定用户远程登录 多用户服务器推荐
    UseDNS no 关闭 IP 反向解析,提升连接速度 全部服务器开启

    方案 1:禁止 root 密码登录(保留密钥登录)

    # 编辑sshd主配置
    [root@server ~]# vim /etc/ssh/sshd_config
    # 注释原有yes配置
    #PermitRootLogin yes
    # 添加新配置
    # 在客户端使用man sshd命令
    PermitRootLogin prohibit-password

    # 重载sshd服务生效
    [root@server ~]# systemctl reload sshd

    # 测试结果
    # 即使使用正确的密码,也无法远程登录
    [laoma@client ~]$ ssh root@server
    root@server's password:
    Permission denied, please try again.
    root@server'
    s password:
    Permission denied, please try again.
    root@server's password:
    Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

    # 使用密钥登录
    # 思路:在客户端生成密钥,将密钥复制进服务器端的.ssh/authorized_keys文件中,再在客户端进行登录验证
    # [jhl@client ~ 23:03:55]$ ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/jianghuilin/.ssh/id_rsa):
    /home/jianghuilin/.ssh/id_rsa already exists.
    Overwrite (y/n)? y
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/jianghuilin/.ssh/id_rsa.
    Your public key has been saved in /home/jianghuilin/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:ejlszoFy02GtxH1KTjGdXGibecHgzIJIb9I7T1hRW+Q jianghuilin@client.jiang.cloud
    The key's randomart image is:
    +—[RSA 2048]—-+
    | . ..o=+ |
    | . + . Bo*o |
    | o = =.O+E. |
    | + * ++ . |
    | S * .. |
    | B @ o |
    | . = X + |
    | o * o |
    | o |
    +—-[SHA256]—–+

    # 查看生成的公钥
    [jhl@client ~ 23:05:51]$ cat .ssh/id_rsa.pub
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGsBSgK1pIpZTqFaDi/8RIclunNri4QtlibFkHVJJwzLK0E9GEmGNm3j+yJcmW8uoXsHFGx7OzMIKOZ7qRVBxDojNCadHoZVPwXzBsrxNkyPzjoYcQQKqd5KuSRZ1NY8G/nAcrYX7CB1/NKKMTNqIdcoaK+4C2yzYUAsNIidjVacZkjC0StRcX9NVSQ/mNS06v007KVU0vEuI0vmjcwgcSimv9hJ7gEDkDsg1aLS7fArLaiVpIOCA5zBi/2cJZifyVlSknx0F8ZcBl2dBR3Xk+s6JchT9mXdivt/VPFkQd78VRAIjxN/DtQ4bNVreedi1s/akSmI0tV5E1uMm1Jo4p jianghuilin@client.jiang.cloud

    # 先在服务器段查看是否有/root/.ssh文件,若无就创建
    [root@sever ~ 23:07:23]# ls /root/.ssh

    # 密钥复制粘贴到.ssh/authorized_key中,按i进行粘贴,否则内容会缺失
    [root@sever ~ 23:07:23]# mkdir -m 700 /root/.ssh
    [root@sever ~ 23:07:55]# vim .ssh/authorized_keys

    # 登录验证
    [jhl@client ~ 23:12:56]$ ssh root@server hostname
    sever.jiang.cloud

    测试效果

    • 使用密码登录 root:直接拒绝,反复提示密码错误
    • 使用密钥登录 root:正常连接

    方案 2:完全禁止 root 远程登录(密钥 / 密码都不行)

    [root@server ~]# vim /etc/ssh/sshd_config
    PermitRootLogin no
    [root@server ~]# systemctl reload sshd

    测试效果

    [jhl@client ~ 22:58:11]$ ssh root@server hostname
    root@server's password:
    Permission denied, please try again.
    root@server'
    s password:

    任何方式都无法直接 ssh root,只能普通用户登录后 su 切换 root

    方案 3:全局关闭密码登录,仅密钥认证

    [root@server ~]# vim /etc/ssh/sshd_config
    #PasswordAuthentication yes
    PasswordAuthentication no
    [root@server ~]# systemctl reload sshd

    测试效果

    未上传公钥的用户直接拒绝连接,只有配置密钥的用户可登录

    方案 4:仅允许指定用户登录,其他用户全部拦截

    # 服务器创建测试用户laowang
    [root@server ~]# useradd laowang
    [root@server ~]# echo 123 | passwd –stdin laowang
    # 复制公钥给laowang模拟免密
    [root@server ~]# mkdir -m 700 /home/laowang/.ssh/
    [root@server ~]# cp .ssh/authorized_keys /home/laowang/.ssh/
    [root@server ~]# chown -R laowang:laowang /home/laowang/.ssh/

    # 配置sshd仅允许jhl登录
    [root@server ~]# vim /etc/ssh/sshd_config
    AllowUsers jhl
    [root@server ~]# systemctl reload sshd

    测试效果

    # laowang用户无论密码/密钥都拒绝
    [laowang@client ~]$ ssh laowang@server hostname
    Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
    # jhl用户正常免密登录
    [laowang@client ~]$ ssh jhl@server hostname
    server.jhl.cloud

    七、全文总结

  • SSH 依靠对称 + 非对称双重加密解决远程明文传输风险,线上服务器必须关闭密码登录,使用密钥免密;
  • ssh 客户端配置简化登录,核心注意文件权限 600,权限超标直接登录失败;
  • ssh 免密登录失败 90% 原因是目录 / 密钥文件权限过宽,优先查看 /var/log/secure 定位;
  • sshd 服务四大加固:禁 root 密码、禁 root 登录、全局关密码、限制登录用户;
  • 服务启动失败统一排错流程:监控日志 → 提取报错关键字 → 修改配置 / 恢复文件 → 重启验证。
  • 赞(0)
    未经允许不得转载:171主机测评 » Linux 小白吃透 OpenSSH 远程免密登录 + 故障排查全实操
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址