当前位置: 首页 > news >正文

Linux SSH 安全加固与批量管理:密钥认证 + 自动化脚本 + OpenSSH 升级

引言

在现代IT基础设施中,远程管理是日常运维的核心操作。SSH(Secure Shell) 作为最广泛使用的安全协议,已成为Linux/Unix系统远程访问的事实标准

本文将带你深入理解 OpenSSH 的工作机制,涵盖:

  • 服务端配置与安全优化
  • 客户端命令实战(ssh, scp, sftp
  • SSH密钥认证原理与自动化部署
  • 批量管理脚本编写
  • OpenSSH 安全升级方案(应对漏洞修复)

目标:构建一个高效、安全、可扩展的远程管理体系,为后续使用 Ansible 等自动化工具打下坚实基础。


一、SSHD 服务基础

1.1 什么是 SSH?

SSH(Secure Shell)是一种加密网络协议,用于在不安全的网络中实现安全的远程登录、命令执行和文件传输。它通过加密、身份验证和完整性保护机制,防止窃听、中间人攻击和连接劫持。

1.2 OpenSSH 简介

OpenSSH 是 SSH 协议的开源实现,包含以下组件:

组件作用
sshd服务端守护进程,监听默认端口 22
ssh客户端,用于远程登录和执行命令
scp基于SSH的安全文件复制工具
sftp安全文件传输协议客户端
配置文件/etc/ssh/sshd_config(服务端)
~/.ssh/config(客户端)

生产环境强烈推荐使用 OpenSSH,禁用 Telnet


二、Telnet vs OpenSSH:为何必须淘汰明文协议?

对比项OpenSSHTelnet
传输方式加密传输(AES等)明文传输(用户名、密码可见)
安全性高(支持密钥认证)极低(易被嗅探)
默认端口2223
使用场景日常远程管理仅应急恢复或调试

⚠️ 强烈建议:生产环境永久禁用 Telnet,仅在 OpenSSH 升级失败等极端情况下临时启用。

三、OpenSSH 服务端配置详解

主配置文件:/etc/ssh/sshd_config

3.1 性能优化(提升连接速度)

配置项推荐值说明
UseDNS nono关闭反向DNS解析,避免连接卡顿
GSSAPIAuthentication nono禁用GSSAPI认证,提升响应速度

3.2 安全加固(核心配置)

配置项推荐值说明
Port22222 或更高修改默认端口,减少暴力破解尝试
PermitRootLoginno禁止root直接远程登录(先创建普通用户+sudo)
PasswordAuthenticationno(密钥认证后)关闭密码登录,仅允许密钥登录
AllowUsersroot@192.168.130.*限制登录用户及来源IP
MaxAuthTries3最大认证尝试次数
ClientAliveInterval300保持连接活跃(秒)
LoginGraceTime60登录超时时间(秒)

3.3 自动化配置脚本(新系统初始化)

#!/bin/bash
# author: Freed
# desc: 初始化 SSH 安全配置# 备份原始配置
cp /etc/ssh/sshd_config{,.bak}# 注释已有相关配置
sed -ri.bak '/^(UseDNS|GSSAPIAuthentication|Port|PermitRootLogin|PasswordAuthentication)/s@^@#@g' /etc/ssh/sshd_config# 将以下配置追加写入 SSH 服务主配置文件
cat >> /etc/ssh/sshd_config << 'EOF'
UseDNS no
# ❌ 禁用反向DNS解析
# 默认情况下,SSH 登录时会尝试通过 DNS 反向解析客户端 IP 的主机名。
# 这可能导致连接延迟(尤其在无DNS记录时卡顿几秒)。
# 设置为 no 可显著提升登录响应速度,且不影响功能。GSSAPIAuthentication no
# ❌ 禁用 GSSAPI 认证机制
# GSSAPI(Generic Security Services API)用于 Kerberos 等企业级认证。
# 普通环境无需此功能,启用会增加握手时间。
# 关闭后可加快连接建立速度,减少不必要的认证尝试。Port 22
# 🔧 设置 SSH 监听端口
# 默认为 22,可修改为其他端口(如 22222)以减少自动化扫描和暴力破解攻击。
# 示例:Port 22222
# ⚠️ 修改后需同步更新防火墙规则,并使用新端口连接。PermitRootLogin no
# 禁止 root 用户直接远程登录
# 极大提升系统安全性,防止攻击者直接爆破 root 账户。
# 推荐做法:
#   1. 创建普通用户(如 admin)
#   2. 使用该用户登录
#   3. 通过 sudo 执行特权命令
# 如必须允许 root 登录,建议改为:PermitRootLogin prohibit-password(仅允许密钥登录)PasswordAuthentication yes
# 是否允许密码登录
# - yes:允许使用用户名+密码登录(便于初期配置)
# - no:禁止密码登录,仅允许密钥认证(更安全,推荐密钥部署完成后关闭)
# 建议流程:
#   先设为 yes → 配置密钥认证 → 测试成功 → 改为 no → 重启 sshdMaxAuthTries 3
# 最大认证尝试次数
# 客户端在单次连接中最多尝试 3 次密码或密钥认证。
# 超过后自动断开连接,防止暴力破解。
# 默认值通常为 6,降低为 3 更安全。ClientAliveInterval 300
# 客户端保活间隔(单位:秒)
# 服务器每隔 300 秒(5分钟)向客户端发送一个保持连接的请求。
# 防止因网络空闲导致连接被中间设备(如路由器、防火墙)断开。
# 若客户端无响应,服务器将继续重试(默认 ClientAliveCountMax=3),之后断开。LoginGraceTime 60
# 登录宽限期
# 用户从连接到完成认证的时间限制为 60 秒。
# 超时未登录成功则断开连接,防止占用资源进行慢速爆破。
# 默认值为 120 秒,缩短可提高安全性。
EOF# 重启服务生效
systemctl restart sshd
echo " SSH 安全配置已完成"

💡 提示:修改端口后需同步更新防火墙规则(firewalld/iptables)或云安全组。


四、OpenSSH 客户端命令实战

4.1 scp:安全复制文件

# 基本语法
scp [选项] 源路径 用户@主机:目标路径# 常用选项:
# -r: 递归复制目录
# -p: 保留权限、时间戳
# -P: 大写P,指定端口号
# -v: 显示详细过程# 示例1:复制目录到远程
scp -rp -P 22 /etc/hostname root@192.168.130.62:/tmp/# 示例2:从远程拉取文件
scp -P 22 root@192.168.130.62:/var/log/messages ./local.log

📌 小技巧-rp 谐音“人品”,便于记忆。


4.2 ssh:远程连接与命令执行

1)交互式登录
ssh -p 22 root@192.168.130.62
2)非交互式执行命令(脚本化运维)
# 执行单条命令
ssh -p 22 root@192.168.130.62 whoami# 执行多条命令(前一条成功才执行)
ssh -p22 192.168.130.62 "whoami && pwd && hostname -I"# 顺序执行(无论成功与否)
ssh -p22 192.168.130.62 "whoami ; pwd ; df -h"

