0x01 前言

最近openssh爆出多个漏洞,危险等级从低危到高危。同时centos和epel源中openssh的版本都处于6的时代。虽然这些问题不会对服务器产生太大的安全问题,但安全点还是好的。

0x02 准备

我通过centos-base源能升级到的最高版本为6.6.1p1:

[[email protected] ~]# yum info openssh
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
已安装的软件包
名称    :openssh
架构    :x86_64
版本    :6.6.1p1
发布    :31.el7
大小    :1.4 M
源    :installed
来自源:base
简介    : An open source implementation of SSH protocol versions 1 and 2
网址    :http://www.openssh.com/portable.html
协议    : BSD

而openssh最新发布的版本为:7.4p1。

首先需要在升级的机器新建文件夹:

#新建rpmbuild临时文件夹
[[email protected] ~]# mkdir /root/rpmbuild

#进入临时文件夹
[[email protected] ~]# cd /root/rpmbuild/

#批量新建rpmbuild所需的文件夹
[[email protected] rpmbuild]# mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
mkdir: 已创建目录 "BUILD"
mkdir: 已创建目录 "BUILDROOT"
mkdir: 已创建目录 "RPMS"
mkdir: 已创建目录 "SOURCES"
mkdir: 已创建目录 "SPECS"
mkdir: 已创建目录 "SRPMS"

然后进入SOURCES文件夹并下载openssh源代码,如果需要X11支持,还需要下载X11源代码:

#进入源码
[[email protected] rpmbuild]# cd SOURCES/

#下载openssh
[[email protected] SOURCES]# wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.4p1.tar.gz

#下载X11
[[email protected] SOURCES]# wget http://pkgs.fedoraproject.org/repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz/8f2e41f3f7eaa8543a2440454637f3c3/x11-ssh-askpass-1.2.4.1.tar.gz

解压openssh并将spec脚本移动到SPECS目录中:

#解压文件
[[email protected] SOURCES]# tar zxvf openssh-7.4p1.tar.gz

#移动文件
[[email protected] SOURCES]# cp openssh-7.4p1/contrib/redhat/openssh.spec ../SPECS/

#删除文件
[[email protected] SOURCES]# rm -rf openssh-7.4p1

因为我们只使用openssh.spec这个文件,移动完成后即可将解压出来的文件夹删除。

0x03 打包

首先需要修正openssh.spec这个文件:

#进入文件夹
[[email protected] SOURCES]# cd ../SPECS/

#按需修改以下内容:
# Do we want to disable building of x11-askpass? (1=yes 0=no)
%define no_x11_askpass 1

# Do we want to disable building of gnome-askpass? (1=yes 0=no)
%define no_gnome_askpass 1

文件中有许多可供自定义的内容,请根据需要手动开启或关闭。修改完成后即可开始打包:

#打包
[[email protected] SPECS]# rpmbuild -bb openssh.spec

完成后在RPMS文件夹中即可查看打包好的软件包:

#进入文件夹
[[email protected] SPECS]# cd /root/rpmbuild/RPMS/x86_64/

#查看文件
[[email protected] x86_64]# ll -h
总用量 1.3M
-rw-r--r-- 1 root root 465K 1月   8 12:27 openssh-7.4p1-1.x86_64.rpm
-rw-r--r-- 1 root root 479K 1月   8 12:27 openssh-clients-7.4p1-1.x86_64.rpm
-rw-r--r-- 1 root root  17K 1月   8 12:27 openssh-debuginfo-7.4p1-1.x86_64.rpm
-rw-r--r-- 1 root root 359K 1月   8 12:27 openssh-server-7.4p1-1.x86_64.rpm

0x04 安装升级

首先需要手动备份openssh的配置文件:

#备份配置文件
[[email protected] x86_64]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

安装打包好的软件包:

#安装
[[email protected] x86_64]# yum install ./*

将刚才备份的openssh配置文件复制回原位,但为了可靠性,推荐将新的配置文件再作备份:

#备份新版配置文件
[[email protected] x86_64]# mv /etc/ssh/sshd_config /etc/ssh/sshd_config.new

#还原原先的配置文件
[[email protected] x86_64]# mv /etc/ssh/sshd_config.bak /etc/ssh/sshd_config

在启动的时候会发现启动失败:

#尝试启动
[[email protected] x86_64]# systemctl restart sshd
Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.

