由于OpenSSH的开源性和基于SSH协议的安全性,目前OpenSSH的应用十分广泛,数据中心的绝大部分Linux和Unix服务器上都安装了这一软件。正是由于OpenSSH的普遍使用,也使得OpenSSH的漏洞逐渐暴露出来,甚至包括高危漏洞。但操作系统原厂商,通常仅在最新版的操作系统中使用较新版的OpenSSH,这就造成了许多投入运行的生产系统,面临着无法从操作系统原厂商处获取最新版本的OpenSSH安装包,但又必须解决高危OpenSSH漏洞的问题。
由于OpenSSH的开源性,我们可以轻松获取源码版本的最新版OpenSSH,但实际在生产系统升级安装时,常常会遇到两种情况:一是升级步骤繁琐,如果大面积升级,耗时太久;二是升级新版本后出现远程登陆异常,甚至无法登陆服务器的情况;而且OpenSSH会持续暴露新漏洞和出现新版本,一个生产系统的运行周期内需多次对OpenSSH进行升级,因此OpenSSH的升级过程和升级方法的研究,对规避风险、缩短升级时间极为重要。
一、准备工作
获取最新版的OpenSSH
OpenSSH官方网站:http://www.openssh.com
目前最新版本为:OpenSSH8.4p1(2020年9月更新)
OpenSSH的安装前提
提前在服务器上安装zlib和OpenSSL,如果采用源码安装OpenSSH的方式,服务器还需安装GCC;如果服务器安装有老版本的OpenSSH(软件包一般均已经安装),仅检查版本是否符合新版本要求即可。
软件最新版本获取途径如下:
zlib 官网:http://www.zlib.net
OpenSSL 官网:http://www.openssl.org
GCC 官网:http://gcc.gnu.org
通常的安装顺序是 GCC编译环境→zlib→OpenSSL→OpenSSH,并不需要将所有的软件都升级至最新版本,其他软件存在高危漏洞(如OpenSSL等)的情况除外。
目前OpenSSH 8.4对软件的版本要求如下:
zlib: 1.1.4 or 1.2.1.2 or greater
OpenSSL: 1.0.x >= 1.0.1 or 1.1.0 >= 1.1.0g or any 1.1.1
GCC版本无特别要求,但如果采用源码方式升级OpenSSL或者zlib,建议GCC版本>4.0。
二、OpenSSH的两种升级方式
方法一:源码安装
下载源码到服务器上,解压后采用先configure,再make,make install方式安装。
方法二:在一台服务器上编译,其他服务器安装编译后的软件包
选择一台服务器,将源码包编译成对应操作系统版本的安装包;再将安装包分发至其他相同操作系统版本的服务器,服务器直接安装软件包。
两种安装方式对比:
对比项目 | 源码安装 | 先编译软件后安装 |
安装时间 | 每台服务器安装时间一致,耗时较长。 | 软件包编译时间较长,完成后其他服务器可快速安装。 |
操作步骤数量 | 较多 | 较少 |
是否支持用于yum zypper等包管理工具快速安装 | 不支持 | 支持 |
其他优点 | configure的过程中可自行灵活调整OpenSSH的安装目录,配置文件位置等。 | 仅首次编译对编译环境有要求,一旦软件包生成,其他服务器即使没有编译器,也可以安装。 采用软件包方式安装,系统下使用rpm、lslpp等命令查询时,可以显示出正确的OpenSSH版本。 |
其他缺点 | 对每台服务器上的编译环境有要求,大面积升级时经常会遇到个别服务器编译环境异常、排错比较困难的问题。 由于采用源码安装,操作系统本身的安装文件可能存在残留,并且rpm等包管理命令无法显示真实的OpenSSH版本。 | 相同的操作系统版本方可使用编译生成的软件包,如果操作系统版本较多较复杂,则需多次编译。 |
数据中心升级OpenSSH时,通常是多台服务器均有升级需求,并且操作系统版本相似。在此情况下,建议采用第二种方法进行升级,可以大大节约升级时间。本文后述内容会介绍基于第二种方法的两种常见操作系统的安装方式(CentOS7系统和AIX7系统)。
三、OpenSSH安装包编译
一般开源软件仅提供源码包,但OpenSSH的源码包提供了基于常见的操作系统版本的安装包编译脚本,方便使用;如果操作系统版本不在此列表中,可以采用源码安装方式或自行编写编译脚本。
在CentOS7系统上进行软件包编译
1、选择一台CentOS7服务器,安装以下软件包:
yum install rpm-build zlib-devel OpenSSL-devel gcc perl-devel pam-devel unzip –y
2、创建相关rpmbuild目录:
mkdir -p /root/rpmbuild/{SOURCES,SPECS}
3、将源码包下载至服务器/tmp/openssh目录,下载x11-ssh-askpass到相同目录,这是一个Linux图形情况下用于口令输入的软件包。下载地址:http://src.fedoraproject.org/repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz
4、将对应的文件拷贝至相应目录,解压文件,调整权限:
cp /tmp/openssh/openssh-8.1p1.tar.gz /root/rpmbuild/SOURCES/
cp /tmp/openssh/x11-ssh-askpass-1.2.4.1.tar.gz /root/rpmbuild/SOURCES/
cd /root/rpmbuild/SOURCES
tar -zxvf openssh-8.1p1.tar.gz openssh-8.1p1/contrib/redhat/openssh.spec
mv openssh-8.1p1/contrib/redhat/openssh.spec ../SPECS/
chown sshd:sshd /root/rpmbuild/SPECS/openssh.spec
5、编译软件包:
cd /root/rpmbuild/SPECS/
rpmbuild -ba openssh.spec
如果rpmbuild过程中存在OpenSSL版本、askpass等报错,请检查:该服务器的OpenSSL版本是否满足需求;askpass软件包是否下载到对应目录;GCC、Perl、zlib等软件包是否安装完好。
6、编译完成后,会在/root/rpmbuild/RPMS/x86_64目录下生成对应的rpm包。
在AIX7系统上进行软件包编译
在AIX上进行软件包编译,需要在AIX上安装GCC编译环境,采用源码方式安装同样需要,目前IBM官方提供的OpenSSH最新版本为8.1或者7.5,下载地址为:
http://www14.software.ibm.com/webapp/iwm/web/preLogin.do?source=aixbp,建议优先使用IBM官方提供的软件包安装。如果确实有高危漏洞需要升级至最新的8.4版本,或者7版本的最后一个版本7.9,可以尝试在开发环境下进行软件包编译,编译完成测试正常后,在生产系统安装的方法。
1、安装GCC环境
AIX Toolbox for Linux页面如下:
http://www.ibm.com/support/pages/aix-toolbox-linux-applications-downloads-alpha
可以采用下载rpm包方式安装,实际安装过程中需要下载较多软件包。
如果AIX可以连接外网,也可以在安装yum on aix工具后,使用yum直接从IBM网站安装GCC环境。Yum on aix的下载地址:
http://public.dhe.ibm.com/aix/freeSoftware/aixtoolbox/ezinstall/ppc/yum_bundle.tar。
由于本次未连接外网的AIX服务器,需要将所有依赖软件包下载至本地安装,以下软件包可在AIX Toolbox for Linux页面下载,或在rpmfind等网站查询。
rpm -ivh libgcc-4.8.3-1.aix7.1.ppc.rpm
rpm -ivh libstdc++-4.8.3-1.aix7.1.ppc.rpm
rpm -ivh libstdc++-devel-4.8.3-1.aix7.1.ppc.rpm
rpm -ivh bash-4.4-4.aix5.1.ppc.rpm
rpm -ivh expat-2.2.6-1.aix5.1.ppc.rpm
rpm -ivh zlib-1.2.11-1.aix5.1.ppc.rpm
rpm -ivh zlib-devel-1.2.11-1.aix5.1.ppc.rpm
rpm -ivh libffi-3.2.1-2.aix5.1.ppc.rpm
rpm -ivh libffi-devel-3.2.1-2.aix5.1.ppc.rpm --nodeps
rpm -ivh expat-devel-2.2.6-1.aix5.1.ppc.rpm
rpm -ivh glib2-2.32.4-1.aix5.1.ppc.rpm --nodeps
rpm -ivh gettext-0.17-1.aix5.1.ppc.rpm --nodeps
rpm -ivh gettext-devel-0.17-1.aix5.1.ppc.rpm
rpm -ivh libiconv-1.15-1.aix5.1.ppc.rpm
rpm -ivh info-6.4-1.aix5.1.ppc.rpm
rpm -ivh gmp-6.0.0a-1.aix5.1.ppc.rpm
rpm -ivh mpfr-3.0.1-1.aix5.1.ppc.rpm
rpm -ivh mpfr-devel-3.0.1-1.aix5.1.ppc.rpm
rpm -ivh libmpc-1.0.2-1.aix5.1.ppc.rpm
rpm -ivh gmp-devel-6.0.0a-1.aix5.1.ppc.rpm
rpm -ivh libmpc-devel-1.0.2-1.aix5.1.ppc.rpm
rpm -ivh gcc-4.8.3-1.aix7.1.ppc.rpm --nodeps
rpm -ivh gcc-cpp-4.8.3-1.aix7.1.ppc.rpm
rpm -ivh gcc-c++-4.8.3-1.aix7.1.ppc.rpm
rpm -ivh gcc-gfortran-4.8.3-1.aix7.1.ppc.rpm
rpm -ivh libgomp-4.8.3-1.aix7.1.ppc.rpm
2、编译安装zlib
gunzip -c zlib-1.2.11.tar.gz | tar xvf zlib-1.2.11
/tmp/openssh8.1/zlib-1.2.11
./configure --prefix=/usr/local/zlib
make
make install
3、检查当前OpenSSL版本是否符合要求,不符合需要先升级OpenSSL:
openssl version -a
4、编译OpenSSH软件包
gunzip -c openssh-8.4p1.tar.gz|tar xvf openssh -8.4p1
cd openssh -8.4p1
./configure --with-zlib=/usr/local/zlib --sysconfdir=/etc/ssh
contrib/aix/buildbff.sh
在当前目录生成OpenSSH-8.4p1.bff文件。
四、OpenSSH升级步骤
1、 备份
无论采用哪种方式进行OpenSSH升级,建议在升级前备份相关配置文件:
cp -r /etc/ssh/ /etc/ssh_old
cp /usr/sbin/sshd /usr/sbin/sshd_old
cp /usr/sbin/sshd-keygen /usr/sbin/sshd-keygen_old
cp /etc/init.d/sshd /etc/init.d/sshd_old
cp /usr/bin/ssh /usr/bin/ssh_old
cp /etc/pam.d/sshd /etc/pam.d/sshd.old
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old
2、 开启telnet
为避免升级过程中无法连接服务器,建议升级前开启telnet;升级完毕,新版OpenSSH测试正常后,再行关闭。
3、升级安装
CentOS系统安装方法:
提前将rpm包上传至内网yum源服务器,如果没有yum源,可以采用rpm安装:
yum install OpenSSH-server-8.4p1-1.el7.centos.x86_64 OpenSSH-8.4p1-1.el7.centos.x86_64 OpenSSH-clients-8.4p1-1.el7.centos.x86_64 OpenSSH-debuginfo-8.4p1-1.el7.centos.x86_64 –y
AIX系统安装方法:
进入OpenSSH-8.4p1.bff文件所在目录:
inutoc .
installp -acgNQqX -d . -f .toc
4、 检查sshd_config配置文件,重启sshd服务:
Centos:systemctl restart sshd
AIX:stopsrc –s sshd&&startsrc –s sshd
5、 验证OpenSSH,关闭telnet。
五、可能出现的问题及解决方法
OpenSSH升级过程中遇到问题的排错方法
升级过程中可能出现的问题一般是以下四种情况:
1、安装前所需的编译器、OpenSSL、zlib版本不正确,缺少库文件等;
解决方法为升级对应软件包版本。
2、升级完毕后新版sshd服务启动失败;
一般是由于升级过程中修改了部分系统文件,或新版本不再支持某些启动参数,因为之前备份了相关配置文件,可以根据启动时的报错进行分析,或直接使用sshd –d的debug模式,检查是OpenSSH程序本身的问题,还是操作系统脚本的问题。
3、安装后新版的OpenSSH不支持老版本的某些配置参数、算法等,导致客户端无法连接。
解决方法为根据客户端连接时的报错信息修改sshd_config 配置文件,增加算法支持,或修改参数配置。
4、升级完毕后由于公钥失效导致信任关系失效,或之前保存known_host的服务器无法正常连接。
解决方法为重新配置信任关系,删除失效的known_host。
曾经遇到的升级过程中出现的问题,可供参考:
1、安装过程中,或启动sshd服务时出现如下报错:
“Permissions 0737 for '/etc/ssh/ssh_host_rsa_key' are too open
原因为/etc/ssh/下的部分文件权限过多,解决方法:
chmod 600 /etc/ssh/ssh_host_rsa_key
chmod 600 /etc/ssh/ssh_host_ecdsa_key
chmod 600 /etc/ssh/ssh_host_ed25519_key
2、新版OpenSSH升级完毕后发现用户无法正常登陆,经检查/var/log/messages日志中存在sshd和PAM相关报错日志:
sshd[6027]: PAM unable to dlopen(/usr/lib64/security/pam_stack.so
/usr/lib64/security/pam_stack.so: cannot open shared object file: No such file or directory
sshd[6027]: PAM adding faulty module: /usr/lib64/security/pam_stack.so
原因为新版OpenSSH安装过程中替换了原/etc/pam.d/sshd文件,可以根据报错修改/etc/pam.d/sshd中的项,或使用原备份文件还原。
3、升级后远程登陆正常,但sftp无法正常使用:
原因为新版的sshd_config文件中关于sftp的部分配置不正确,解决方法为:检查sshd_config 配置文件中 Subsystem sftp internal-sftp是否指向正确的sftp文件所在目录。
4、升级后仅部分工具可以连接服务器,比如可以直接使用ssh命令在不同服务器之间跳转,但secureCRT却无法正常连接。
原因为新版本的OpenSSH不再对某些老的算法提供支持,可以升级secureCRT至最新版本,或在sshd_config文件中增加对老版本算法的支持。使用如下命令,将相关内容添加到sshd_config文件中:
cat >>/etc/ssh/sshd_config <
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
EOF
5、RHEL7版本使用sshd命令直接启动OpenSSH正常,但使用systemctl start sshd却无法启动服务,因此重启OpenSSH也无法自动启动。
通常是因为源码方式安装时,安装目录变化导致系统的部分脚本失效。需要检查/etc/init.d/sshd、/usr/lib/systemd/system/sshd.service等文件的内容,可以尝试将/usr/lib/systemd/system/sshd.service文件中的type=notify,修改为type=simple,然后systemctl daemon-reload之后测试,或自行编写sshd启动脚本,不再通过系统原有的脚本启动sshd服务。
6、升级后部分服务器连接时出如下报错后直接返回:
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
原因为升级OpenSSH之后,OpenSSH的公钥发生了改变,而客户端本地保存了这一条。解决方法为:手动删除客户端known_hosts,下次连接时再次保存即可。值得注意的是集群各节点也有可能因为OpenSSH公钥改变,导致信任关系失效,因此需要验证。
客户端执行rm -rf ~/.ssh/known_hosts
如欲了解更多,请登录十大靠谱网赌软件官方网站:u7hv.soubaidugou.com