记录技术收获,分享个人心得

人生如负重远行,不可急于求成

各版本centos升级openssh及报错处理

本文概述

近期绿盟漏扫有扫出公司部分Linux系统ecs实例存在ssh漏洞,经核实此部分漏洞均为openssh版本过低引起,但是目前centos6,centos7,centos8的yum源,均未配置到最新的openssh包。centos8.2目前openssh也只是到了8.0p1,还是存在漏洞的版本。(低于8.3p1)所以需要对linux服务器的openssh版本进行编译升级。此过程交给ecs的租户运维去做,可能比较难。所以需要做一个云平台的自动化更新,考虑在ecs初始开设时候更新或者让用户按需求更新。
编译安装openssh,需要使用到gcc,zlib,perl5,pam-devel,zlib-devel等组件,组件编译更新顺序为zlib——>openssl——>openssh。目前截至该文章发布时间点,关联openssh的核心组件最新版本软件列表如下:
openssl:
下载地址:ftp://ftp.fi.muni.cz/pub/openssl/source/
最新版本:openssl-1.1.1k
openssh:
下载地址:https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/
最新版本:openssh-8.6p1

1、注意事项:

因涉及openssl的版本更新,存在可能与系统中间件不匹配的情况(如nginx,apache),请谨慎操作,做好系统盘快照,核心文件备份。

2、更新步骤:

自动更新脚本:http://www.gaoshan.me/download/shell/updatessh.sh
脚本完全按照升级步骤操作,目前升级到的为最新版本openssl-1.1.1k及openssh-8.6p1,测试已经通过了centos 6.8 ,6.9 ,7.2, 7.5 ,7.6 ,8.2环境,其中涉及较多细节,我会尽量在手工步骤及后续常见问题中讲解清楚。
手工安装步奏分解:

(1)更新zlib包
wget http://www.gaoshan.me/download/soft/zlib-1.2.11.tar.gz -O zlib-1.2.11.tar.gz
tar -xf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/usr/local/zlib
make
make install

centos8可直接执行

yum install openssl-devel -y

会一并更新zlib和openssl

(2)更新openssl

centos6、7

wget http://www.gaoshan.me/download/soft/openssl-1.1.1k.tar.gz -O openssl-1.1.1k.tar.gz
tar -xf openssl-1.1.1k.tar.gz
cd openssl-1.1.1k
./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl --with-zlib-lib=/usr/local/zlib/lib -fPIC
make
make install

安装无报错后还需修改链接指向

ln -sf /usr/local/openssl/bin/openssl /usr/local/bin/openssl
cp -a /usr/local/bin/openssl /usr/bin/
ln -sf /usr/local/openssl/include/openssl /usr/include/openssl
rm -rf /usr/local/openssl/lib/libcrypto.so
rm -rf /usr/local/openssl/lib/libssl.so
ln -sf /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -sf /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
ln -sf /usr/lib64/libssl.so.1.1 /usr/local/openssl/lib/libssl.so
ln -sf /usr/lib64/libcrypto.so.1.1 /usr/local/openssl/lib/libcrypto.so

centos8

yum install openssl-devel -y
(3)更新openssh

centos6、7

wget http://www.gaoshan.me/download/soft/openssh-8.6p1.tar.gz -O openssh-8.6p1.tar.gz
tar -xf openssh-8.6p1.tar.gz
cd openssh-8.6p1
./configure --prefix=/usr/local/ssh --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/openssl --with-zlib=/usr/local/zlib --with-md5-passwords --with-pam
make
make install

centos8

