1.前言

  • 因服务器安全漏洞扫描,需要更新openssl和openssh的版本,防止漏洞
  • 升级这个玩意真的要特别小心,一不小心就是服务器瘫痪,所以一定要确定好telnet能够连接到服务器,才去弄,如果没有备用连接方式,就有很大的风险了

2. 准备好基础依赖

  1. yum -y install telnet telnet-server xinetd gcc gcc-c++ zlib zlib-devel

3. 安装telnet

因为我们要升级openssh,防止升级失败,或者升级异常,需要安装telnet,以备后患,如果openssh出现问题,则可以通过telnet连接服务器

3.1 安装

  1. # 启动xinetd服务
  2. systemctl start xinetd
  3. systemctl status xinetd
  4. systemctl enable xinetd
  5. # 启动telnet服务
  6. systemctl start telnet.socket
  7. systemctl status telnet.socket
  8. systemctl enable telnet.socket
  9. # 开启ssh访问
  10. echo "pts/0" >> /etc/securetty
  11. echo "pts/1" >> /etc/securetty
  12. # 关闭seliunx
  13. sudo setenforce 0
  14. sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

3.2 修改配置

修改配置,注释相关配置使可以root登陆

  • /etc/pam.d/login

image.png

  • /etc/pam.d/remote

image.png

3.3 重启服务

重启服务后,不出意外就可以telnet登陆服务器了

  1. systemctl restart xinetd
  2. systemctl restart telnet.socket

3.4 telnet登陆

  1. 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 卸载旧版本

  1. rpm -qa |grep openssl
  2. for i in $(rpm -qa |grep openssl);do rpm -e $i --nodeps ;done

3.2 编译安装

  1. cd /work/temp/openssl-1.1.1m
  2. ./config shared
  3. make && make install
  4. echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
  5. ldconfig
  6. mv /usr/bin/openssl /usr/bin/openssl.old
  7. mv /usr/include/openssl /usr/include/openssl.old
  8. ln -s /usr/local/bin/openssl /usr/bin/openssl
  9. ln -s /usr/local/include/openssl/ /usr/include/openssl
  10. ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
  11. ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
  12. echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
  13. ldconfig -v # 设置生效
  14. 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 卸载旧版本

  1. rpm -qa |grep openssh
  2. for i in $(rpm -qa |grep openssh);do rpm -e $i --nodeps ;done

4.2 编译安装

  1. cd /work/temp/openssh-8.8p1
  2. ./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-hardening
  3. rm -rf /etc/ssh
  4. make && make install

4.3 执行配置

  1. cp -r ./contrib/redhat/sshd.init /etc/init.d/sshd
  2. # 添加服务
  3. chkconfig --add sshd
  4. # 开启服务
  5. chkconfig sshd on
  6. # 查看服务
  7. chkconfig --list|grep sshd
  8. # 查看版本
  9. ssh -V
  10. # 开启登陆访问
  11. sed -i "32 aPermitRootLogin yes" /etc/ssh/sshd_config
  12. # 配置加密算法,如不配置,堡垒机等会登陆不上
  13. echo 'HostKeyAlgorithms rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed25519,ssh-rsa,ssh-dss' >> /etc/ssh/sshd_config
  14. echo 'Protocol 2' >> /etc/ssh/sshd_config
  15. systemctl 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. # 在具有正常1.0版本的同版本机器:
  2. scp libcrypto.so.1.0.2k <目标机器>/lib64/
  3. scp libssl.so.1.0.2k <目标机器>/lib64/
  4. # 在问题机器上恢复链接
  5. cd /lib64/
  6. ls -l libcrypto.*
  7. ln -sf libssl.so.1.0.2k libssl.so.10
  8. ln -sf libcrypto.so.1.0.2k libcrypto.so.10

5.3 解决办法2

这个解决办法也是抄袭过来的,终极解决办法,通过telnet来传输文件,当然这个文件只能是字符串,所以,我们传输的文件要经过base64处理

  • 存在文件服务器

    执行 python脚本

  1. import socket
  2. import base64
  3. # port和filename根据实际情况可以修改为适合你的
  4. port = 10005
  5. filename = 'libcrypto.so.1.0.1e'
  6. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  7. sock.bind(('0.0.0.0', port))
  8. sock.listen(5)
  9. while True:
  10. connection,address = sock.accept()
  11. try:
  12. content = 'hello'
  13. f = file(filename)
  14. content = base64.b64encode(f.read())
  15. connection.sendall(content.strip())
  16. connection.close()
  17. except socket.timeout:
  18. print 'time out'
  19. connection.close()
  • 丢失文件的服务器

    这里的ip和端口,则就是存在服务器的ip和python脚本中监听的端口

  1. # 获取内容
  2. telnet ip 10005 |tee > temp.txt
  3. # 去掉telnet创建连接的前3行多余内容去掉
  4. tail -n +4 temp.txt > temp2.txt
  5. # 文件解码回来
  6. base64 -d < temp2.txt |tee >libcrypto.so.1.0.1e.so
  • 修复

    下载好我们需要的文件后,我们把文件复制到/lib64文件夹下,创建软连接

  1. ln -sf libssl.so.1.0.2k libssl.so.10
  2. ln -sf libcrypto.so.1.0.2k libcrypto.so.10
  • 动态库文件附件(需要更改后缀为zip)

lib.zip