因为受到监管报告,服务器有SSL/TLS协议信息泄露漏洞(CVE-2016-2183)漏洞,我们的几台ubuntu服务器要升级ssl和openssh。查了下最新的openssh版本已经8.8了,网上大部分升级教程都是低版本的ssh,还是直接升级到最新的。
先容我吐槽下。这两年伟大的ZF在网络监管方面越来越严格,同时也意味着一般企业公司在信息安全方面支出也越来越高。做个公安部的安保等级每年要花费近十万大洋,做个通信管理局的通保每年也要花费不少。对于IT创业公司来说,真的太难了。
安装环境
- Ubuntu 16.04
- 内核版本 : Linux 4.4.0-170-generic
- Shell: zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
- openssl版本: OpenSSL 1.0.2g 1 Mar 2016
- openssh版本: OpenSSH_7.2p2 Ubuntu-4ubuntu2.10
因为要升级ssh,ssh进程要停掉,所以要先安装telnet来连接服务器。
前期准备
安装telnet
1 | sudo apt-get install openbsd-inetd telnetd telnet |
下载需要的包
服务器上找个目录存放这次升级要下载的包,进入该目录依次下载3个压缩包。
1 | wget http://zlib.net/zlib-1.2.11.tar.gz |
升级更新
安装依赖包zlib
退出ssh登录,以telnet方式进入服务器,进入之前下载包的目录
1 | tar xvf zlib-1.2.11.tar.gz |
如果运行“./configure –prefix=/usr/local/zlib” 出现错误,请检查gcc
1 | 检测是否安装 |
升级更新openssl版本
回到下载包的目录,依次执行以下命令
1 | tar zxvf openssl-1.1.1l.tar.gz |
如果在执行make编译命令的时候报错,zlib.h: No such file or directory,如下图。
(我在ubuntu16.04系统里没出现这个错误,但是在ubuntu18.04系统里升级发生了这个错误。)
那么请回到zlib解压缩的源码目录下执行以下操作:
1 | make clean |
成功执行完以上操作后,回到openssl的源码目录下再次编译打包。
备份原来的openssl,创建软链接到系统位置
1 | sudo mv /usr/bin/openssl /usr/bin/openssl.bak |
添加openssl的lib库到系统并使用。
1 | sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/openssl.conf |
如果这里因为非root账号修改系统文件权限不够出现以下类似错误:
zsh: permission denied: /etc/ld.so.conf.d/openssl.conf
请这样执行命令:
1 | sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/openssl.conf' |
查看新的openssl版本:
1 | openssl version -a |
更新 openssh
备份原openssh文件,卸载原openssh
1 | sudo mv /etc/init.d/ssh /etc/init.d/ssh.old |
如果卸载openssh-server报错,请检查:
- ssh所有进程是否停止,kill掉所有的ssh进程
1 | 检查ssh进程pid,然后删除 |
- 如果/etc/rc6.d下有/etc/init.d/ssh系统启动文件的软连接,请删除。
回到下载包的目录,依次执行以下命令
1 | 安装依赖包libpam0g-dev |
1 | 检查新的ssh版本 |
完成更新,再恢复原来备份的文件。
1 | cd /etc/ssh |
启动后可以再次用前面的ps命令检查下sshd进程是否启动;如果原来的sshd_config配置中包含了新版本不支持已经被废弃的参数,ssh启动会失败,启动日志里会提示哪些问题,可以参照问题去修改。
比如RSAAuthentication、KeyRegenerationInterval这些参数都已经被新版本废弃了,还有原来配置加密算法的参数Ciphers也可能导致启动失败,注释掉这些重新配置就可以了。
更新好ssh版本,会影响原先所有连接过的客户端。原先连接过的客户端重新连接会报错,提示.ssh/known_hosts文件里的老的某一行连接有问题,删除出错的那一行,然后重新建立新的ssh连接就好了。这是因为ssh升级,老的公钥失效了。
除此之外,如果还无法登陆ssh,检查ssh的status,如下图:
出现错误:
Authentication refused: bad ownership or modes for file /home/chh/.ssh/authorized_keys
sshd为了安全,对属主的目录和文件权限有所要求。请将服务器用户目录下.ssh目录的权限设置为700,该目录下文件权限设置为600.
1 | sudo chmod 600 .ssh/* |