区别

  • &&:逻辑与,前一条成功才执行下一条
  • ;:顺序执行,不判断结果

4.3 sftp:安全文件传输

  • 基于SSH协议,端口 22
  • 开发常用图形化工具有:Xftp、WinSCP、FileZilla
  • 支持断点续传、目录浏览
# 登录
sftp -oPort=22 root@192.168.130.62# 常用命令
sftp> put local.txt /remote/
sftp> get remote.txt ./
sftp> ls /remote/dir

大文件建议使用 scprsync,效率更高


五、SSH 密钥认证:实现免密登录与双机互信

5.1 为什么需要密钥认证?

  • 避免频繁输入密码
  • 支持自动化脚本调用
  • 提升安全性(可关闭密码登录)
  • 是 Ansible、SaltStack 等工具的底层依赖

5.2 工作原理

  1. 客户端生成密钥对(私钥本地保存,公钥上传)
  2. 服务端将公钥写入 ~/.ssh/authorized_keys
  3. 登录时,服务端发送挑战,客户端用私钥签名回应
  4. 验证通过,无需密码登录

5.3 手动创建与分发密钥

# 1. 生成密钥对(一路回车)
ssh-keygen -t rsa -b 2048
# 默认路径:~/.ssh/id_rsa(私钥)、id_rsa.pub(公钥)# 2. 分发公钥到目标主机
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.130.62# 3. 验证
ssh root@192.168.130.62 hostname
# 若无需密码返回主机名,则成功

