最近不少企业运维团队都收到了安全扫描报告,提示OpenSSH存在高危漏洞。作为Linux系统最核心的远程管理工具,OpenSSH的安全性直接关系到整个服务器的安全。我去年就遇到过因为OpenSSH版本过低导致服务器被入侵的案例,那次的教训让我养成了定期升级OpenSSH的习惯。
OpenSSH 9版本带来了多项安全改进,比如默认禁用SHA-1哈希算法、增强对抗侧信道攻击的能力等。在欧拉Euler系统上,官方已经提供了9版本的源码包,但直接在生产环境升级风险很大。我推荐的做法是先在测试环境用rpmbuild重新打包,再通过ansible批量部署,这样既能保证安全又能控制风险。
我强烈建议先在虚拟机搭建一个与生产环境相同的欧拉系统。你可以用这个命令检查当前系统版本:
bash复制cat /etc/os-release | grep -i "openeuler"
我的测试环境是EulerOS release 21.10 (LTS-SP2),内核版本5.10.0-60.18.0.50.oe2103.x86_64。记得给虚拟机做个快照,万一升级失败可以快速回滚。
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}
从欧拉官网下载带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
执行重建时最常见的坑就是依赖缺失。我整理了一份常见依赖列表:
| 依赖包 | 作用 | 安装命令 |
|---|---|---|
| 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
首先确保控制节点安装了Ansible:
bash复制yum install ansible -y
创建主机清单文件inventory.ini,把需要升级的服务器IP列出来:
ini复制[ssh_servers]
192.168.1.101
192.168.1.102 ansible_user=admin
这是我的升级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
先做dry-run测试:
bash复制ansible-playbook -i inventory.ini upgrade_ssh.yml --check
确认无误后正式执行:
bash复制ansible-playbook -i inventory.ini upgrade_ssh.yml
在所有目标服务器上验证版本:
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"
安全起见,我建议提前准备好回滚方案。创建一个回滚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
在实际操作中,我遇到过几个典型问题:
bash复制yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
bash复制setenforce 0
连接断开:一定要先在本地终端开启telnet或console连接,避免升级过程中失去远程访问。
性能问题:新版本可能启用了一些影响性能的特性。可以在sshd_config中添加:
bash复制UseDNS no
GSSAPIAuthentication no
升级完成后,我通常会做这些安全加固:
bash复制echo "Ciphers aes256-ctr,aes192-ctr,aes128-ctr" >> /etc/ssh/sshd_config
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小时,期间业务零中断。最关键的是提前做好测试和回滚准备,每个步骤都要验证。