前言

这段时间在腾讯云买了云服务器,本身想着只是私人用,估计没什么人会来攻击,不过前阵子登录腾讯云时突然提醒我有漏洞,吓得赶紧去看了一下。一开始是只有解析整数溢出漏洞,去查了查,发现这个是老版本的OpenSSH漏洞,就没去管。但是到年末突然又多了一个拒绝访问漏洞,这次轮到OpenSSL出问题,最后实在是没忍住,就决定把这两一起解决了。
漏洞名称

OpenSSH与OpenSSL的区别

SSH与SSL

SSH的英文全称是Secure SHell,为建立在应用层基础上的安全协议。通过使用SSH,可以把所有传输的数据进行加密,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。
SSH协议

SSL是一种国际标准的加密及身份认证通信协议,我们现在用的浏览器就支持此协议。SSL(Secure Sockets Layer)最初是由美国Netscape公司研究出来的,后来成为了Internet网上安全通讯与交易的标准。SSL协议使用通讯双方的客户证书以及CA根证书,允许客户/服务器应用以一种不能被偷听的方式通讯,在通讯双方间建立起了一条安全的、可信任的通讯通道。它具备以下基本特征:信息保密性、信息完整性、相互鉴定。 主要用于提高应用程序之间数据的安全系数。SSL协议的整个概念可以被总结为:一个保证任何安装了安全套接字的客户和服务器间事务安全的协议,它涉及所有TCP/IP应用程序。
SSL协议

相同点:
如果按五层协议来划分的话,那SSH与SSL都可以算是应用层协议,他们都使用了非对称加密,将应用层进行了加密,另外,他们其实都是比较基础的应用层协议,即它们上面还可以再放其它应用层协议,如FTP协议等

不同点:
SSH不需要证书,即不需要公证机构(从这点来说,SSH的安全性要比SSH弱一些,貌似SSH无法解决中间人攻击),SSH实现了主机用户名和密码的认证,这是SSH的,SSH-TRANS部分完成的,而SSL没有这个功能

适用场景:
更通俗的说,SSH可以让用户以某个主机用户的身份登录主机,并对主机执行操作(即执行一些命令),目前用的最多的就是远程登录和SFTP(还有简易版的SCP);而SSL和主机用户名登录没有任何关系,它本身并不实现主机登录的功能,它只的一个单纯的加密功能。为了方便理解,可以简单的认为SSH=SSL+主机用户登录功能等应用层协议

OpenSSH与OpenSSL

OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,并由此来代替原来的类似服务。从编译依赖上看:openssh依赖于openssl,没有openssl的话openssh就编译不过去
OpenSSH

OpenSSL是目前比较流行的认证服务器之一是OpenSSL认证服务器,是SSL的开源实现(C语言),是基于会话的、实现了身份认证、数据机密性和会话完整性的TLS/SSL库。它还可以帮我们实现私有证书颁发等功能。OpenSSL项目在EricYoung开发的SSLeay包的基础上,开发一个健壮的、商业等级的、开放源码的工具包用强大的加密算法来实现安全的socket层和传输层安全性。
OpenSSL

OpenSSH XMSS Key 解析整数溢出漏洞

OpenSSH XMSS Key 解析整数溢出漏洞是2019年10月发现的漏洞,XMSS中使用的签名方案是有状态的,这意味着密钥随时间而变化,此过程需要考虑以前保存的“状态”(如果有)。负责处理XMSS保存的“状态”的函数会由于整数溢出漏洞而导致内存破坏。任何可以解析私有XMSS密钥的OpenSSH函数都容易受到攻击。
OpenSSH漏洞影响

网上给出的方案是把OpenSSH升级到8.1及以上的版本,所以我的解决方案就是升级,此次操作是在Centos 8.0系统上把OpenSSH升级到8.4版本。首先远程连接服务器,安装以下的依赖软件包

# 使用yum下载依赖包
yum install wget gcc -y
yum install -y zlib-devel openssl-devel
yum install pam-devel libselinux-devel zlib-devel openssl-devel -y

接下来下载安装包OpenSSH8.4并上传至服务器,或者直接使用下面的wget命令下载。

# 下载源码
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.4p1.tar.gz -O /usr/local/src/openssh-8.4p1.tar.gz

然后删除低版本OpenSSH的的rpm包,运行命令即可