5.4 自动化批量分发公钥

障碍分析
  1. 首次连接需输入 yes/no
  2. 需要输入用户密码
解决方案
步骤1:安装 sshpass
yum install -y sshpass
步骤2:跳过主机密钥检查
sshpass -p 'new_password' \ssh-copy-id -o StrictHostKeyChecking=no root@192.168.130.65

-o StrictHostKeyChecking=no:自动接受主机指纹


5.5 批量分发脚本(增强版)

#!/bin/bash
# 描述: 批量分发SSH公钥
# 作者: Freed
# 日期: 2025-09-19PASSWORD="new_password"
IPS="61 62 65"
LOG_FILE="/tmp/ssh_deploy_$(date +%F).log"
# 检查并安装 sshpass
if ! command -v sshpass &> /dev/null; thenecho "检测到 sshpass 未安装,正在自动安装..."# 如果 epel-release 未安装,则先安装 EPEL 仓库if ! rpm -q epel-release &> /dev/null; thenecho "正在安装 epel-release 仓库..."yum install -y epel-releasefi# 安装 sshpassecho "正在安装 sshpass..."yum install -y sshpass# 验证安装是否成功if ! command -v sshpass &> /dev/null; thenecho "错误:sshpass 安装失败,请检查网络或手动执行 'yum install -y sshpass'"exit 1elseecho "sshpass 安装成功"fi
elseecho "sshpass 已安装,继续执行"
fiexec > >(tee -a "$LOG_FILE") 2>&1echo "开始批量部署SSH密钥..."# 生成密钥(若不存在)
if [ ! -f ~/.ssh/id_rsa ]; thenecho "生成SSH密钥对..."ssh-keygen -f ~/.ssh/id_rsa -N '' -q
fi# 循环部署
for ip in $IPS; doTARGET="192.168.130.$ip"echo "正在部署到 $TARGET..."sshpass -p "$PASSWORD" \ssh-copy-id -o StrictHostKeyChecking=no root@$TARGET &>/dev/nullif [ $? -eq 0 ]; thenecho "成功: $TARGET"elseecho "失败: $TARGET"fi
doneecho "所有节点部署完成!日志已保存至 $LOG_FILE"

生产建议:结合 Ansible 或 SaltStack 实现更安全的批量管理。


六、实战:基于密钥的批量运维

6.1 批量执行命令

for ip in 61 62 65; doecho "=== 192.168.130.$ip ==="ssh root@192.168.130.$ip "uptime; df -h /"
done

6.2 批量同步配置文件

for ip in 61 62 65; doscp /etc/hosts root@192.168.130.$ip:/etc/hosts.bakscp /etc/hostname root@192.168.130.$ip:/tmpecho "hosts 已同步至 192.168.130.$ip"
done

七、OpenSSH 安全升级指南

升级背景

