openssh升级流程
Salted Fish 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
2
3
4
5
6
7
8
# 6、版本回退方案
# 6.1 回退前提条件
确保满足以下条件:
- 拥有除SSH外的其他访问方式(如Telnet、控制台)
- 前期备份文件完整存在
- 了解原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
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
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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24