# 卸载旧版OpenSSH(--nodeps参数表示忽略依赖关系)
rpm -e --nodeps `rpm -qa | grep openssh` 

接下来进入刚刚下载压缩包的路径,解压压缩包,然后进入解压后的文件夹

# 压缩包解压
cd /usr/local/src
tar -zxvf openssh-8.4p1.tar.gz
# 切换到源码目录
cd  openssh-8.4p1

在解压后的文件夹中运行下面的命令,配置openssh,运行命令之后会在终端中输出配置情况,等信息输出结束后再进行下一步

# 添加配置信息
 ./configure   --prefix=/usr   --sysconfdir=/etc/ssh    --with-md5-passwords   --with-pam --with-zlib   --with-tcp-wrappers    --with-ssl-dir=/usr/local/ssl   --without-hardening

接着就可以开始编译安装,第一条命令是编译,编译信息会在终端输出,不会耗时太久。第二条命令是安装,安装的过程可能屏幕中会出现若干warming的高亮信息,只要不是error就不用理会

# 执行编译安装
make
make install

安装完成后,输入下面的命令给openssh赋权

# 赋予权限
chmod 600 /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key

复制配置文件并设置允许root用户远程登录。第四行命令即用vim打开配置文件,需要修改的地方如下:

  1. 修改 #PermitRootLogin prohibit-password 项:去掉注释号“#”,并把prohibit-password改为yes,即修改后为 PermitRootLogin yes
  2. 修改 #PasswordAuthentication yes 项:去掉注释号“#”,即修改后为 PasswordAuthentication yes ,注意,如果改成no的话,意思是不允许密码登录
# 赋值配置文件
cp -a contrib/redhat/sshd.init  /etc/init.d/sshd
cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
chmod u+x /etc/init.d/sshd
# 编辑配置文件
vim /etc/ssh/sshd_config 

修改完配置后保存,接着添加自启服务ssh到开机启动项

# 添加开机自启动项
chkconfig --add sshd
chkconfig sshd on

重启服务,然后查看安装结果

# 重启服务
systemctl restart sshd
ssh -V

OpenSSH更新成功

OpenSSL 拒绝服务漏洞

OpenSSL 拒绝服务漏洞是2020年12月新发现的漏洞,OpenSSL官方发布安全公告,披露CVE-2020-1971 OpenSSL GENERAL_NAME_cmp 拒绝服务漏洞。当两个GENERAL_NAME都包含同一个EDIPARTYNAME时,由于GENERAL_NAME_cmp函数未能正确处理,从而导致空指针引用,并可能导致拒绝服务。
OpenSSL漏洞影响

网上给出的方案是把OpenSSL升级到最新版本,所以我的解决方案就是升级,此次操作是在Centos 8.0系统上把OpenSSL升级到1.1.1i版本。首先远程连接服务器,安装以下的依赖软件包

# 下载源码包
wget https://mirrors.cloud.tencent.com/openssl/source/openssl-1.1.1i.tar.gz -O /usr/local/src/openssl-1.1.1i.tar.gz
# 源码编译依赖gcc和perl(5.0版本以上)
yum -y install gcc perl

接着解压压缩包,进入压缩包进行配置,然后源码编译安装,编译安装需要一点时间,一般来说不会报错

# 压缩包解压
cd /usr/local/src
tar xf openssl-1.1.1i.tar.gz
# 切换到源码目录
cd openssl-1.1.1i
# 执行编译
./config --prefix=/usr/local/openssl
./config -t
make && make install

然后删除旧版本的OpenSSL,更新函数库,使用新版OpenSSL,结束后可以查看版本

# 查询旧版OpenSSL
rpm -qa | grep openssl
# 卸载旧版OpenSSL(--nodeps参数表示忽略依赖关系)
rpm -e openssl --nodeps
# 使用新版OpenSSL
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
# 添加函数库
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
# 更新函数库
ldconfig -v
# 检查新版OpenSSL
openssl version -a

OpenSSL更新成功

注意事项:

  1. 系统旧版openssl软件包可以卸载,openssl其他附属软件包不建议卸载
  2. 系统默认安装的openssl-libs不能卸载,否则系统可能会崩溃

参考资料

最后修改:2020 年 12 月 30 日 10 : 49 PM
如果觉得我的文章对你有用,请随意赞赏