0x01 前言
最近openssh爆出多个漏洞,危险等级从低危到高危。同时centos和epel源中openssh的版本都处于6的时代。虽然这些问题不会对服务器产生太大的安全问题,但安全点还是好的。
0x02 准备
我通过centos-base源能升级到的最高版本为6.6.1p1:
[root@test2 ~]# 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临时文件夹 [root@test2 ~]# mkdir /root/rpmbuild #进入临时文件夹 [root@test2 ~]# cd /root/rpmbuild/ #批量新建rpmbuild所需的文件夹 [root@test2 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源代码:
#进入源码 [root@test2 rpmbuild]# cd SOURCES/ #下载openssh [root@test2 SOURCES]# wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.4p1.tar.gz #下载X11 [root@test2 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目录中:
#解压文件 [root@test2 SOURCES]# tar zxvf openssh-7.4p1.tar.gz #移动文件 [root@test2 SOURCES]# cp openssh-7.4p1/contrib/redhat/openssh.spec ../SPECS/ #删除文件 [root@test2 SOURCES]# rm -rf openssh-7.4p1
因为我们只使用openssh.spec这个文件,移动完成后即可将解压出来的文件夹删除。
0x03 打包
首先需要修正openssh.spec这个文件:
#进入文件夹 [root@test2 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
文件中有许多可供自定义的内容,请根据需要手动开启或关闭。修改完成后即可开始打包:
#打包 [root@test2 SPECS]# rpmbuild -bb openssh.spec
完成后在RPMS文件夹中即可查看打包好的软件包:
#进入文件夹 [root@test2 SPECS]# cd /root/rpmbuild/RPMS/x86_64/ #查看文件 [root@test2 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的配置文件:
#备份配置文件 [root@test2 x86_64]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
安装打包好的软件包:
#安装 [root@test2 x86_64]# yum install ./*
将刚才备份的openssh配置文件复制回原位,但为了可靠性,推荐将新的配置文件再作备份:
#备份新版配置文件 [root@test2 x86_64]# mv /etc/ssh/sshd_config /etc/ssh/sshd_config.new #还原原先的配置文件 [root@test2 x86_64]# mv /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
在启动的时候会发现启动失败:
#尝试启动 [root@test2 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. #查看启动信息 [root@test2 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是默认启用的:
#查看配置文件 [root@test2 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都是存在的,只是权限配置错误,通过以下命令修正权限:
#修正权限 [root@test2 x86_64]# chmod 400 /etc/ssh/ssh_host_rsa_key [root@test2 x86_64]# chmod 400 /etc/ssh/ssh_host_ecdsa_key [root@test2 x86_64]# chmod 400 /etc/ssh/ssh_host_ed25519_key
再次尝试启动:
#尝试启动sshd [root@test2 x86_64]# systemctl restart sshd #查看启动状态 [root@test2 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. #查看端口监听状态 [root@test2 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: root@pts/ unix 2 [ ] DGRAM 16928 981/sshd: root@pts/
最后检查openssh版本:
#检查版本 [root@test2 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