暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

OpenSSH升级(OpenSSH_7.4p1到9.0p1)

IT那活儿 2023-06-25
6455

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!




升级背景



通过绿盟漏洞扫描工具检测OpenSSH 输入验证错误漏洞(CVE-2019-16905)、OpenSSH 安全漏洞(CVE-2021-28041)、OpenSSH安全漏洞(CVE-2021-41617)、OpenSSH 命令注入漏洞(CVE-2020-15778),现要求修复该漏洞。

解决方法

  • OpenSSH升级到最新版本。

环境信息操作系统

  • Centos7自身版本为OpenSSH_7.4p1, OpenSSL 1.0.2k-fips。

  • Centos7 发行版自带的openssh版本为7.4p1,存在已知漏洞,需升级至最新版本。

OpenSSH下载地址:
https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/
OpenSSL下载地址:
https://ftp.openssl.org/source/old/

注意事项:

1)检查防火墙是否关闭。

2)更新前可以多开1个或1个以上ssh终端,一旦更新失败,当前shell终端是无法操作的,也就无法进行版本回退。

3)升级前一定要对ssh进行备份,避免更新失败时能回滚。

4)升级前一定要提前在测试环境验证,运行一段时间后确认没有问题才可在生产环境进行更新操作。

5)对于生产环境主机数量比较多时,建议先在多台服务器上更新,运行一段时间,确认没有问题再执行批量更新操作。

6)升级完不要立马关闭会话框,要先验证,预防下次进来的时候进不来

7)升级OpenSSH存在不稳定性,不同服务器环境可能出现的问题不同,升级过程中具体问题需具体分析。

8)升级OpenSSH后免密登录密钥失效,需重新生成密钥并上传到要免密登录的服务器当中。

由于升级OpenSSH会带来一些不必要及不可预料的问题,如:无法远程连接、个别功能不可用、防暴力破解失效等等,如非必要尽可能不要做升级操作,若必须升级,一定要在自己的虚拟环境下反复测试验证几遍,确保无问题后再上生产操作,尽可能的降低升级风险。



准备工作



OpenSSH升级到9.0p1版本,OpenSSL升级到1.1.1q。

1. 查看系统版本和SSH版本(CentOS 7.8)

cat etc/redhat-release

升级前查看当前操作系统的openssl的版本是多少,若在漏洞范围内则确定本次需升级。

  • # 查看当前openssl版本

    openssl version

  • # 查看当前openssh版本

    ssh -V

  • #设置0秒内用户无操作不会断开连接

    export TMOUT=0

2. 安装编译需要的依赖包,如有请忽略

依赖环境需在安装openssl、openssh前进行安装,否则后续安装时会覆盖已经安装好的openssl。

yum -y install gcc gcc-c++ kernel-devel perl pam-devel zlib-devel openssl-devel

3. 检查是否开启telnet服务(如没有该服务,则进行第四步)

systemctl status telnet.socket

systemctl status xinetd

  • #查看telnet端口使用启用(telnet默认端口:23)

    netstat -nap |grep 23

  • #如果防火墙关闭23端口,开启23端口

    firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="IP地址" port protocol="tcp" port="23" accept'

4. 安装telnet服务(预处理防止升级过程中连接中断)

yum -y install xinetd telnet telnet-server

5. 重启服务

systemctl start telnet.socket

systemctl start xinetd

测试一下telnet是否可以正常连上。

远程登录 telnet IP。

输入用户和密码 查看是否能登陆成功。




升级OpenSSL



1. 准备安装包上传到指定路径

openssl-1.1.1q.tar.gz

openssh-9.0p1.tar.gz

#查看文件是否上传成功。

II

2. 解压OpenSSL文件

1)备份

mv /usr/bin/openssl usr/bin/openssl.bak

2)解压文件并进入该目录

tar -xvf openssl-1.1.1q.tar.gz

cd openssl-1.1.1q

3. 编译安装OpenSSL

./config shared && make && make install

配置软链接:

ln -s usr/local/bin/openssl usr/bin/openssl

ln -s usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1

ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

#运行top命令监视进程和Linux整体性能,另起一个窗口进行查看(防止升级过程中会话中断无法连接服务器)。

top


4. 查看OpenSSL的版本

openssl version




升级OpenSSH



1. 解压OpenSSH文件

1)备份(避免更新失败时能回滚)

cp /etc/pam.d/sshd /etc/pam.d/sshd.bak

mkdir /opt/ssh.bin.bak

mv /usr/bin/ssh* /opt/ssh.bin.bak/

mkdir /etc/ssh.bak

