本文概述
近期绿盟漏扫有扫出公司部分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
说明:在编译安装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
说明:参考:https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1127,https://xvcat.com/post/1895 此错误是由于编译安装的openssl库中,没有EVP_KDF_*的相关特性造成
解决方案:手工编译后,发现/openssl/lib/目录下并无libk5crypto相关组件,编译安装暂时没有比较好的解决方法,暂时使用yum install openssl-devel -y 来解决此问题,目前centos8的yum源支持到openssl 1.1.1g 也是符合要求的安全版本。
(3) error: PAM headers not found
说明:未安装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)
太牛逼了老哥,省了我好大的力气,直接拿来用了