一、简介

    最近公司一些生产系统服务器被机房扫描出openssh工具有漏洞,于是对线上的一些服务器中的openssh进行的升级,现将具体的过程写成博文,希望对大家有所帮助……

    由于CentOS 5 官方所提供的yum源中最新版本的openssh也相对很老了,所以就只有两种办法了:

    1、自制RPM包进行升级;

        本来我最先考虑的是使用这种方法,因为在生产环境中缺乏一些编译所需要的软件包,如果都一一安装的话又会产生未知的安全隐患,但是当把RPM制作完成后,在测试机上测试的时候发现最新版本的openssh安装是对系统环境中glibc,openssl等的依赖关系过于复杂,所以最终还是放弃了。

    2、源码编译安装

        经过我在测试环境中实验,其实编译过程中需要安装的软件包也不是很多,而且过程简化了好多,本着“偷懒”的心理,就果断采取这种简便的方法了。

    博文的实验过程是在办公区的内网测试机上进行的,公司生产系统中的一些东西不方便透漏,不过具体做法都是一样的。


二、实验环境及所使用到的软件包的版本号:

    操作系统:    CentOS 5.8 (x86_64)

    使用到的软件包的版本

        dropbear-2014.66.tar.bz2

https://matt.ucc.asn.au/dropbear/releases/dropbear-2014.66.tar.bz2

        openssl-1.0.1j.tar.gz

https://www.openssl.org/source/openssl-1.0.1j.tar.gz

        openssh-6.7p1.tar.gz

http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-6.7p1.tar.gz


三、实验过程:

    1、安装Dropbear代替OpenSSH

    安装dropbear只是为了在升级过程中sshd启动不起来时,依然可以登录系统。当然可以用其他工具代替。

    首先安装这次编译全过程中所需要的软件包:

[root@vm_102 ~]# yum -y install gcc zlib zlib-devel make pam pam-devel
[root@vm_102 ~]# tar xf dropbear-2014.66.tar.bz2 
[root@vm_102 ~]# cd dropbear-2014.66
[root@vm_102 dropbear-2014.66]# mkdir /opt/dropbear
[root@vm_102 dropbear-2014.66]# ./configure --prefix=/opt/dropbear/

[root@vm_102 dropbear-2014.66]# make && make install
[root@vm_102 dropbear-2014.66]# mkdir /etc/dropbear
[root@vm_102 dropbear-2014.66]# cd 
[root@vm_102 ~]# /opt/dropbear/bin/dropbearkey -t rsa -s 2048 -f /etc/dropbear/dropbear_rsa_host_key
Generating key, this may take a while...
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDgK0lMSpdfF7DGBwn0LehoTcpMX8D1zGPKvxJHkeFpE8cRNYC67q9v1q12wqRvir7sHwp7YlNOeTTqx45cOCiykeDV1IzhBvBGOj0TW8N8hU6/z66S0QQdDTWhsgLqhcH5Gvtc79YaxM/il6l8KHmgFEKWaC+vcomuuKt1UqTdSZUxyUygEhrjT7s20UGqgHDcJg/C0YTPwIvPfbDiHfG8WczvsAfrXB41Q8U9vTVBZI72KzVVDcOKOBhXZQY0n0zzQOZ7JKCayeIipOKwZ0k26udn6L2ljoefhEeBVPo8SAvWBr2dW6JtimSROqRqyV1S3Wwc+xDsH+YrpYgbFqv9 root@vm_102
Fingerprint: md5 0a:61:e8:61:0c:4d:56:8b:74:29:06:b7:c4:37:b6:d3
[root@vm_102 ~]# /opt/dropbear/sbin/dropbear -p 1213
[root@vm_102 ~]# netstat -tunlp 
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1900/portmap        
tcp        0      0 0.0.0.0:848                 0.0.0.0:*                   LISTEN      1938/rpc.statd      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2546/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2231/sendmail       
tcp        0      0 0.0.0.0:1213                0.0.0.0:*                   LISTEN      6712/dropbear       
tcp        0      0 :::22                       :::*                        LISTEN      2546/sshd           
tcp        0      0 :::1213                     :::*                        LISTEN      6712/dropbear       
udp        0      0 0.0.0.0:36031               0.0.0.0:*                               2311/avahi-daemon   
udp        0      0 0.0.0.0:842                 0.0.0.0:*                               1938/rpc.statd      
udp        0      0 0.0.0.0:845                 0.0.0.0:*                               1938/rpc.statd      
udp        0      0 0.0.0.0:5353                0.0.0.0:*                               2311/avahi-daemon   
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1900/portmap        
udp        0      0 :::59807                    :::*                                    2311/avahi-daemon   
udp        0      0 :::5353                     :::*                                    2311/avahi-daemon

    这里可以看的出,dropbear已经侦听在TCP的1213端口了,需要注意的是:如果你的Linux主机定义了iptables的话,在更新openssh之前一定要先在防火墙中开放该端口。

    然后我们可以在其它主机上通过ssh的方式连接1213端口实验一下。

[root@KVM_253 ~]# ssh -p1213 192.168.0.102
root@192.168.0.102's password: 
[root@vm_102 ~]#

剩下的工作就可以全部使用这个会话中完成了。

    3、升级openssl至1.0.1j

首先查看一下当前的opensl的版本信息

[root@vm_102 ~]# openssl version 
OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008


    这里跟大家解释一个事情,之前在网上看到有很多博客说直接使用rpm或者yum的方式强制卸载掉openssl,但是这种做法是万万不可取的,因为Linux环境下很多很多的软件包对openssl有依赖关系,我第一次试验的时候就出现这种情况,当时手欠执行了一条命令:

