重塑网络防线:一文掌握OpenSSH与OpenSSL的高效升级
本文最后更新于 2024-01-26,文章内容可能已经过时。
一、背景
客户漏扫发现一些高危漏洞,基本都是一些OpenSSH安全漏洞,且当前的版本是OpenSSH_7.4p1,OpenSSL 1.0.2k-fips
要求升级到OpenSSH 9.3p2 以上;CVE编号:CVE-2023-38408
本篇教程也同样适用于 centos7 和 openeuler22.03 LTS
二、了解OpenSSH和OpenSSL关系
OpenSSH依赖于OpenSSL,没有OpenSSL的话OpenSSH就运行不了
OpenSSH
SSH 只是一种协议,存在多种实现,既有商业实现,也有开源实现。目前,OpenSSH 是最流行的 SSH 实现,而且成为了大量操作系统的默认组件。OpenSSH 仍在积极维护中,而且已经支持 SSH-2 协议。从 7.6 版开始,OpenSSH 不再支持 SSH-1 协议。
官网:https://www.openssh.com/ 。OpenSSH 主要包含以下工具:
- 客户端工具 ssh、scp、sftp
ssh
: ssh 客户端,是一个用于登录到远程计算机并在远程计算机上执行命令的程序。scp
: 用于在网络上的主机之间复制文件sftp
: 一个文件传输程序,类似于 ftp,它通过加密的 ssh 传输执行所有操作。
- 密钥管理工具 ssh-add、ssh-keysign、ssh-keyscan、ssh-keygen
ssh-add
:用于将私钥标识添加到身份验证代理(ssh-agent)。在没有参数的情况下运行时,它会添加文件 〜/.ssh/id_rsa,〜/.ssh/id_dsa,〜/ .ssh/id_ecdsa,〜/.ssh/id_ecdsa_sk,〜/.ssh/id_ed25519 和 〜/.ssh /id_ed25519_sk。加载私钥后,ssh-add 将尝试从以-cert.pub 结尾的文件中加载相应的证书信息。ssh-keysign
:ssh 使用 ssh-keysign 访问本地主机密钥并生成基于主机身份验证所需的数字签名。默认情况下,该功能是被禁用的,且该程序一般不需要用户调用,而是由ssh
程序自动调用。ssh-keyscan
:用于收集其他主机的公共 SSH 主机键的实用程序。它旨在帮助构建和验证 SSH_KNOKN_HOSTS 文件。ssh-keygen
:OpenSSH 身份验证密钥实用程序
- 服务端工具 sshd、sftp-server、ssh-agent
sshd
:即 OpenSSH Daemon,是 ssh 的守护程序,也即 SSH 的服务端程序。它通过不安全的网络在两个不受信任的主机之间提供安全的加密通信。ssh-agent
:用来保存用于公钥身份验证的私钥。通过使用环境变量,它可以在使用 ssh 登陆其他计算机时,定位并自动处理身份验证。sftp-server
:sftp 服务端程序,用来接收并处理来自 sftp 的连接。改程序通常也不需要由用户调用,而是由 ssh 来调用
详细的介绍及使用方法,可以参考 OpenSSH 官方文档:https://www.openssh.com/manual.html。
OpenSSL
在了解OpenSSL 需要先了解下SSL 协议, 以下内容由chatgpt生成
SSL/TLS(技术标准)
SSL(Secure Sockets Layer):
- SSL 是早期用于保护网络通信的安全协议,由 Netscape 在 1990 年代中期开发。
- 它提供了数据加密、服务器身份验证和数据完整性保护。
- SSL 经历了几个版本的发展,但现在已不再使用,因为它被认为是不安全的。
TLS(Transport Layer Security):
- TLS 是 SSL 的后继者,由互联网工程任务组(IETF)开发。
- TLS 用于替代 SSL,并改进了许多安全性方面的问题。
- 它是目前互联网上用于保护数据传输的主要标准,有多个版本(TLS 1.0, 1.1, 1.2, 1.3等)。
关系总结
- 总的来说,TLS 和 SSL 就是一个东西,TLS 是 SSL 的改进升级。当前使用最多的是 TLS1.2 和 TLS1.3。在实际使用中,仍然有很多文献使用 SSL 这个名字,或者使用 SSL/TLS。实际情况是,SSL3.0 发布至今没有更新过,且被发现了很多漏洞,现在很少使用 SSL3.0 了。
- 关于 SSL/TLS 协议 每部分中详细的定义,可以参考百度百科https://baike.baidu.com/item/%E5%AE%89%E5%85%A8%E5%A5%97%E6%8E%A5%E5%B1%82/9442234
OpenSSL/LibreSSL(具体实现)
OpenSSL:
- OpenSSL 是一个开源项目,提供了一个强大的加密库,支持 SSL 和 TLS 协议。
- 它是实现 SSL/TLS 功能最广泛使用的工具之一,用于构建安全通信的应用程序和服务。
- OpenSSL 包含加密算法、SSL/TLS 协议的实现以及用于创建数字证书的工具。
LibreSSL:
- LibreSSL 是 OpenSSL 的一个分支,由 OpenBSD 项目在 2014 年创建,主要目的是重写和简化 OpenSSL 代码以提高安全性和可维护性。
- 它与 OpenSSL 兼容,但在安全性、代码简洁性和可维护性方面进行了许多改进。
- LibreSSL 的开发重点是为 OpenBSD 提供更安全的 SSL/TLS 实现,但它也可以用于其他操作系统。
关系总结
- SSL/TLS 是网络通信加密的标准,而 OpenSSL 和 LibreSSL 是实现这些标准的软件库。
- OpenSSL 和 LibreSSL 提供了 SSL/TLS 协议的实际实现,允许开发者在应用程序中集成这些安全协议。
- LibreSSL 的出现是对 OpenSSL 安全性和代码质量的一种响应,旨在提供更安全、更现代的替代品。
三、需求
OpenSSH_9.5p1 版本的安装文件里,有对依赖关系做说明 https://github.com/openssh/openssh-portable/blob/master/INSTALL
- 对于Zlib 的要求: Zlib 1.1.4 或 1.2.1.2 或更高版本(较早的1.2.x版本存在问题),https://zlib.net/
- 对于 LibreSSL 或 OpenSSL 的 要求 :LibreSSL(https://www.libressl.org/)3.1.0或更高版本; OpenSSL(https://www.openssl.org)1.1.1或更高版本
查看当前服务器依赖的版本
[root@web ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
[root@sre ~]# rpm -qi zlib-*
Name : zlib
Version : 1.2.7
需要升级以下内容
- 更新OpenSSH至OpenSSH_9.5p1
- 更新OpenSSL至 OpenSSL-1.1.1w
- 更新OpenSSH前先安装telnet-server服务,防止意外发生
四、下载软件包,并上传至服务器
- OpenSSH_9.5p1 https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-9.5p1.tar.gz
- openssl https://www.openssl.org/source/openssl-1.1.1w.tar.gz
五、安装telnet-server服务
- 查看本机是否安装telnet客户端及服务端
[root@sre ~]# rpm -qa | grep telnet
[root@sre ~]# rpm -qa telnet-server
[root@sre ~]# rpm -qa xinetd
如果什么都不显示。说明你没有安装telnet
- yum安装xinetd和telnet-server
xinetd是新一代的网络守护进程服务程序
[root@sre ~]# yum install xinetd telnet telnet-server telnet
- 启动并配置自启动
注意:因为是由xinetd管理,这里启动的是telnet.socket而不是telnet.service
[root@sre ~]# systemctl start telnet.socket
[root@sre ~]# systemctl start xinetd
[root@sre ~]# systemctl enable xinetd
[root@sre ~]# systemctl enable telnet.socket
- 查看服务状态
[root@sre ~]# netstat -tulp|grep telnet
tcp6 0 0 [::]:telnet [::]:* LISTEN 1/systemd
[root@sre ~]# netstat -tunlp|grep 23
tcp6 0 0 :::23 :::* LISTEN 1/systemd
如果看到上述输出则表明telnet-server正常
- 配置PAM模块允许root远程登录
注意: 默认情况下,PAM模块限制root不能telnet到telnet-server
#移除securetty文件
验证规则设置在/etc/security文件中,该文件定义root用户只能在tty1-tty6的终端上记录,删除该文件或者将其改名即可避开验证规则实现root用户远程登录。
【openeuler22.03 LTS 系统中没有此文件,跳过该步骤】
[root@sre ~]# mv /etc/securetty /etc/securetty.bak
六、安装openssl
- 上传openssl-1.1.1w.tar.gz安装包至服务器
- 解压安装包
[root@sre ~]# tar -xvf openssl-1.1.1w.tar.gz
- 安装前环境准备
[root@sre ~]# yum install -y pam* zlib* openssl-devel gcc make
- 进入源码包执行config文件
centos7
[root@sre ~]# cd openssl-1.1.1w
[root@sre openssl-1.1.1w]# ./config --prefix=/usr/local/openssl
openeuler22.03 LTS
如果不携带参数 enable-mdc2 ,可能会遇到EVP_md2 的报错,如ImportError: /usr/lib64/libldap.so.2: undefined symbol: EVP_md2, version OPE
, 影响系统中的python 环境
[root@sre ~]# cd openssl-1.1.1w
[root@sre openssl-1.1.1w]# ./config shared enable-ssl3 enable-ssl3-method enable-mdc2 enable-md2 --prefix=/usr/local/openssl
- 注意: 可能会遇到的报错:
Operating system: aarch64-whatever-linux2
You need Perl 5.
解决方法: yum install perl*
,再重新 ./config --prefix=/usr/local/openssl xxxxxxxxxxxx
- 编译安装
[root@sre ~]# make
[root@sre ~]# make install
- 配置软连接
[root@sre openssl-1.1.1w]# rm -rf /usr/bin/openssl /usr/lib64/libssl.so.1.1 /usr/lib64/libcrypto.so.1.1
[root@sre openssl-1.1.1w]# ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
[root@sre openssl-1.1.1w]# ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
[root@sre openssl-1.1.1w]# ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
- 可能会遇到的报错:
可能遇到的报错信息:提示已存在
将参数换成-b即可
ln -b 是 Linux 系统中 ln 命令的一个选项。ln 命令用于创建文件的硬链接或符号链接。而ln -b 选项表示在创建链接之前,如果已经存在同名的目标文件,则会先备份目标文件
- 验证版本
[root@sre ~]# openssl version
OpenSSL 1.1.1w 11 Sep 2023
七、升级安装OpenSSH_9.5p1
- 解压安装包
[root@sre ~]# tar -xvf openssh-9.5p1.tar.gz
- 备份(man手册不需要备份),重点是备份/etc/pam.d/sshd 文件
[root@sre ~]# whereis ssh sshd
ssh: /usr/bin/ssh /usr/bin/ssh.bak /etc/ssh /etc/ssh.bak /usr/share/man/man1/ssh.1.gz /usr/share/man/man1/ssh.1
sshd: /usr/sbin/sshd /usr/sbin/sshd.bak /usr/share/man/man8/sshd.8.gz /usr/share/man/man8/sshd.8
mv /etc/ssh /etc/ssh.bak
mv /usr/bin/ssh /usr/bin/ssh.bak
mv /usr/sbin/sshd /usr/sbin/sshd.bak
#备份pam验证文件
mv /etc/pam.d/sshd /etc/pam.d/sshd.old
- 编译
[root@sre ~]# cd openssh-9.5p1
[root@sre openssh-9.5p1]# ./configure --prefix=/usr/ --sysconfdir=/etc/ssh --with-openssl-includes=/usr/local/openssl/include --with-ssl-dir=/usr/local/openssl --with-zlib --with-md5-passwords --with-pam
在环境检测的时候,就提示
PAM is enabled. You may need to install a PAM control
,编译时OpenSSH,需要加编译参数 --with-pam在编译时,使用 --with-pam 选项启用了对PAM的支持,但是,编译OpenSSH时并没有编译选项让你指定PAM配置文件的位置,那么我们要怎么提供这个配置文件呢?
事实上,OpenSSH有另外一个编译选项--with-pam-service=name可以指定PAM服务名,它的默认值是sshd,操作系统自带的PAM软件默认将所有PAM配置文件都放置在/etc/pam.d目录下。
结合这两个信息,就可确定OpenSSH的PAM配置文件应为/etc/pam.d/sshd文件。所以/etc/pam.d/sshd 文件一定要提前备份走
- 安装
[root@sre openssh-9.5p1]# make
[root@sre openssh-9.5p1]# rm -rf /usr/lib/systemd/system/sshd.service
[root@sre openssh-9.5p1]# make install
- 恢复ssh pam认证
[root@sre openssh-9.5p1]# mv /etc/pam.d/sshd.old /etc/pam.d/sshd
- 修改SSH配置文件
注意: 允许使用root用户远程登录;使用PAM认证;开启SSH秘钥登录;开启X11Forwarding
cat << EOF | sudo tee -a /etc/ssh/sshd_config
PermitRootLogin yes
UsePAM yes
X11Forwarding yes
PubkeyAuthentication yes
EOF
- 配置systemd管理
[root@sre openssh-9.0p1]# cp -a contrib/redhat/sshd.init /etc/init.d/sshd
[root@sre openssh-9.0p1]# chkconfig --add sshd
[root@sre openssh-9.0p1]# systemctl enable sshd
[root@sre openssh-9.0p1]# systemctl restart sshd
- 查看升级后版本
[root@sre ~]# ssh -V
OpenSSH_9.5p1, OpenSSL 1.1.1w 11 Sep 2023
- 使用SSH客户端登录
[root@sre ~]# ssh root@172.16.10.137
Last login: Mon Sep 12 23:35:00 EDT 2022 on pts/3
[root@sre ~]#
八、升级后关闭telnet-server服务
- 关闭telnet-server并取消自启动
[root@sre ~]# systemctl stop telnet.socket
[root@sre ~]# systemctl stop xinetd
[root@sre ~]# systemctl disable xinetd
[root@sre ~]# systemctl disable telnet.socket
九、其他&注意事项
- 使用root用户登录系统,使用pam认证,需要修改文章中对应的配置文件
- /etc/pam.d/sshd pam 的配置文件,一定要备份
- 如果升级后limit 始终为1024,很有可能是pam 没有配置好,可以参考https://www.jianshu.com/p/db918237644a
centos7.9.2009
操作系统的OpenSSH属实有点低了,如果后续依旧使用这个操作系统,可以在部署前先做OpenSSH的安全加固,升级等操作
十、参考
- 感谢你赐予我前进的力量