点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!
解决方法:
OpenSSH升级到最新版本。
环境信息操作系统:
Centos7自身版本为OpenSSH_7.4p1, OpenSSL 1.0.2k-fips。
Centos7 发行版自带的openssh版本为7.4p1,存在已知漏洞,需升级至最新版本。
注意事项:
1)检查防火墙是否关闭。
2)更新前可以多开1个或1个以上ssh终端,一旦更新失败,当前shell终端是无法操作的,也就无法进行版本回退。
3)升级前一定要对ssh进行备份,避免更新失败时能回滚。
4)升级前一定要提前在测试环境验证,运行一段时间后确认没有问题才可在生产环境进行更新操作。
5)对于生产环境主机数量比较多时,建议先在多台服务器上更新,运行一段时间,确认没有问题再执行批量更新操作。
6)升级完不要立马关闭会话框,要先验证,预防下次进来的时候进不来
7)升级OpenSSH存在不稳定性,不同服务器环境可能出现的问题不同,升级过程中具体问题需具体分析。
8)升级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。
输入用户和密码 查看是否能登陆成功。



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

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是明文传输,不安全,所以升级完成后,必须停止该服务。
/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。

本文作者:黄国庆(上海新炬中北团队)
本文来源:“IT那活儿”公众号