wget http://www.gaoshan.me/download/soft/openssh-8.6p1.tar.gz -O openssh-8.6p1.tar.gz
tar -xf openssh-8.6p1.tar.gz
cd openssh-8.6p1
./configure --prefix=/usr/local/ssh --sysconfdir=/etc/ssh --with-md5-passwords --with-pam
make
make install
(4)重新设置sshd相关配置
install -v -m755 contrib/ssh-copy-id /usr/local/ssh/bin
install -v -m644 contrib/ssh-copy-id.1 /usr/local/ssh/share/man/man1
install -v -m755 -d /usr/share/doc/openssh
install -v -m644 INSTALL LICENCE OVERVIEW README* /usr/share/doc/openssh
sed -i '/X11Forwarding/c\X11Forwarding yes' /etc/ssh/sshd_config
sed -i '/PermitRootLogin/c\PermitRootLogin yes' /etc/ssh/sshd_config
sed -i '/PasswordAuthentication/c\PasswordAuthentication yes' /etc/ssh/sshd_config
sed -i '/UseDNS/c\UseDNS no' /etc/ssh/sshd_config
sed -i '/GSSAPIAuthentication/c\#GSSAPIAuthentication yes' /etc/ssh/sshd_config
sed -i '/GSSAPICleanupCredentials/c\#GSSAPICleanupCredentials no' /etc/ssh/sshd_config
cp -af /usr/local/ssh/sbin/* /usr/sbin/
cp -af /usr/local/ssh/bin/* /usr/bin/
cp -af contrib/redhat/sshd.init /etc/init.d/sshd
cp -af contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
#避免升级后无法登录
sed -i '/$SSHD $OPTIONS/i\        OPTIONS="-f /etc/ssh/sshd_config"' /etc/init.d/sshd
chmod +x /etc/init.d/sshd
chmod 600 /etc/ssh/*_key
chmod 644 /etc/ssh/ssh_config /etc/ssh/*.pub
chmod 640 /etc/ssh/sshd_config
sed -i '/SELINUX/c\SELINUX=disabled' /etc/selinux/config
setenforce 0
(5)重新配置服务

centos6

chkconfig sshd on
service sshd stop
service sshd start

centos7以上

cp -a /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service.bak

重写sshd服务:否则会出现重启sshd服务卡住的问题,vi打开/usr/lib/systemd/system/sshd.service,键入如下代码

# Automatically generated by systemd-sysv-generator
[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/sshd
Description=SYSV: OpenSSH server daemon

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=no
PIDFile=/var/run/sshd.pid
ExecStart=/etc/rc.d/init.d/sshd start
ExecStop=/etc/rc.d/init.d/sshd stop
ExecReload=/etc/rc.d/init.d/sshd reload

配置服务

chkconfig sshd on
systemctl enable sshd
systemctl stop sshd
systemctl start sshd

3、常见问题:

(1)checking whether OpenSSL’s headers match the library… no
configure: error: Your OpenSSL headers do not match your library

《各版本centos升级openssh及报错处理》说明:在编译安装openssh过程中的一个错误,原因是openssl升级后库文件头版本(headers)与库版本(library)不一致,
解决方案:在编译升级openssl后,没有修改库文件的链接指向,故编译安装openssh会在make时候出现此错误,需要修改下软链指向(注意centos8不能用此方式)
ln -sf /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -sf /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
ln -sf /usr/lib64/libssl.so.1.1 /usr/local/openssl/lib/libssl.so
ln -sf /usr/lib64/libcrypto.so.1.1 /usr/local/openssl/lib/libcrypto.so

(2)centos8.2.2004(Core),编译openssl后,执行ssh -V报错symbol lookup error: /lib64/libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b

《各版本centos升级openssh及报错处理》
说明:参考:https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1127,https://xvcat.com/post/1895 此错误是由于编译安装的openssl库中,没有EVP_KDF_*的相关特性造成

《各版本centos升级openssh及报错处理》
解决方案:手工编译后,发现/openssl/lib/目录下并无libk5crypto相关组件,编译安装暂时没有比较好的解决方法,暂时使用yum install openssl-devel -y 来解决此问题,目前centos8的yum源支持到openssl 1.1.1g 也是符合要求的安全版本。

(3) error: PAM headers not found

《各版本centos升级openssh及报错处理》
说明:未安装pam包
解决方案:执行 yum install pam-devel -y 安装即可
(4)centos8安装openssl报错Can’t locate Getopt/Long.pm in @INC
说明:个人理解为系统自带的perl版本问题
解决方案:yum install perl -y

(5)centos6 yum更新安装报错404
说明:centos6已停止支持,需要修砌yum源,否则安装失败
解决方案:参考:https://help.aliyun.com/document_detail/193569.html

(6)正常安装编译后无法登录root账户,查看/var/log/secure日志提示被拒绝登录
说明:在安装openssh后/etc/ssh文件重新被替换,需要重新编辑/etc/ssh/sshd_config,写入permitrootlogin参数
解决方案:设置/etc/ssh/sshd_config中PermitRootLogin yes

(7)正常编译安装完毕后,重启sshd服务卡住,无任何反应,最后超时报错,从系统日志无法查看原因
说明:原因是sshd服务并未进行替换,这里面涉及到linux服务的配置,有兴趣可深入了解下。
解决方案:vi打开/usr/lib/systemd/system/sshd.service,写入上文安装过程中第5步中的重写sshd服务步奏。或者将openssh服务改名,不使用sshd也是可以的,比如sshd86。

(后续遇到的问题持续更新中)

4、附漏洞信息如下:

OpenSSH 安全限制绕过漏洞(CVE-2016-10012)
OpenSSH 远程权限提升漏洞(CVE-2016-10010)
OpenSSH 拒绝服务漏洞(CVE-2016-1907)
OpenSSH 安全漏洞(CVE-2017-15906)
OpenSSH SSH守护进程安全漏洞(CVE-2016-6210)
OpenSSH 安全漏洞(CVE-2021-28041)
OpenSSH <=7.2p1 xauth命令注入漏洞(CVE-2016-3115)
OpenSSH 命令注入漏洞(CVE-2020-15778)
OpenSSH 安全漏洞(CVE-2016-1908)
OpenSSH do_setup_env函数权限提升漏洞(CVE-2015-8325)
OpenSSH auth_password函数拒绝服务漏洞(CVE-2016-6515)
OpenSSH 用户枚举漏洞(CVE-2018-15919)
OpenSSH ‘x11_open_helper()’函数安全限制绕过漏洞(CVE-2015-5352)
OpenSSH 远程代码执行漏洞(CVE-2016-10009)
SSH 服务支持弱加密算法【原理扫描】
OpenSSH多个拒绝服务漏洞(CVE-2016-10708)
OpenSSH sshd mm_answer_pam_free_ctx释放后重利用漏洞(CVE-2015-6564)
Openssh MaxAuthTries限制绕过漏洞(CVE-2015-5600)


点赞
  1. 头像 阿玥玥说道:

    太牛逼了老哥,省了我好大的力气,直接拿来用了

发表评论

邮箱地址不会被公开。 必填项已用*标注

hi~

你好,欢迎来到我的博客,欢迎留言。

快速搜索:





Generic selectors

Exact matches only


Search in title


Search in content



Search in posts


Search in pages

欢迎关注我:

微博
steam
网易云音乐
QQ
500px

常用命令:

http://www.gaoshan.me/cmd