1. 为什么需要升级OpenSSH到9版本?
最近不少企业运维团队都收到了安全扫描报告,提示OpenSSH存在高危漏洞。作为Linux系统最核心的远程管理工具,OpenSSH的安全性直接关系到整个服务器的安全。我去年就遇到过因为OpenSSH版本过低导致服务器被入侵的案例,那次的教训让我养成了定期升级OpenSSH的习惯。
OpenSSH 9版本带来了多项安全改进,比如默认禁用SHA-1哈希算法、增强对抗侧信道攻击的能力等。在欧拉Euler系统上,官方已经提供了9版本的源码包,但直接在生产环境升级风险很大。我推荐的做法是先在测试环境用rpmbuild重新打包,再通过ansible批量部署,这样既能保证安全又能控制风险。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖检查
2.1 搭建测试环境
我强烈建议先在虚拟机搭建一个与生产环境相同的欧拉系统。你可以用这个命令检查当前系统版本:
bash复制cat /etc/os-release | grep -i "openeuler"
我的测试环境是EulerOS release 21.10 (LTS-SP2),内核版本5.10.0-60.18.0.50.oe2103.x86_64。记得给虚拟机做个快照,万一升级失败可以快速回滚。
2.2 安装必要工具
rpmbuild工具链是打包的关键,安装命令如下:
bash复制yum install rpm-build rpmdevtools yum-utils -y
然后初始化rpmbuild工作目录:
bash复制rpmdev-setuptree
这个命令会在用户家目录下创建rpmbuild目录结构,包括BUILD、RPMS、SOURCES等子目录。我习惯把工作目录放在/opt下,这样更整洁:
bash复制mkdir -p /opt/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
3. 下载与重建OpenSSH RPM包
3.1 获取源码包
从欧拉官网下载带src的RPM包很重要。我试过直接从源码编译,但会遇到各种依赖问题。官网的src.rpm已经做好了适配欧拉的补丁和配置。
下载命令:
bash复制wget https://repo.openeuler.org/openEuler-22.03-LTS-SP2/update/source/Packages/openssh-9.1p1-3.oe2203.src.rpm
3.2 解决依赖问题
执行重建时最常见的坑就是依赖缺失。我整理了一份常见依赖列表:
| 依赖包 | 作用 | 安装命令 |
|---|---|---|
| audit-libs-devel | 审计功能支持 | yum install audit-libs-devel |
| openssl-devel | 加密功能支持 | yum install openssl-devel |
| pam-devel | PAM认证支持 | yum install pam-devel |
| zlib-devel | 压缩功能支持 | yum install zlib-devel |
重建命令:
bash复制rpmbuild --rebuild openssh-9.1p1-3.oe2203.src.rpm
如果遇到报错,根据提示安装对应依赖。我建议加上--nocheck参数跳过测试阶段加速构建:
bash复制rpmbuild --rebuild openssh-9.1p1-3.oe2203.src.rpm --nocheck
4. 使用Ansible批量部署
4.1 准备Ansible环境
首先确保控制节点安装了Ansible:
bash复制yum install ansible -y
创建主机清单文件inventory.ini,把需要升级的服务器IP列出来:
ini复制[ssh_servers]
192.168.1.101
192.168.1.102 ansible_user=admin
4.2 编写Playbook
这是我的升级playbook示例:
yaml复制---
- hosts: ssh_servers
become: yes
tasks:
- name: 上传RPM包
copy:
src: /opt/rpmbuild/RPMS/x86_64/openssh-9.1p1-3.oe2203.x86_64.rpm
dest: /tmp/
- name: 备份原配置
command: cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
- name: 安装新版本
yum:
name: /tmp/openssh-9.1p1-3.oe2203.x86_64.rpm
state: present
- name: 重启服务
systemd:
name: sshd
state: restarted
enabled: yes
4.3 执行升级
先做dry-run测试:
bash复制ansible-playbook -i inventory.ini upgrade_ssh.yml --check
确认无误后正式执行:
bash复制ansible-playbook -i inventory.ini upgrade_ssh.yml
5. 验证与回滚方案
5.1 升级后检查
在所有目标服务器上验证版本:
bash复制ansible ssh_servers -i inventory.ini -m command -a "ssh -V"
预期输出应该是"OpenSSH_9.1p1"。同时检查sshd服务状态:
bash复制ansible ssh_servers -i inventory.ini -m systemd -a "name=sshd state=started"
5.2 回滚准备
安全起见,我建议提前准备好回滚方案。创建一个回滚playbook:
yaml复制---
- hosts: ssh_servers
become: yes
tasks:
- name: 卸载新版本
yum:
name: openssh
state: absent
- name: 安装旧版本
yum:
name: openssh-8.6p1-3.oe2203
state: present
- name: 恢复配置
copy:
src: /etc/ssh/sshd_config.bak
dest: /etc/ssh/sshd_config
- name: 重启服务
systemd:
name: sshd
state: restarted
6. 常见问题解决
在实际操作中,我遇到过几个典型问题:
- 依赖地狱:有些依赖包在欧拉源里没有。我的解决办法是配置EPEL源:
bash复制yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
- 服务启动失败:通常是selinux导致。临时解决方案:
bash复制setenforce 0
-
连接断开:一定要先在本地终端开启telnet或console连接,避免升级过程中失去远程访问。
-
性能问题:新版本可能启用了一些影响性能的特性。可以在sshd_config中添加:
bash复制UseDNS no
GSSAPIAuthentication no
7. 安全加固建议
升级完成后,我通常会做这些安全加固:
- 禁用不安全的加密算法:
bash复制echo "Ciphers aes256-ctr,aes192-ctr,aes128-ctr" >> /etc/ssh/sshd_config
- 限制root登录:
bash复制echo "PermitRootLogin no" >> /etc/ssh/sshd_config
- 启用两步验证:
bash复制yum install google-authenticator
- 设置登录超时:
bash复制echo "ClientAliveInterval 300" >> /etc/ssh/sshd_config
echo "ClientAliveCountMax 0" >> /etc/ssh/sshd_config
这套方案在我们公司200+服务器环境成功实施,整个过程耗时约3小时,期间业务零中断。最关键的是提前做好测试和回滚准备,每个步骤都要验证。
