Linux 小白吃透 OpenSSH 远程免密登录 + 故障排查全实操
前言
很多刚接触 Linux 的小白一上来就踩两大坑:
今天这篇笔记一次性解决两大核心知识点:OpenSSH 安全远程管理 + Linux 两套日志系统 rsyslog/journald,全程带完整实验步骤、每行命令注释、参数拆解、4 类高频故障完整排错思路,虚拟机跟着敲就能复现,零基础也能看懂!
📌 前置环境说明 准备两台 CentOS/RHEL 虚拟机:
- client 客户端:jhl 操作主机,用来远程连接服务器
- server 服务端:开启 sshd、rsyslog、systemd-journald 服务 全文所有命令提示符统一替换为 [jhl@client ~]$ / [root@server ~]#
目录
一、OpenSSH 基础介绍
1.1 SSH 是什么?
SSH 全称 Secure Shell,属于应用层安全协议,专门用来替代老旧不安全的远程工具:telnet、rsh、rlogin、ftp、rcp。
❌ 传统工具致命缺点(文本框警示)
⚠️ 高危提醒框 telnet、ftp 等工具所有数据(账号、密码、操作指令)明文传输,局域网抓包工具直接就能看到你的 root 密码,线上服务器绝对禁止使用!
✅ OpenSSH 优势
OpenSSH 分为两部分:
1.2 SSH 建立连接 5 大阶段(清晰表格)
表格
| 1. 协议版本协商 | 区分 SSH1/SSH2,默认使用 SSH2 | 两端先统一用哪个版本协议,SSH1 存在安全漏洞,现在全部弃用 |
| 2. 密钥 & 加密算法协商 | 协商加密、解密、哈希算法 | 双方商量一套共同的加密规则,保证数据不乱码 |
| 3. 双向身份认证 | 校验客户端、服务器身份 | 确认对方不是伪装的钓鱼服务器,防止中间人攻击 |
| 4. 会话请求申请 | 申请终端、端口转发、X11 等功能 | 告诉服务器我要交互式 shell、传文件还是端口映射 |
| 5. 交互会话传输 | 正常执行命令、传输文件 | 加密通道建立完成,所有操作加密收发 |
1.3 两种加密类型对比表
表格
| 对称加密 | 单一把密钥,加密解密共用 | 传输业务数据,速度快 | 速度极高;密钥分发不安全,不适合初次握手 |
| 非对称加密 | 一对密钥:公钥 + 私钥 | 身份校验、加密对称密钥 | 安全性极强;运算慢,不适合大量数据传输 |
关键知识点文本框
💡 核心逻辑:SSH 不是全程只用非对称加密!
- 公钥:对外公开,只用来加密数据
- 私钥:本地保密,只能自己持有,用来解密公钥加密的数据
1.4 SSH 双向加密完整流程
- 客户端发数据:服务器公钥加密 → 服务器私钥解密
- 服务器回数据:客户端公钥加密 → 客户端私钥解密
初次连接提示代码(带逐行注释)
[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 🧠 排错思路:
# 模拟报错:权限未修改直接登录
[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
🧠 完整排错思路(分三步)
# 服务器实时监控登录日志
[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