#查看启动信息
[[email protected] x86_64]# systemctl status sshd.service
● sshd.service - SYSV: OpenSSH server daemon
   Loaded: loaded (/etc/rc.d/init.d/sshd; bad; vendor preset: enabled)
   Active: failed (Result: exit-code) since 日 2017-01-08 12:35:45 CST; 7s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 20765 ExecStop=/etc/rc.d/init.d/sshd stop (code=exited, status=0/SUCCESS)
  Process: 20767 ExecStart=/etc/rc.d/init.d/sshd start (code=exited, status=1/FAILURE)
 Main PID: 20627 (code=exited, status=0/SUCCESS)

1月 08 12:35:45 test2 sshd[20767]: It is required that your private key files are NOT accessible by others.
1月 08 12:35:45 test2 sshd[20767]: This private key will be ignored.
1月 08 12:35:45 test2 sshd[20767]: key_load_private: bad permissions
1月 08 12:35:45 test2 sshd[20767]: Could not load host key: /etc/ssh/ssh_host_ed25519_key
1月 08 12:35:45 test2 sshd[20767]: sshd: no hostkeys available -- exiting.
1月 08 12:35:45 test2 sshd[20767]: [FAILED]
1月 08 12:35:45 test2 systemd[1]: sshd.service: control process exited, code=exited status=1
1月 08 12:35:45 test2 systemd[1]: Failed to start SYSV: OpenSSH server daemon.
1月 08 12:35:45 test2 systemd[1]: Unit sshd.service entered failed state.
1月 08 12:35:45 test2 systemd[1]: sshd.service failed.

在第18行中可以看出openssh加载host key失败导致openssh服务运行失败,这个host key是ssh连接时识别主机的途径,非常重要。但修复也很简单,在配置文件中可以看到有3个host key是默认启用的:

#查看配置文件
[[email protected] x86_64]# vim /etc/ssh/sshd_config

#host key配置
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

默认情况下,这三个host key都是存在的,只是权限配置错误,通过以下命令修正权限:

#修正权限
[[email protected] x86_64]# chmod 400 /etc/ssh/ssh_host_rsa_key
[[email protected] x86_64]# chmod 400 /etc/ssh/ssh_host_ecdsa_key
[[email protected] x86_64]# chmod 400 /etc/ssh/ssh_host_ed25519_key

再次尝试启动:

#尝试启动sshd
[[email protected] x86_64]# systemctl restart sshd

#查看启动状态
[[email protected] x86_64]# systemctl status sshd
● sshd.service - SYSV: OpenSSH server daemon
   Loaded: loaded (/etc/rc.d/init.d/sshd; bad; vendor preset: enabled)
   Active: active (running) since 日 2017-01-08 12:50:52 CST; 10s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 20765 ExecStop=/etc/rc.d/init.d/sshd stop (code=exited, status=0/SUCCESS)
  Process: 21516 ExecStart=/etc/rc.d/init.d/sshd start (code=exited, status=0/SUCCESS)
 Main PID: 21525 (sshd)
   CGroup: /system.slice/sshd.service
           └─21525 /usr/sbin/sshd

1月 08 12:50:52 test2 systemd[1]: Starting SYSV: OpenSSH server daemon...
1月 08 12:50:52 test2 sshd[21525]: Server listening on 0.0.0.0 port 22.
1月 08 12:50:52 test2 systemd[1]: PID file /var/run/sshd.pid not readable (yet?) after start.
1月 08 12:50:52 test2 sshd[21516]: Starting sshd:[  OK  ]
1月 08 12:50:52 test2 systemd[1]: Started SYSV: OpenSSH server daemon.

#查看端口监听状态
[[email protected] x86_64]# netstat -anp | grep sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      21525/sshd          
tcp        0      0 10.1.1.123:22           10.1.1.66:62220         ESTABLISHED 981/sshd: [email protected]/ 
unix  2      [ ]         DGRAM                    16928    981/sshd: [email protected]/

最后检查openssh版本:

#检查版本
[[email protected] x86_64]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.1e-fips 11 Feb 2013

0x05 结语

使用rpmbuild将openssh打包成rpm的方式可以很方便地升级多台主机,只需要将rpm包复制到需要升级的主机中进行安装即可。

在这里要注意的是:安装自行打包的rpm后会强行覆盖原先的openssh配置文件,在安装之前一定要手动备份!

另一个要注意的点是:新的配置文件中,关于host key和PermitRootLogin的配置是处于禁用状态的,这会导致重启sshd进程后导致不能通过SSH协议登陆,要注意先修改配置文件后再重启SSHD进程:

#手动启动以下内容,去除#号即可:
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

#允许使用root账户登录,去除#号并设为yes
PermitRootLogin yes