rpm -e `rpm -qa | grep openssl` --allmatches --nodeps

然后悄无声息的被卸载掉几百个软件包,然后就没有然后了。

    如果大家想看的话可以试下下面的操作:

[root@vm_102 ~]# yum remove openssl     #切记这里不要加-y选项
Transaction Summary
=========================================================================================
Remove      263 Package(s)
Reinstall     0 Package(s)
Downgrade     0 Package(s)
Is this ok [y/N]: n
Exiting on user Command
Complete!

最后一定要选择n


    那现在既然不能直接卸载,那我们就强制将openssl的程序文件覆盖掉就好了,如果你不清楚openssl的安装位置的话,我们使用whereis查看一下:

[root@vm_102 ~]# whereis openssl
openssl: /usr/bin/openssl /usr/lib/openssl /usr/share/man/man1/openssl.1ssl.gz
### 这里可以看的出openssl安装在/usr目录下,下面我们可以开始编译安装了:
[root@vm_102 ~]# tar xf openssl-1.0.1j.tar.gz 
[root@vm_102 ~]# cd openssl-1.0.1j
[root@vm_102 openssl-1.0.1j]# ./config --prefix=/usr/ shared
### 与其他程序的源码包不同的是,openssl生成makefile的shell脚本是config这个文件
[root@vm_102 openssl-1.0.1j]# make
[root@vm_102 openssl-1.0.1j]# make test
[root@vm_102 openssl-1.0.1j]# make install
### 编译完成,我们再看下openssl的版本号:
[root@vm_102 openssl-1.0.1j]# openssl version
OpenSSL 1.0.1j 15 Oct 2014

    4、升级openssh至6.7

首先先备份一下原本openssh的配置文件:

[root@vm_102 ~]# mv /etc/ssh/ /etc/ssh.bak
[root@vm_102 ~]# rpm -qa | grep openssh
openssh-clients-4.3p2-82.el5
openssh-4.3p2-82.el5
openssh-server-4.3p2-82.el5
[root@vm_102 ~]# rpm -e --nodeps `rpm -qa | grep openssh`    ### 卸载原本的openssh
[root@vm_102 ~]# rpm -qa | grep openssh
[root@vm_102 ~]# 
[root@vm_102 ~]# tar xf openssh-6.7p1.tar.gz 
[root@vm_102 ~]# cd openssh-6.7p1
[root@vm_102 openssh-6.7p1]# ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-zlib --with-md5-passwords
[root@vm_102 openssh-6.7p1]# make && make install 
/usr/sbin/sshd -t -f /etc/ssh/sshd_config
[root@vm_102 openssh-6.7p1]# ssh -V 
OpenSSH_6.7p1, OpenSSL 1.0.1j 15 Oct 2014
### 这里可以看的出来我们已经完成了openssh版本更新
[root@vm_102 openssh-6.7p1]# cp contrib/redhat/sshd.init /etc/init.d/sshd     
### 为openssh提供启动脚本
[root@vm_102 openssh-6.7p1]# /etc/init.d/sshd restart 
Stopping sshd:                                             [FAILED]
Starting sshd:                                             [  OK  ]
[root@vm_102 openssh-6.7p1]# chkconfig --add sshd
### 将sshd添加进服务列表
[root@vm_102 openssh-6.7p1]# chkconfig --list sshd
sshd           0:off1:off2:on3:on4:on5:on6:off
### 设置sshd为开机自启

这时我们可以从别的主机通过22端口连接到升级openssh后的主机了:

[root@KVM_253 ~]# ssh 192.168.0.102
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
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.
The fingerprint for the RSA key sent by the remote host is
f2:a7:d4:9d:5b:fb:d9:e7:f0:a5:84:95:65:97:21:c5.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:20
RSA host key for 192.168.0.102 has changed and you have requested strict checking.
Host key verification failed.
[root@KVM_253 ~]# vi /root/.ssh/known_hosts
### 在这个文件中将包含“192.168.0.102”这个IP地址的一行删除掉,保存。
[root@KVM_253 ~]# ssh 192.168.0.102
The authenticity of host '192.168.0.102 (192.168.0.102)' can't be established.
RSA key fingerprint is f2:a7:d4:9d:5b:fb:d9:e7:f0:a5:84:95:65:97:21:c5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.102' (RSA) to the list of known hosts.
root@192.168.0.102's password: 
Last login: Fri Jan  9 21:46:03 2015 from 192.168.0.253
[root@vm_102 ~]#

    之前安装的dropbear到此已经完成了她的使命,可以将该进程kill掉,然后将程序删除了:

[root@vm_102 ~]# killall dropbear
[root@vm_102 ~]# rm -rf /etc/dropbear/ /opt/dropbear/
[root@vm_102 ~]# netstat -tunlp 
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1900/portmap        
tcp        0      0 0.0.0.0:848                 0.0.0.0:*                   LISTEN      1938/rpc.statd      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      21792/sshd          
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2231/sendmail       
tcp        0      0 :::22                       :::*                        LISTEN      21792/sshd          
udp        0      0 0.0.0.0:36031               0.0.0.0:*                               2311/avahi-daemon   
udp        0      0 0.0.0.0:842                 0.0.0.0:*                               1938/rpc.statd      
udp        0      0 0.0.0.0:845                 0.0.0.0:*                               1938/rpc.statd      
udp        0      0 0.0.0.0:5353                0.0.0.0:*                               2311/avahi-daemon   
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1900/portmap        
udp        0      0 :::59807                    :::*                                    2311/avahi-daemon   
udp        0      0 :::5353                     :::*                                    2311/avahi-daemon