mv -f /etc/ssh/* /etc/ssh.bak/

2)解压并进入该目录

cd

tar -xvf openssh-9.0p1.tar.gz

cd openssh-9.0p1


2. 编译安装OpenSSH

(如果出现编译报错,则将/etc/ld.so.conf文件中的/usr/local/openssl/lib行注释掉,添加一行/usr/local/lib64,然后执行ldconfig)

./configure --prefix=/usr/ --sysconfdir=/etc/ssh --with-ssl-
dir=/usr/local/lib64/ --with-zlib --with-pam --with-md5-
password --with-ssl-engine --with-selinux && make && make install

选项说明:

--prefix:指定编译输出路径;

--with-zlib:表示指定先前编译的zlib库存放路径;

--with-ssl-dir:表示上面交叉编译的openssl库存放路径;

--with-ssl-engine 启用硬件引擎支持;

--with-pam 启用pam,需要安装pam和pam-devel包;

--with-selinux 激活selinux支持;

--with-md5-passwords 允许使用md5密码。

3. 在解压包中拷贝文件

cp -a contrib/redhat/sshd.init /etc/init.d/sshd

4. 移走以前的ssh服务, 防止与新的冲突

ll /usr/lib/systemd/system/sshd.s*

mv /usr/lib/systemd/system/sshd.service /etc/ssh.bak/sshd.service

mv /usr/lib/systemd/system/sshd.socket /etc/ssh.bak/sshd.socket

# 重新启动(CentOS 6为chkconfig daemon-reload)

systemctl daemon-reload

/etc/init.d/sshd restart

5. 修改SSH配置

vi /etc/ssh/sshd_config

修改或配置:

  • PermitRootLogin no (禁止root用户登录)

  • UsePAM yes (表示 sshd 信任客户端提供的主机名而不进行反向查询)

6. 若登录时提示加密算法不支持,则升级crt版本或添加如下配置

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

cat >>/etc/ssh/sshd_config <<EOF

KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-
nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-
hellman-group-exchange-sha256,diffie-hellman-group14-
sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1 EOF

7. 重启SSH

/etc/init.d/sshd restart

8. 查看OpenSSH的版本

ssh -V

9. 关闭telnet 服务(第二天后确认对业务没影响后进行)

systemctl stop telnet.socket

systemctl stop xinetd

#验证成功之后,需要关闭telnet服务,因为不安全由于telnet是明文传输,不安全,所以升级完成后,必须停止该服务

为防止后续还会升级OpenSSH,以上验证通过后关闭telnet连接即可,无需卸载。



版本回退



/etc/init.d/sshd stop

mv /etc/ssh.bak/sshd.socket /usr/lib/systemd/system/sshd.socket

mv /etc/ssh.bak/sshd.service /usr/lib/systemd/system/sshd.service

mv /etc/init.d/sshd /etc/init.d/sshd.bak

rm /usr/bin/openssl

rm /usr/lib64/libssl.so.1.1

rm /usr/lib64/libcrypto.so.1.1

mv /usr/bin/openssl.bak /usr/bin/openssl

mv -f /opt/ssh.bin.bak/* /usr/bin/

mv -f /etc/ssh.bak/* /etc/ssh/

systemctl daemon-reload

systemctl restart sshd

1. OpenSSH功能验证

需验证 ssh scp xftp 等是否可用。

1)验证ssh

# 使用ssh工具远程连接已经升级openssh的服务器,若可连接则代表此功能正常。

2)验证scp

  • 在升级openssh的服务器创建测试文件test.txt

    touch test.txt

  • 使用scp将测试文件上传到已经做过免密登录的服务器上

    scp test.txt root@IP地址:/usr/local

    若上传成功则代表该功能正常。

3)验证sshd是否会不断重启,查看登录时间(ssh连接不稳定,时断时续)

systemctl status sshd

4)验证xftp

打开xftp工具,使用升级openssh的服务器用户名密码,点击连接,若连接成功则代表该功能正常。

2. 可能碰到的问题

1)/etc/init.d/sshd restart之后报错

解决办法:

Reloading systemd: [ 确定 ]

Restarting sshd (via systemctl): Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.

是selinux导致,需要关闭

#临时修改

setenforce 0

#永久修改

sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

#重启

/etc/init.d/sshd restart

2)service sshd start 命令无法使用,提示:extra arguments

解决办法:

将/etc/init.d/sshd还原成之前的(之前做过的备份)。

3)service sshd restart无法成功

解决办法:

/usr/lib/systemd/system/sshd.service 这个文件删掉或拷贝出来。

4)ssh连接不稳定,时断时续

  • #查看/var/log/message里不断提示sshd.service holdoff time over,scheduling restart

  • systemctl status sshd查看服务状态为activating(start)

原因:/usr/lib/systemd/system/sshd.service 与 systemd不兼容。

cd /usr/lib/systemd/system

mv sshd.service sshd.service.bak

systemctl daemon-reload

#查看/var/log/message里sshd有没有继续报错:

systemctl restart sshd

3. 相关理论知识

OpenSSH: 

OpenSSH 是使用 SSH 协议进行远程登录的连接工具。它加密所有通信讯息以消除窃听、连接劫持和其他攻击。此外,OpenSSH 提供了大量的安全隧道功能、多种身份验证方法和复杂的配置选项。

OpenSSL(ssl协议和加密解密库的实现):

OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

OpenSSL 是一个开源的软件库,使用包含了众多加解密算法,用于传输层安全性 (TLS) 和安全套接字层 (SSL) 协议的强大、商业级和功能齐全的工具包。

OpenSSL 中包含了绝大多数密码算法,在 1.1.1 版本后支持了国密算法SM2、SM3以及SM4。


END


本文作者:黄国庆(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论