openssh升级流程

2025/10/10 openssh

# 1、升级前准备工作

# 1.1 系统环境检查

# 检查当前系统版本
cat /etc/centos-release
# 或者
cat /etc/os-release

# 检查当前OpenSSH和OpenSSL版本
ssh -V
openssl version

# 检查系统架构
uname -m

# 检查可用磁盘空间
df -h
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 1.2 安装必要依赖

安装编译依赖:

# CentOS 执行以下命令安装必要的工具和库
yum -y install gcc gcc-c++ make pam-devel zlib-devel openssl-devel wget perl-IPC-Cmd


# CtyunOS 执行以下命令安装必要的工具和库 实际上就是有了,版本冲突,不然执行上面的也行
yum install pam-devel zlib-devel
1
2
3
4
5
6

解决网络问题(如遇镜像无法访问):

# 配置DNS解析
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
echo "nameserver 4.2.2.2" >> /etc/resolv.conf

# 重启网络服务
systemctl restart network
# systemctl restart NetworkManager

# CentOS 更换阿里云yum源(如官方源不可用)
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo


# CtyunOS 备份原有源
mv /etc/yum.repos.d/CtyunOS-Base.repo /etc/yum.repos.d/CtyunOS-Base.repo.backup 2>/dev/null || true
# 使用兼容源(如 OpenCloudOS 或 CentOS 兼容源)
curl -o /etc/yum.repos.d/CtyunOS-Base.repo https://mirrors.opencloudos.tech/opencloudos/8/BaseOS/x86_64/os/repodata/repomd.xml


#清除并重新加载
yum clean all
yum makecache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 1.3 配置备用访问通道(关键步骤)

为防止升级过程中SSH连接中断导致服务器失联,强烈建议配置备用访问方式,例如安装并启动Telnet服务

# 1、安装Telnet服务器和客户端
yum -y install telnet-server telnet xinetd

# 2、编辑xinetd的Telnet配置文件
vi /etc/xinetd.d/telnet
# 将文件内容修改为:
service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no
}

# 3、允许root通过Telnet登录,在securetty文件中添加pts终端
echo "pts/0" >> /etc/securetty
echo "pts/1" >> /etc/securetty
echo "pts/2" >> /etc/securetty
# ⚠️安全提醒:这降低了安全性,但作为临时措施是必要的。完成后务必恢复。

# 4、临时添加Telnet端口(23)到防火墙规则
firewall-cmd --permanent --add-port=23/tcp
firewall-cmd --reload
# 如果使用iptables
iptables -I INPUT -p tcp --dport 23 -j ACCEPT
service iptables save

# 5、启动xinetd服务(Telnet由xinetd管理)
systemctl enable xinetd
systemctl start xinetd
# 6、验证服务状态
systemctl status xinetd
#或者(CentOS/RHEL 7+ 中,telnet 服务默认使用 telnet.socket)
systemctl enable telnet.socket
systemctl start telnet.socket
systemctl status telnet.socket

# 7、检查Telnet端口是否监听
netstat -tlnp | grep :23

# 8、测试Telnet连接
telnet 你的服务器IP
# 或者本地测试
telnet localhost

# 9、如果登录不上,则需要修改 /etc/pam.d/remote 文件,如有下面的一行则先注释掉,后期记得放开
# auth       required     pam_securetty.so
# 注意,这只是限制root,可以用其他用户登录然后切换root,不修改这个配置
# 修改后保存,然后重启xinetd服务
systemctl restart xinetd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

# 1.4 系统备份与配置

#查看SELinux
getenforce
# 临时关闭SELinux
setenforce 0

# 备份当前SSH配置
cp -r /etc/ssh /etc/ssh.backup.$(date +%Y%m%d)

# 备份当前重要的二进制文件
cp /usr/sbin/sshd /usr/sbin/sshd.backup 2>/dev/null || true
cp /usr/bin/ssh /usr/bin/ssh.backup 2>/dev/null || true

# 记录当前已安装的OpenSSH RPM包(用于回退)
rpm -qa | grep openssh > /root/openssh_rpm_packages.list

# 创建版本备份目录
mkdir -p /root/backup_$(date +%Y%m%d)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 2、OpenSSL升级步骤

# 2.1 解压与编译

# 下载源码包
wget https://www.openssl.org/source/openssl-3.3.1.tar.gz
#或者百度网盘
https://pan.baidu.com/s/1b06wz-ZmiUcJWihSAwnyvA?pwd=ygjg

# 解压源码包
tar -xzvf openssl-3.3.1.tar.gz -C /usr/local/

