一、升级背景
#OpenSSH 出现高危远程代码执行漏洞,影响超过 1400 万台暴露在公网上的服务器。该漏洞是 2006 年的漏洞回归,即在 2006 年被修复但在 2020 年更改内容的时候再次引入,攻击者借助该漏洞可以获得整个系统的控制权。#
受影响的 OpenSSH 版本:
- 低于 4.4p1 版 (不含此版本):受影响
- 高于 4.4p1 但低于 8.5p1 (不含此版本):不受影响
- 8.5p1 及后续版本到 9.8p1 (不含此版本):受影响
该漏洞的潜在影响:
攻击者利用此漏洞实际上可以以最高权限执行任意代码,因此一旦得手就可以获得整个系统和服务器的控制权,无论是安装恶意软件还是窃取数据都是轻轻松松完成。
同时 Qualys 还提到攻击者还可以借助此漏洞获得的权限绕过防火墙、入侵监测系统和日志记录机制等关键安全机制,即可以通过这些方式避免被发现并隐藏其活动。
二、环境介绍
系统版本 | centos 7.9 |
---|---|
升级openssh版本 | openssh-9.8p1 |
openssh-9.8p1依赖 | openssl-1.1.1以上 |
yum源 | 阿里云yum源 |
三、编译安装openssl-1.1.1
openssh9.4及以上版本必须要openssl-1.1.1,低于此版本openssh无法完成编译。
1、编译安装openssl软件
①上传openssl-1.1.1,源码包
源码下载:https://www.openssl.org/source/openssl-1.1.1t.tar.gz
自行上传
②安装源码依赖包
yum -y install gcc gcc-c++ zlib zlib-devel openssl openssl-devel pam-devel perl perl-Test-Simple
③解压源码包
tar -zxvf openssl-1.1.1t.tar.gz
④编译
cd openssl-1.1.1t/
./config --prefix=/usr/local/openssl shared -fPIC
⑤构建软件生成项目依赖关系
make depend
验证程序稳定、正确性
make tests
⑥安装
make && make install
2、配置安装的openssl环境
①查看函数库,检查缺少的函数库
ldd /usr/local/openssl/bin/openssl
添加缺少的函数库
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
或者配置环境变量
export OPENSSL_ROOT_DIR=/usr/local/openssl
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$OPENSSL_ROOT_DIR/lib
②更新函数库
ldconfig -v
再次检查函数库是否缺少
ldd /usr/local/openssl/bin/openssl
③检查源码安装的版本
] # /root/openssl-1.1.1t/apps/openssl version (此为源码安装包的openssl程序)
OpenSSL 1.1.1t 7 Feb 2023
或者使用编译安装后的openssl路径
/usr/local/openssl/bin/openssl version (安装的openssl路径程序)
④查看旧版本openssl命令路径
which openssl
查看旧版本openssl版本
] # /usr/bin/openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
⑤将旧版本openssl移除,新版本放入该位置代替
mv /usr/bin/openssl /usr/bin/openssl.old
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
⑥为openssl下的加密解密文件libcrypto和加密模块库libssl创建软连接
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
⑦配置环境变量
]# export CFLAGS="-I/usr/local/openssl/include"
]# export LDFLAGS="-L/usr/local/openssl/lib"
]# export LD_LIBRARY_PATH="/usr/local/openssl/lib"
至此openssl环境配置完成,解决openssh编译依赖问题。
四、编译安装openssh-9.8p1
源码安装之前,可以使用yum remove将openssh及其依赖软件卸载,卸载后不退出或者不重启服务器当前连接的ssh终端不会中断。
# yum remove openssh (卸载软件需谨慎,不卸载软件也可以区分程序所在路径位置,或者可以使用sshd -V进行版本查看)
yum卸载openssh后,删除/etc/ssh目录,清理掉旧版软件的配置文件
yum remove openssh
rm -rf /etc/ssh
1、编译安装openssh软件
①将openssh-9.8p1源码包传入服务器
https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz
②解压openssh-9.8p1.tar.gz包
tar -zxvf openssh-9.8p1.tar.gz
③进入源码目录进行编译
cd openssh-9.8p1/
./configure --prefix=/usr/local --sysconfdir=/etc/ssh
注释:--prefix=指定程序安装目录 --sysconfdir=指定配置文件目录
如果编译出现报错,说明openssl环境仍有问题。
checking OpenSSL header version... 100020bf (OpenSSL 1.0.2k 26 Jan 2017)
checking for OpenSSL_version... no
checking for OpenSSL_version_num... no
checking OpenSSL library version... configure: error: OpenSSL >= 1.1.1 required (have "100020bf (OpenSSL 1.0.2k-fips 26 Jan 2017)")
执行一下命令,再次编译即可运行成功(在配置openssl已执行)
]# export CFLAGS="-I/usr/local/openssl/include"
]# export LDFLAGS="-L/usr/local/openssl/lib"
]# export LD_LIBRARY_PATH="/usr/local/openssl/lib"
④编译安装文件
编译安装之前,可以选择删除/etc/ssh目录,因为安装时会生成这个目录下的文件,不删除的话,这些配置文件不会被系统覆盖
这个截图中显示,ssh的配置文件已存在,不会被安装。而且旧版的配置文件,79、80、96行的配置不被支持。
编译安装软件
make && make install
⑤安装完成后可以使用sshd -V检查openssh版本
这里我执行sshd -V,输出版本为OpenSSH_9.8p1。是我已经yum卸载了openssh。卸载openssh后,旧版的sshd命令也被删除了(/usr/sbin/sshd),我源码编译安装的程序sshd路径在(/usr/local/sbin/sshd)
⑥使用源码安装出的sshd程序开启ssh服务
/usr/local/sbin/sshd -f /etc/ssh/sshd_config
2、注释
1、"-f /etc/ssh/sshd_config":指定程序运行加载的配置文件
2、make install 安装完成服务以后,会提示“/usr/local/sbin/sshd -t -f /etc/ssh/sshd_config”运行程序,测试带有“-t”运行的命令无法开启sshd服务。
3、使用sshd程序运行服务时,必须使用完整的绝对路径执行sshd程序,否则无法运行程序;
# /usr/local/sbin/sshd -f /etc/ssh/sshd_config
# sshd -f /etc/ssh/sshd_config 不使用完整路径无法运行程序,翻译为:sshd要求使用绝对路径执行
4、第一次运行服务时,会遇见即使输入root密码正确但是也无法进入系统。 原因为:源码安装生成的配置文件默认禁用了root登录,需要在配置文件/etc/ssh/sshd_config内“PermitRootLogin”后面的参数改为“yes”,重新启动程序后即可正常使用root登录。
3、编译安装过程中的报错
问题一:卸载旧版软件时没有清理配置文件,源码编译安装时会出现权限问题。这里是因为我安装时没有删除/etc/ssh目录,安装前直接删除,可能不会有这个报错。
解决方案:
chmod 0600 /etc/ssh/ssh_host_rsa_key
chmod 0600 /etc/ssh/ssh_host_ecdsa_key
chmod 0600 /etc/ssh/ssh_host_ed25519_key