系统自带的 OpenSSH 版本通常较旧(如 CentOS 7 默认为 OpenSSH_7.4p1),存在以下风险:

  • 已知安全漏洞
    • CVE-2023-38408:远程代码执行(RCE)风险(通过代理转发)
    • CVE-2024-6387:未经身份验证的远程执行(glibc signal race condition)
  • 不支持现代加密算法(如 ed25519chacha20-poly1305
  • 依赖旧版 OpenSSL(如 1.0.2k),存在 Heartbleed 等历史漏洞

解决方案:源码编译升级至 OpenSSH 10.0p1 + OpenSSL 3.5.3 LTS


7.1 查看当前版本

ssh -V
# 示例输出:
# OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

建议:若版本低于 OpenSSH_8.9p1 或 OpenSSL 低于 1.1.1,应立即升级。


7.2 升级步骤(源码编译)

⚠️ 重要提示

  • 升级前请确保有 带外管理(如 iDRAC/IPMI) 访问权限
  • 建议在 维护窗口 操作,避免断连
  • 不要直接 make uninstall,避免系统 SSH 中断

步骤 1:安装编译依赖
yum install -y \gcc \make \wget \tar \perl \zlib-devel \pam-devel \openssl-devel \which \net-tools \vim

openssl-devel 提供编译时所需的头文件(即使你将替换 OpenSSL)


步骤 2:编译安装 OpenSSL 3.5.3 LTS
下载源码
cd /usr/local/src
wget https://www.openssl.org/source/openssl-3.5.3.tar.gz
tar -zxvf openssl-3.5.3.tar.gz
cd openssl-3.5.3
配置并编译
./config \--prefix=/usr/local/openssl \--openssldir=/usr/local/openssl \shared \zlib
echo $?make -j$(nproc)
make install
设置环境变量与软链接
# 创建软链接
ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl# 添加库路径(避免运行时找不到)
echo '/usr/local/openssl/lib64' > /etc/ld.so.conf.d/openssl-3.5.3.conf
ldconfig
验证安装
openssl version
#  预期输出:
# OpenSSL 3.5.3 16 Sep 2025

步骤 3:编译安装 OpenSSH 10.0p1
下载并解压
cd /usr/local/src
wget https://mirrors.aliyun.com/openbsd/OpenSSH/portable/openssh-10.0p1.tar.gz
tar -zxvf openssh-10.0p1.tar.gz
cd openssh-10.0p1
🔥 关键:正确配置 OpenSSL 路径

错误做法:--with-openssl=/usr/local/openssl(OpenSSH configure 不支持此参数)
正确做法:通过环境变量指定头文件、库路径

env CPPFLAGS="-I/usr/local/openssl/include" \LDFLAGS="-L/usr/local/openssl/lib64 -Wl,-rpath,/usr/local/openssl/lib64" \PKG_CONFIG_PATH="/usr/local/openssl/lib64/pkgconfig" \
./configure \--prefix=/usr \--sysconfdir=/etc/ssh \--with-ssl-engine \--with-pam \--with-zlib \--with-md5-passwords \--without-ssh1

验证 configure 输出:

OpenSSL header version: 3050300f (OpenSSL 3.5.3 16 Sep 2025)
OpenSSL library version: 3050300f (OpenSSL 3.5.3 16 Sep 2025)
编译与安装
make -j$(nproc)
make install

安装后文件路径:

  • 二进制:/usr/sbin/sshd, /usr/bin/ssh
  • 配置:/etc/ssh/sshd_config
  • 密钥:/etc/ssh/ssh_host_*

步骤 4:配置与安全加固
1. 修复主机密钥权限
chmod 600 /etc/ssh/ssh_host_*
chmod 644 /etc/ssh/ssh_host_*.pub
chown root:root /etc/ssh/ssh_host_*
2. 检查并修复 PAM 配置(防止 root 登录被阻)
vim /etc/pam.d/password-auth

找到:

auth        required      pam_succeed_if.so uid >= 1000 quiet_success

改为:

#auth        required      pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_succeed_if.so uid >= 1000 quiet_success

说明:sufficient 表示“满足条件就成功”,required 会强制失败。注释后允许 root 登录。

3. 清理 GSSAPI 警告(可选)
sed -i 's/^GSSAPI.*/#&/' /etc/ssh/sshd_config

步骤 5:重启服务并验证
重启 SSHD(⚠️ 确保有备用终端)
systemctl restart sshd# 或手动启动(调试用)
# /usr/sbin/sshd -D -p 2222 &  # 临时监听 2222 端口测试
验证版本
ssh -V
#  预期输出:
# OpenSSH_10.0p1, OpenSSL 3.5.3 16 Sep 2025

安全建议(生产环境)
推荐项配置值说明
PermitRootLoginprohibit-password禁止 root 密码登录,仅允许密钥
PasswordAuthenticationno禁用密码,仅用密钥
AllowUsersuser1 user2限制可登录用户
MaxAuthTries3限制登录尝试次数
LoginGraceTime60登录超时时间
UsePAMyes启用 faillock 防爆破

推荐组合:密钥登录 + faillock + AllowUsers


下载地址汇总
组件下载地址
OpenSSL 3.5.3https://www.openssh.com/
OpenSSH 10.0p1https://mirrors.aliyun.com/openbsd/OpenSSH/portable/openssh-10.0p1.tar.gz

常见问题排查
问题原因解决方案
configure: error: OpenSSL >= 1.1.1 required未正确指定 OpenSSL 路径使用 CPPFLAGS/LDFLAGS 明确路径
pam_succeed_if: uid >= 1000 拒绝 rootPAM 配置限制修改 /etc/pam.d/password-auth
SSH 登录慢UseDNS yes改为 UseDNS no
GSSAPI 警告不支持选项注释 GSSAPIAuthentication 等行
sshd 启动失败配置语法错误运行 /usr/sbin/sshd -t 检查

八、总结与最佳实践

8.1 核心知识点回顾

类别内容
服务对比OpenSSH > Telnet(安全优先)
安全配置修改端口、禁用root、关闭DNS
客户端命令ssh, scp, sftp 熟练掌握
密钥认证实现免密登录,支持自动化
批量管理Shell脚本 + 密钥 = 高效运维

8.2 最佳实践建议

  1. 安全第一:禁止root远程登录,使用普通用户+sudo
  2. 定期审计:监控 /var/log/secure 登录日志
  3. 密钥管理:离职人员及时清理 authorized_keys
  4. 防火墙策略:限制SSH访问源IP
  5. 定期升级:关注OpenSSH安全公告,及时修复漏洞
  6. 演进方向:过渡到 Ansible 实现企业级自动化
http://www.dtcms.com/a/395594.html

相关文章:

  • 一个可以直接跑满本地带宽文件分享工具 开箱即用,可用于局域网内分享文件和文件夹
  • 探索AI无人直播技术:自动化带来的新机遇
  • Codeforces Round 1051 (Div. 2) D1题 题解记录
  • 计算机视觉、图像处理国际学术会议
  • redhat7.4升级到Oracle Linux8.10
  • PEFT库实战快速入门
  • PyTorch 核心知识手册:神经网络构建与训练基础
  • DeepSeek对数学工具的分类(2025.1.13)
  • 2025年9月打磨机器人新技术解析与常见知名品牌推荐
  • STM32开发(WiFi - ESP8266)
  • ArcGIS 车辆轨迹跟踪 视频制作 第一人称视觉跟踪
  • Ansible自动化运维平台部署
  • VGG和PyTorch 神经网络工具箱
  • Linux系统nginx(一)
  • 144g网页制作最新 144g网页在线生成方法
  • PyTorch 神经网络工具箱全面解析
  • mac-vlan 概念及题目
  • 【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
  • 《Muduo网络库:基于Muduo的网络服务器编程示例》
  • 详解JNI JNA!
  • C# 获取docx文档页数的古怪方法
  • 算法题(215):奶牛飞盘
  • Ubuntu 安装与使用C++ onnxruntime库
  • Ubuntu 部署 Zabbix 6.0 LTS 监控平台
  • 基于springboot家政、上门服务、Java源码系统功能结构
  • 从 “纸笔清单” 到全栈引擎:数据填报与类 Excel 控件如何重塑企业效率曲线
  • FPGA学习笔记——图像处理之饱和度调节(RGB)
  • MySQL 读写分离详解与 MyCat 实战部署
  • SEU-project1项目调试过程记录
  • STM32H743-结合CubeMX新建HAL库MDK工程