# 切换目录
cd /usr/local/openssl-3.3.1

# 配置编译选项 --prefix 指定安装目录
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib

# 编译安装
make && make install
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 2.2 更新系统链接

# 备份旧版OpenSSL
mv /usr/bin/openssl /usr/bin/openssl.old

# 创建新版本软链接:
ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/lib64/libssl.so.3 /usr/lib64/libssl.so.3
ln -s /usr/local/openssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3

# 将OpenSSL的库路径添加到配置中
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf

# 更新系统的动态库缓存
ldconfig -v

# 验证安装
openssl version
# 应该显示:OpenSSL 3.3.1 4 Jun 2024 (Library: OpenSSL 3.3.1 4 Jun 2024)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 3、升级OpenSSH 9.8p1

# 3.1 解压与编译

# 下载源码包
wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz
# 自己下载
https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/
#或者百度网盘
https://pan.baidu.com/s/1715QzVp9ZKM_BZNyTV6_aw?pwd=ijc1

# 解压源码包指定目录
tar -xzvf openssh-9.8p1.tar.gz -C /usr/local/

# 切换目录
cd /usr/local/openssh-9.8p1

# 配置编译选项
./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/openssl --with-pam --with-zlib

# 编译安装
make && make install
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 3.2 配置启动脚本

# 复制启动脚本:
cp contrib/redhat/sshd.init /etc/init.d/sshd

# 修改启动脚本中的路径
sed -i 's#SSHD=/usr/sbin/sshd#SSHD=/usr/local/openssh/sbin/sshd#' /etc/init.d/sshd
sed -i 's#/usr/bin/ssh-keygen#/usr/local/openssh/bin/ssh-keygen#' /etc/init.d/sshd

# 更新二进制文件到系统路径
cp -f /usr/local/openssh/bin/{ssh,scp,sftp,ssh-keygen} /usr/bin/ && cp -f /usr/local/openssh/sbin/sshd /usr/sbin/sshd

# 确保文件权限正确
chmod 755 /usr/bin/ssh /usr/bin/scp /usr/bin/sftp /usr/bin/ssh-keygen /usr/sbin/sshd
1
2
3
4
5
6
7
8
9
10
11
12

# 3.3 配置SSH服务

# 备份并更新SSH配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
# 确保关键配置存在(按原来的配置值也是行的)
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
echo "X11Forwarding yes" >> /etc/ssh/sshd_config

#检查配置问题,不显示说明成功,出现什么可以注释
/usr/local/openssh/sbin/sshd -t

# 注释掉(新版本不支持)
sed -i 's/^GSSAPIAuthentication/#GSSAPIAuthentication/' /etc/ssh/sshd_config
sed -i 's/^GSSAPICleanupCredentials/#GSSAPICleanupCredentials/' /etc/ssh/sshd_config
sed -i 's/^RSAAuthentication/#RSAAuthentication/' /etc/ssh/sshd_config
sed -i 's/^RhostsRSAAuthentication/#RhostsRSAAuthentication/' /etc/ssh/sshd_config
sed -i 's/^UsePrivilegeSeparation/#UsePrivilegeSeparation/' /etc/ssh/sshd_config

# 修复私钥文件权限
chmod 600 /etc/ssh/ssh_host_rsa_key
chmod 600 /etc/ssh/ssh_host_ecdsa_key
chmod 600 /etc/ssh/ssh_host_ed25519_key
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 3.4 启动服务

# 重新加载systemd配置
systemctl daemon-reload

# 启动SSH服务
systemctl restart sshd

# 设置开机自启
systemctl enable sshd

# 检查服务状态
systemctl status sshd
1
2
3
4
5
6
7
8
9
10
11

# 3.5 验证升级

# 验证版本
ssh -V
# 应该显示:OpenSSH_9.8p1

# 测试SSH连接
# 新开一个终端窗口,不要关闭当前Telnet会话
ssh 服务器IP

# 检查日志
tail -f /var/log/secure
1
2
3
4
5
6
7
8
9
10

# 4、升级后清理与验证

# 4.1 验证系统稳定性

让新版本运行至少30分钟,检查:

  • SSH连接是否稳定
  • 系统日志是否有异常
  • 所有SSH相关功能是否正常

# 4.2 清理工作

确认一切正常后,执行清理:

# 关闭Telnet服务
systemctl stop xinetd
systemctl disable xinetd
systemctl status xinetd
#或者
systemctl stop telnet.socket
systemctl disable telnet.socket
systemctl status telnet.socket

