centos7生产环境下openssh升级

由于生产环境ssh版本太低,导致使用安全软件扫描时提示系统处于异常不安全的状态,主要原因是ssh漏洞。推荐通过升级ssh版本修复漏洞

因为是生产环境,所以有很多问题需要注意。为了保险起见,在生产环境下做的任何升级之类的操作,最好先在测试环境中先测试一下,如果测试没问题再在生产环境中实施

系统环境:centos7.3

[root@localhost perl-5.28.0]# ssh -V

OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013

[root@localhost perl-5.28.0]# rpm -qa|grep zlib

zlib-1.2.7-17.el7.x86_64

有一个问题需要注意一下,那就是版本兼容问题。升级的openssh需要依赖于openssl和zlib,不同的openssh版本

下载地址

http://www.zlib.net/

https://www.openssl.org/source/ #这个下哪个版本一定要看openssh的要求,太高或者太低的版本都不行

http://www.openssh.com/portable.html

在安装过程中可能会提示perl5没安装,所以我们可能还需要安装perl5

http://www.perl.org/get.html#unix_like

注意一定要安装telnet并开启,否则ssh在升级过程中一旦出现什么问题,你就等着去机房操作吧。我就在升级过程中遇到过ssh服务重启失败的情况,导致无法ssh连接,还好有telnet-server,telnet安装好之后也要测试能连接成功

下面正式开始操作

#OS:centos6.5

#注意事项:其中第一、二、四部分在需要升级ssh版本的服务器上执行,第三步在其他机器上通过telnet连接执行,第三步之后才能执行第四步

#第一部分:要求,telnet测试成功

#第二部分:要求,ssh -V显示版本已更新,可以另开一个窗口ssh连接上去,yum list等也都可以正常使用

#第三部分:要求,通过telnet连接,重启ssh服务

#第四部分:要求,撤销开放的telnet连接,升级工作完成

#以下代码区域的命令可以直接复制到脚本内执行,按照以下步骤来

#!/bin/bash
#第一部分:这一部分需要根据实际情况修改,版本不同要修改对应的文件名
#下载压缩包
#注意查看新版openssh的zlib和openssl版本要求 http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/INSTALL
yum install wget -y  #安装wget才能下载压缩包啊,如果一下地址失效,可以直接访问主页寻找下载的地方
wget http://www.zlib.net/zlib-1.2.11.tar.gz
wget https://www.openssl.org/source/openssl-1.0.2q.tar.gz #注意最新版openssh不支持最新版本openssh
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.9p1.tar.gz
wget https://www.cpan.org/src/5.0/perl-5.28.0.tar.gz
#解压
tar -zxvf  zlib*   #输入zlib后直接按tab键回车即可
tar -zxvf  openssl*
tar -zxvf perl* #在安装openssl前,还需要先安装好perl5
tar -zxvf openssh*
#删除压缩包,否则我们后面不好针对文件操作
rm -rf *.tar.gz
#telnet服务
yum -y install telnet-server* xinetd
#以下内容为新增完善的,将xinetd里的telnet服务启用
cat > /etc/xinetd.d/telnet <<EOF
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no #启用telnet
}
EOF
mv /etc/securetty /etc/securetty.old #允许root用户通过telnet登录 service xinetd start #启动telnet服务 chkconfig xinetd on #使telnet服务开机启动,避免升级过程中服务器意外重启后无法远程登录系统 service iptables stop chkconfig --del iptables setenforce 0 sed -i 's/=enforcing/=disabled/' /etc/selinux/config echo "telnet设置完毕,请开启一个终端测试"
echo "opensshversion=解压后的openssh文件夹名,因为我们后面要用到openssh+版本这一文件名,所以在这里先赋值留给后面,例如opensshversion=openssh-7.9p1"

接着新开一个ssh连接窗口(一定要能通过telnet成功连接上去才可以):

#测试telnet功能,新开一个连接终端

telnet [ip]

