1.前言
- 因服务器安全漏洞扫描,需要更新openssl和openssh的版本,防止漏洞
- 升级这个玩意真的要特别小心,一不小心就是服务器瘫痪,所以一定要确定好telnet能够连接到服务器,才去弄,如果没有备用连接方式,就有很大的风险了
2. 准备好基础依赖
yum -y install telnet telnet-server xinetd gcc gcc-c++ zlib zlib-devel
3. 安装telnet
因为我们要升级openssh,防止升级失败,或者升级异常,需要安装telnet,以备后患,如果openssh出现问题,则可以通过telnet连接服务器
3.1 安装
# 启动xinetd服务systemctl start xinetdsystemctl status xinetdsystemctl enable xinetd# 启动telnet服务systemctl start telnet.socketsystemctl status telnet.socketsystemctl enable telnet.socket# 开启ssh访问echo "pts/0" >> /etc/securettyecho "pts/1" >> /etc/securetty# 关闭seliunxsudo setenforce 0sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
3.2 修改配置
修改配置,注释相关配置使可以root登陆
- /etc/pam.d/login

- /etc/pam.d/remote
3.3 重启服务
重启服务后,不出意外就可以telnet登陆服务器了
systemctl restart xinetdsystemctl restart telnet.socket
3.4 telnet登陆
telnet ip
3. 安装openssl
这里我们采用的版本为openssl-1.1.1m.tar.gz版本,可以直接从官网下载,下载地址为https://www.openssl.org/source/openssl-1.1.1m.tar.gz openssl-1.1.1m(tar.gz).zip
3.1 卸载旧版本
rpm -qa |grep opensslfor i in $(rpm -qa |grep openssl);do rpm -e $i --nodeps ;done
3.2 编译安装
cd /work/temp/openssl-1.1.1m./config sharedmake && make installecho "/usr/local/ssl/lib" >> /etc/ld.so.confldconfigmv /usr/bin/openssl /usr/bin/openssl.oldmv /usr/include/openssl /usr/include/openssl.oldln -s /usr/local/bin/openssl /usr/bin/opensslln -s /usr/local/include/openssl/ /usr/include/opensslln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1echo "/usr/local/ssl/lib" >> /etc/ld.so.confldconfig -v # 设置生效openssl version
4.安装openssh
这里我们采用的版本为openssh-8.8p1.tar.gz,下载地址为http://mirror.internode.on.net/pub/OpenBSD/OpenSSH/portable/openssh-8.8p1.tar.gz openssh-8.8p1(tar.gz).zip
4.1 卸载旧版本
rpm -qa |grep opensshfor i in $(rpm -qa |grep openssh);do rpm -e $i --nodeps ;done
4.2 编译安装
cd /work/temp/openssh-8.8p1./configure --without-openssl-header-check --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords--with-pam --with-tcp-wrappers --with-ssl-dir=/usr/local/ssl --without-hardeningrm -rf /etc/sshmake && make install
4.3 执行配置
cp -r ./contrib/redhat/sshd.init /etc/init.d/sshd# 添加服务chkconfig --add sshd# 开启服务chkconfig sshd on# 查看服务chkconfig --list|grep sshd# 查看版本ssh -V# 开启登陆访问sed -i "32 aPermitRootLogin yes" /etc/ssh/sshd_config# 配置加密算法,如不配置,堡垒机等会登陆不上echo 'HostKeyAlgorithms rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed25519,ssh-rsa,ssh-dss' >> /etc/ssh/sshd_configecho 'Protocol 2' >> /etc/ssh/sshd_configsystemctl restart sshd
5.升级后导致的问题
因升级oepnssl1.1.1后导致丢失相关动态库,如libssl.so.1.0.2k、libcrypto.so.1.0.2k、libcrypt-2.17.so ,丢失这些动态库,会影响系统的正常工作,比如网卡、curl、wget、ssh都不能正常工作
5.1解决办法1
- 在一台有openssl1.0的机器上,复制好这三个动态库,然后复制到损坏的服务器的/lib64机器上或者查看/usr/lib64文件夹是否有对应的动态库,然后在挂载软连接修复
- 如果此时此刻,所有的文件上传下载功能全部瘫痪,我们则可以在升级openssl前,先挂在好nfs网络盘,以防万一
# 在具有正常1.0版本的同版本机器:scp libcrypto.so.1.0.2k <目标机器>/lib64/scp libssl.so.1.0.2k <目标机器>/lib64/# 在问题机器上恢复链接cd /lib64/ls -l libcrypto.*ln -sf libssl.so.1.0.2k libssl.so.10ln -sf libcrypto.so.1.0.2k libcrypto.so.10
5.3 解决办法2
这个解决办法也是抄袭过来的,终极解决办法,通过telnet来传输文件,当然这个文件只能是字符串,所以,我们传输的文件要经过base64处理
- 存在文件服务器
执行 python脚本
import socketimport base64# port和filename根据实际情况可以修改为适合你的port = 10005filename = 'libcrypto.so.1.0.1e'sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind(('0.0.0.0', port))sock.listen(5)while True:connection,address = sock.accept()try:content = 'hello'f = file(filename)content = base64.b64encode(f.read())connection.sendall(content.strip())connection.close()except socket.timeout:print 'time out'connection.close()
- 丢失文件的服务器
这里的ip和端口,则就是存在服务器的ip和python脚本中监听的端口
# 获取内容telnet ip 10005 |tee > temp.txt# 去掉telnet创建连接的前3行多余内容去掉tail -n +4 temp.txt > temp2.txt# 文件解码回来base64 -d < temp2.txt |tee >libcrypto.so.1.0.1e.so
- 修复
下载好我们需要的文件后,我们把文件复制到/lib64文件夹下,创建软连接
ln -sf libssl.so.1.0.2k libssl.so.10ln -sf libcrypto.so.1.0.2k libcrypto.so.10
- 动态库文件附件(需要更改后缀为zip)