# 从防火墙移除Telnet端口
firewall-cmd --permanent --remove-port=23/tcp
firewall-cmd --reload
#或者
iptables -D INPUT -p tcp --dport 23 -j ACCEPT
service iptables save

# 恢复SELinux(根据安全策略)
# setenforce 1

# 清理编译文件
rm -rf /usr/local/openssl-3.3.1
rm -rf /usr/local/openssh-9.8p1

# 备份成功状态
echo "OpenSSH upgrade completed successfully on $(date)" > /root/openssh_upgrade_status.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 5、故障排除

# 5.1 常见问题解决

SSH服务启动失败:

# 查看详细错误信息
journalctl -u sshd -f

# 检查配置文件语法
/usr/local/openssh/sbin/sshd -t

# 检查端口占用
netstat -tlnp | grep :22
1
2
3
4
5
6
7
8

权限问题:

# 恢复SELinux上下文
restorecon -Rv /etc/ssh /usr/sbin/sshd /usr/bin/ssh

# 检查文件权限
ls -l /usr/sbin/sshd /usr/bin/ssh
1
2
3
4
5

升级完成(setenforce 1)访问不了

# 临时关闭SELinux
setenforce 0
# 通过audit2allow工具分析AVC日志并生成允许规则
ausearch -c 'sshd-session' --raw | audit2allow -M my-sshd
# 安装并启用新策略模块
semodule -i my-sshd.pp
#修复OpenSSH文件的安全上下文
restorecon -Rv /usr/local/openssh/
1
2
3
4
5
6
7
8

配置开机自启不行

# 创建 systemd 服务文件
cat > /usr/lib/systemd/system/sshd.service << 'EOF'
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
Wants=sshdgenkeys.service

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/local/openssh/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
EOF

# 重新加载 systemd 并启用服务:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 5.2 日志检查

# SSH认证日志
tail -f /var/log/secure

# 系统日志
tail -f /var/log/messages

# SSH服务日志
journalctl -u sshd -f
1
2
3
4
5
6
7
8

# 6、版本回退方案

# 6.1 回退前提条件

确保满足以下条件:

  1. 拥有除SSH外的其他访问方式(如Telnet、控制台)
  2. 前期备份文件完整存在
  3. 了解原OpenSSH的安装方式(RPM或编译)

# 6.2 方法一:通过RPM包回退(如果原先是RPM安装)

# 停止SSH服务
systemctl stop sshd

# 查看备份的RPM包列表
cat /root/openssh_rpm_packages.list

# 如果有RPM包备份文件,重新安装
rpm -Uvh --oldpackage openssh-*.rpm

# 或者从yum仓库重新安装(需要网络)
yum reinstall openssh openssh-server openssh-clients

# 恢复备份的SSH配置
cp -r /etc/ssh.backup.*/* /etc/ssh/

# 重启服务
systemctl start sshd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 6.3 方法二:手动回退(如果原先是编译安装)

# 停止SSH服务
systemctl stop sshd

# 恢复二进制文件
cp -f /usr/sbin/sshd.backup /usr/sbin/sshd
cp -f /usr/bin/ssh.backup /usr/bin/ssh

# 恢复SSH配置
cp -r /etc/ssh.backup.*/* /etc/ssh/

# 恢复OpenSSL(如果需要)
mv /usr/bin/openssl.old /usr/bin/openssl
mv /usr/include/openssl.old /usr/include/openssl

# 更新动态库缓存
ldconfig

# 重启服务
systemctl start sshd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 6.4 回退后验证

# 验证版本
ssh -V
openssl version

# 测试连接
ssh 服务器IP

# 检查服务状态
systemctl status sshd
1
2
3
4
5
6
7
8
9

# 6.5 紧急恢复脚本

给脚本执行权限:chmod +x /root/emergency_ssh_recover.sh

#!/bin/bash
echo "Starting emergency SSH recovery..."

# 停止服务
systemctl stop sshd

# 恢复备份的二进制文件
cp -f /usr/sbin/sshd.backup /usr/sbin/sshd 2>/dev/null
cp -f /usr/bin/ssh.backup /usr/bin/ssh 2>/dev/null

# 恢复配置
if [ -d "/etc/ssh.backup" ]; then
    cp -r /etc/ssh.backup/* /etc/ssh/
fi

# 恢复OpenSSL
if [ -f "/usr/bin/openssl.old" ]; then
    mv /usr/bin/openssl.old /usr/bin/openssl
fi

# 启动服务
systemctl start sshd

echo "Recovery completed. Please test SSH connection."
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24