#!/bin/bash
#第二部分: #正式开始安装 #zlib的更新 yum install gcc pam-devel zlib-devel -y #提前安装好依赖 #tar -zxvf zlib-1.2.11.tar.gz #输入zlib后直接按tab键回车即可 #cd zlib-1.2.11 cd zlib* ./configure --prefix=/usr #检查依赖关系 make #编译 rpm -e --nodeps zlib #卸载zlib make install #开始安装 echo '/usr/lib' >> /etc/ld.so.conf ldconfig #执行完成后,看yum list是否可以正常使用,如果可以说明正常了 #准备安装openssl find / -name openssl #不同版本会有不同的文件,对这些文件夹进行备份,如etc/pki/ca-trust/extracted/openssl /usr/bin/openssl /usr/lib64/openssl #注意这两个是库文件,也需要先备份一下 cp /usr/lib64/libcrypto.so.10 /usr/lib64/libcrypto.so.10.old cp /usr/lib64/libssl.so.10 /usr/lib64/libssl.so.10.old #rpm -qa|grep openssl #对返回的结果进行卸载,如下,不同版本也会是不同的文件 #rpm -e --nodeps openssl-1.0.1e-60.el7.x86_6457 rpm -qa |grep openssl|xargs -i rpm -e --nodeps {} #该命令相当于直接执行以上两条命令 cd #tar -zxvf openssl-1.0.2o.tar.gz #cd openssl* #./config --prefix=/usr --openssldir=/etc/ssl --shared zlib #在执行这里的时候,会提示没有安装perl5,所以还需要安装perl5 #cd #wget https://www.cpan.org/src/5.0/perl-5.28.0.tar.gz #tar -zxvf perl-5.28.0.tar.gz #在安装openssl前,还需要先安装好perl5 cd perl* ./Configure -des -Dprefix=$HOME/localperl make  #这几步操作都很耗时 make test #这里可能提示失败 cd t chmod +x ../cpan/File-Path/t/Path_root.t ../cpan/File-Path/t/Path_root.t ./perl -I../lib harness op/filetest.t #如果这里提示全部成功了,应该就没什么问题 cd .. make install perl -v #检测perl5是否安装成功 cd .. cd openssl* ./config --prefix=/usr --openssldir=/etc/ssl --shared zlib #继续安装openssl make make test  #make test如果报错,需要yum install perl-Test-Harness perl-CPAN -y,接着执行perl -MCPAN -e shell,除在显示modules installation处要输入 install Text::Template,其他默认输入yes即可,最后make install ok输入exit退出 make install openssl version cd mv -f /usr/lib64/libcrypto.so.10.old /usr/lib64/libcrypto.so.10 #恢复原来的库文件,因为新安装的openssl没包含这两个库文件 mv -f /usr/lib64/libssl.so.10.old /usr/lib64/libssl.so.10 openssl version #安装openssh mv /etc/ssh /etc/ssh.old #备份 mv /usr/sbin/sshd /usr/sbin/sshd.bak
mv /usr/bin/ssh /usr/bin/ssh.bak
mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.bak
#rpm -qa|grep openssh #rpm -e --nodeps openssh-5.3p1-94.el6.x86_64 #rpm -e --nodeps openssh-server-5.3p1-94.el6.x86_64 rpm -qa |grep openssh|xargs -i rpm -e --nodeps {} install -v -m700 -d /var/lib/sshd chown -v root:sys /var/lib/sshd groupadd -g 50 sshd useradd -c 'sshd PrivSep' -d /var/lib/sshd -g sshd -s /bin/false -u 50 sshd #tar -zxvf openssh-7.9p1.tar.gz cd openssh* ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib --with-ssl-dir=/usr --with-privsep-path=/var/lib/sshd #标红的参数,不同版本可能命名不同,需通过./configure --help确定 make make install 执行可能会提示WARNING: UNPROTECTED PRIVATE KEY FILE!原因是下面几个文件的权限问题,所以先执行以下命令 chmod 600 /etc/ssh/ssh_host_rsa_key chmod 600 /etc/ssh/ssh_host_ecdsa_key chmod 600 /etc/ssh/ssh_host_ed25519_key ssh -V install -v -m755 contrib/ssh-copy-id /usr/bin install -v -m644 contrib/ssh-copy-id.1 /usr/share/man/man1 install -v -m755 -d /usr/share/doc/openssh-7.9p1 install -v -m644 INSTALL LICENCE OVERVIEW README* /usr/share/doc/openssh-7.9p1 echo 'X11Forwarding yes' >> /etc/ssh/sshd_config cp -p contrib/redhat/sshd.init /etc/init.d/sshd chmod +x /etc/init.d/sshd chkconfig --add sshd chkconfig sshd on chkconfig --list sshd echo "PermitRootLogin yes" >>/etc/ssh/sshd_config #openssh7.9需要执行这个,默认配置文件禁止使用密码登录,不执行你就无法通过ssh登录

然后

#第三部分:

#通过telnet连接,重启ssh服务

service sshd restart

ssh -V #提示ssh为安装的最新版本,升级成功

#!/bin/bash
#第四部分: #善后工作,取消telnet mv /etc/securetty.old /etc/securetty chkconfig xinetd off service xinetd stop

附加知识:

#版本回退,如需还原之前的ssh配置信息,可直接删除升级后的配置信息,恢复备份。

rm -rf /etc/ssh

mv /etc/ssh.old /etc/ssh

有时候我们还会遇到openssh已经升过级的情况,而且安装方式还是编译安装的,很明显上面的方式就不合适了

所以我们的的rpm -qa|grep ssh卸载方式那里需要换一下

find / -name ssh 一般会返回旧版本的安装路径,里面包含旧版本号的就是旧openssh的安装路径

进入该路径执行cp -r /etc/ssh /etc/ssh.old 先做一个备份,再执行make uninstall就可以卸载了,其他步骤跟上面相似

备注:第二次修改(应该没有什么特别大的问题了)