CentOS7升级openssh

2021年7月4日 1点热度 0条评论

升级版本的原因,是安全漏洞扫描出了高危漏洞;

漏洞的描述大概是这么个意思:

  服务器本身运行的openssh服务版本低,并且开启了scp,需要升级最新版(最新版居然也解决不了scp的问题);

  同时需要禁用scp,可以临时开启rsync来替代(其实就关闭scp就完事了rsync也不开了...,不过若有需求则需要开启,本篇主要是ssh和ssl升级);

 

起初由于是外地机房,为了防止出现问题,是负责机房硬件维护的人员进行的openssh升级并卸载了scp,虽然顺利升级,但是在复查时,这个问题居然没有修复;

在询问了几位安全人员这个问题原因后,被告知,这个问题没有修复并不在openssh上面,而是在openssl上面(问题在openssl上,只不过扫描只能告诉你是openssh的问题);

升级openssh是需要一起升级openssl的,并要求新的openssh使用新的openssl;

(硬件维护并不是我司的专职人员,时间比较紧,那么我就自己动手吧...)

 

整体流程是这样的:

      1、配置并开启telnet ↓

      2、升级openssl ↓

      3、升级openssh (顺便处理scp的安全问题,直接给卸载喽)↓

      4、关闭telnet相关设置

 

这个telnet比较重要奥,因为我们要动的是openssh,也就是sshd的服务会动,万一你出错了,对于远程操作的我来说就是致命的,只能跑到机房处理了;

配置并开启telnet

保证在没有sshd服务正常运行的情况下,依然可以远程连接到服务器进行操作(用完记得关掉)

    ##yum 来安装服务,没有外网情况请使用rpm包安装
[root@postgreSQL ~]# yum install -y xinetd telnet-server

 

我们的升级软件需要root的权限,我这里是直接登录root用户进行操作(用完记得将这些配置清除);

而安装完成后默认是不允许登录的,你连接可以,但是当输入密码后,会一直提示你输入密码;

这里我们需要配置一下,允许root用户连接;

 ##直接vi或vim打开文件,一般这个文件安装过后是没有的
[root@postgreSQL ~]# vim /etc/xinetd.d/telnet
service telnet { disable = yes
    flags       = REUSE
    socket_type = stream
    wait        = no
    user        = root
    server      = /usr/sbin/in.telnetd
    log_on_failure  += USERID }

 ##配置允许root用户登录后,其实也不能登录,需要再配置另一个文件; ## /etc/securetty 是设置 root 用户允许从哪个设备登录 ## 直接添加到最后面就可以
[root@postgreSQL ~]# vim /etc/securetty
... ... ... ... pts/0
pts/1
pts/2
pts/3

 

配置之后,我们尝试使用telnet来连接到服务器;

 ##开启xinetd
[root@postgreSQL ~]# systemctl start xinetd
[root@postgreSQL ~]# systemctl status xinetd
● xinetd.service - Xinetd A Powerful Replacement For Inetd
   Loaded: loaded (/usr/lib/systemd/system/xinetd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-07-03 14:58:24 CST; 36s ago
  Process: 1480 ExecStart=/usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid $EXTRAOPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 1481 (xinetd)
   CGroup: /system.slice/xinetd.service
           └─1481 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid

Jul 03 14:58:24 postgreSQL xinetd[1481]: removing discard
Jul 03 14:58:24 postgreSQL xinetd[1481]: removing discard ... ... ... ...

 ##开启telnet,如果提示你找不到服务什么的,记得加后面 .socket
[root@postgreSQL ~]# systemctl start telnet.socket
[root@postgreSQL ~]# systemctl status telnet.socket
● telnet.socket - Telnet Server Activation Socket
   Loaded: loaded (/usr/lib/systemd/system/telnet.socket; disabled; vendor preset: disabled)
   Active: active (listening) since Sat 2021-07-03 14:59:12 CST; 17s ago
     Docs: man:telnetd(8)
   Listen: [::]:23 (Stream)
 Accepted: 0; Connected: 0

Jul 03 14:59:12 postgreSQL systemd[1]: Listening on Telnet Server Activation Socket.


 ##以防万一,设置下开机启动
[root@postgreSQL ~]# systemctl enable xinetd
[root@postgreSQL ~]# systemctl enable telnet.socket

[root@postgreSQL ~]# systemctl is-enabled xinetd
enabled
[root@postgreSQL ~]# systemctl is-enabled telnet.socket
enabled

 

尝试登录(我使用Xshell,登录时把开头 ssh 换为 telnet );

登录成功后,就可以保证在没有sshd运行的情况下,依然可以连接到服务器了;

Xshell 7 (Build 0073)
Copyright (c) 2020 NetSarang Computer, Inc. All rights reserved.

Type `help' to learn how to use Xshell prompt.
[C:\~]$ telnet 192.168.1.90


Connecting to 192.168.1.90:23...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Kernel 3.10.0-1160.el7.x86_64 on an x86_64
postgreSQL login: root
Password: 
Last failed login: Sat Jul  3 15:06:27 CST 2021 from ::ffff:192.168.1.10 on pts/1
There was 1 failed login attempt since the last successful login.
Last login: Sat Jul  3 14:34:52 from 192.168.1.10
[root@postgreSQL ~]# 

 

 

--返回目录--

 

 

升级openssl

我们先来看看当前的情况:

    ##ssl的版本是1.0.2k
[root@postgreSQL ~]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

    ##当前ssh版本为OpenSSH_7.4p1,使用的ssl是1.0.2k
    ##我们当前时间最新的版本为 openssh-8.6p1 和 openssl-1.1.1k
[root@postgreSQL ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

    ##当前 scp 是可执行的命令
[root@postgreSQL ~]# scp
usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2

 

升级openssl并重新编译Nginx - 感觉不妥 - 博客园 (cnblogs.com)

这个是我之前在处理TLS相关的安全漏洞时升级openssl写的一篇,其目的是使nginx可以使用符合要求的TLS版本;

但当时是我第一次升级openssl,当时安装并没有指定安装路径,导致了一堆问题(顺便都处理了);

这次我依然使用不指定路径的方式来安装,因为之后在安装openssh的时候,其中的参数有一些问题,没有写对,是会报错的;

(报错了,你才会去了解,这些参数需要的是什么值)

 ##简单写一下openssl升级的命令,详细一点可以看下上面的连接 ##安装依赖包
[root@postgreSQL ~]# yum -y install perl perl-devel gcc gcc-c++ wget ##下载openssl的软件包
[root@postgreSQL ~]# wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz

    ##解压包,可以 -C 来指定一个目录位置,方便管理
[root@postgreSQL ~]# tar -xvf openssl-1.1.1k.tar.gz

    ##编译安装,如果想,可以添加 --prefix= 来指定路径
    ##执行后会生成一些文件,默认为当前目录
    ##所以要先cd一下,否则当前目录会生成很多文件
[root@postgreSQL ~]# cd openssl-1.1.1k
[root@postgreSQL openssl-1.1.1k]# ./config
[root@postgreSQL openssl-1.1.1k]# make && make install

    ##解决一些链接库的问题
[root@postgreSQL openssl-1.1.1k]# ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/
[root@postgreSQL openssl-1.1.1k]# ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/
[root@postgreSQL openssl-1.1.1k]# cp -a libssl.a /usr/local/lib/
[root@postgreSQL openssl-1.1.1k]# cp -a libcrypto.a /usr/local/lib/

    ##查看版本
[root@postgreSQL openssl-1.1.1k]# openssl version
OpenSSL 1.1.1k  25 Mar 2021
[root@postgreSQL openssl-1.1.1k]# which openssl
/usr/local/bin/openssl

    ##若版本不是新版,需要替换旧版
[root@postgreSQL openssl-1.1.1k]# which openssl
/usr/bin/openssl
[root@postgreSQL openssl-1.1.1k]# cd /usr/bin/
[root@postgreSQL bin]# mv openssl openssl102
[root@postgreSQL bin]# ln -s /usr/local/bin/openssl openssl

    ##卸载旧版本
[root@postgreSQL bin]# yum erase -y openssl

此刻你便拥有了新版的openssl。

 

 

--返回目录--

 

 

升级openssh

官方下载地址:http://www.openssh.com/portable.html

根据自己的需要下载版本;

 ##下载安装包,我直接wget下了 ##找自己需要的版本,地址替换即可
[root@postgreSQL ~]# wget https://ftp.spline.de/pub/OpenBSD/OpenSSH/portable/openssh-8.6p1.tar.gz

    ##解压包
[root@postgreSQL ~]# ls -lh openssh-8.6p1.tar.gz 
-rw-r--r-- 1 root root 1.8M Apr 19 07:07 openssh-8.6p1.tar.gz
[root@postgreSQL ~]# tar -xvf openssh-8.6p1.tar.gz

 

接下来我没清理一下旧版本的软件及各种配置文件;

 ##查看下当前服务
[root@postgreSQL ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-07-03 22:31:21 CST; 6h left
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 936 (sshd)
   CGroup: /system.slice/sshd.service ... ... ... ...

 ##删除原有配置文件
[root@postgreSQL ~]# cd /etc/
[root@postgreSQL etc]# rm -fr ssh

    ##卸载旧版本
[root@postgreSQL etc]# rpm -qa | grep openssh-*
openssh-clients-7.4p1-21.el7.x86_64
openssh-7.4p1-21.el7.x86_64
openssh-server-7.4p1-21.el7.x86_64
[root@postgreSQL etc]# systemctl stop sshd
[root@postgreSQL etc]# yum erase -y openssh-clients openssh-server openssh

    ##完成卸载
[root@postgreSQL etc]# ssh -v
-bash: /bin/ssh: No such file or directory

 

这里插一段,先说一下编译安装时的两个参数:

--with-openssl-includes=/usr/local/include

指定路径错误会报:configure: error: OpenSSL library not found.

    ##由于之前我的openssl的安装没有指定目录,其会直接安装到 /usr/local 下
[root@postgreSQL openssl]# cd /usr/local/
[root@postgreSQL local]# ls bin etc games include lib lib64 libexec sbin share src ssl

 ##这里的 include 便是我们安装的新版的 openssl 的运行文件; ##我们使用编译安装都需要 gcc gcc-c++ ,它们使用的是C C++ ,这些是运行需要的头文件; ##我暂时不会C语言,也只是看相关帖子说明事大概这么个意思; ##这里需要知道的,就是我们要指定我们新安装的openssl的目录即可;
[root@postgreSQL openssh-8.6p1]# cd /usr/local/include
[root@postgreSQL include]# ls
openssl
[root@postgreSQL include]# cd openssl/
[root@postgreSQL openssl]# ls
aes.h        cms.h        ecdsa.h      modes.h        rand.h       store.h
asn1err.h    comperr.h    ecerr.h      objectserr.h   rc2.h        symhacks.h
asn1.h       comp.h       ec.h         objects.h      rc4.h        tls1.h
asn1_mac.h   conf_api.h   engineerr.h  obj_mac.h      rc5.h        tserr.h
asn1t.h      conferr.h    engine.h     ocsperr.h      ripemd.h     ts.h
asyncerr.h   conf.h       e_os2.h      ocsp.h         rsaerr.h     txt_db.h
async.h      cryptoerr.h  err.h        opensslconf.h  rsa.h        uierr.h
bioerr.h     crypto.h     evperr.h     opensslv.h     safestack.h  ui.h
bio.h        cterr.h      evp.h        ossl_typ.h     seed.h       whrlpool.h
blowfish.h   ct.h         hmac.h       pem2.h         sha.h        x509err.h
bnerr.h      des.h        idea.h       pemerr.h       srp.h        x509.h
bn.h         dherr.h      kdferr.h     pem.h          srtp.h       x509v3err.h
buffererr.h  dh.h         kdf.h        pkcs12err.h    ssl2.h       x509v3.h
buffer.h     dsaerr.h     lhash.h      pkcs12.h       ssl3.h       x509_vfy.h
camellia.h   dsa.h        md2.h        pkcs7err.h     sslerr.h
cast.h       dtls1.h      md4.h        pkcs7.h        ssl.h
cmac.h       ebcdic.h     md5.h        rand_drbg.h    stack.h
cmserr.h     ecdh.h       mdc2.h       randerr.h      storeerr.h

 

--with-ssl-dir=/usr/local/bin

指定路径错误会报:configure: error: *** working libcrypto not found, check config.log

 ##这个参数需要你指定openssl的目录 ##但是你需要注意,若之前没有卸载旧版本的话,会出现多个openssl ##有多个openssl的时候,你需要看一下哪个路径下的openssl是新版,之后指定这个路径即可
[root@postgreSQL openssh-8.6p1]# which openssl
/usr/local/bin/openssl
[root@postgreSQL openssh-8.6p1]# /usr/local/bin/openssl version
OpenSSL 1.1.1k  25 Mar 2021

 

--with-pam

指定了pam参数但没有安装服务会报:configure: error: PAM headers not found

 ##安装需要的软件包即可
[root@postgreSQL openssh-8.6p1]# yum install -y pam-devel

 

之后我们开始安装新版;

 ##切回openssh的解压目录
[root@postgreSQL etc]# cd /root/openssh-8.6p1

 ##这里需要解读一些配置的参数,写错了会报错的
[root@postgreSQL openssh-8.6p1]# ./configure --prefix=/usr/ --sysconfdir=/etc/ssh \
> --with-openssl-includes=/usr/local/include --with-ssl-dir=/usr/local/bin \
> --with-zlib --with-md5-passwords --with-pam
    ## --prefix=/usr/ 这里还是指定一下安装的目录路径
    ## --sysconfdir=/etc/ssh 这里指定的配置文件的目录路径
    ## --with-openssl-includes=/usr/local/include 看上面讲一下
    ## --with-ssl-dir=/usr/local/openssl 看上面讲一下
    ##后面参数不需要调整,写上就可以啦

    ##安装
[root@postgreSQL openssh-8.6p1]# make && make install

    ##看下信息,已经完成升级了
[root@postgreSQL openssh-8.6p1]# ssh -V
OpenSSH_8.6p1, OpenSSL 1.1.1k  25 Mar 2021

 

配置服务及启动;

    ##在我们解压的软件包目录下有自带的服务配置文件
[root@postgreSQL openssh-8.6p1]# ls contrib/redhat/sshd.init
contrib/redhat/sshd.init

    ##将其复制到启动配置文件的目录下
[root@postgreSQL openssh-8.6p1]# cp -a contrib/redhat/sshd.init /etc/init.d/sshd

    ##查看是否有执行权限,若没有,需要 chmod +x 来赋权
[root@postgreSQL openssh-8.6p1]# ls -l /etc/init.d/sshd 
-rwxr-xr-x 1 root root 1721 Apr 16 11:55 /etc/init.d/sshd

    ##添加服务
[root@postgreSQL openssh-8.6p1]# chkconfig --add sshd

 ##启动服务并查看状态
[root@postgreSQL openssh-8.6p1]# systemctl start sshd
[root@postgreSQL openssh-8.6p1]# systemctl status sshd
● sshd.service - SYSV: OpenSSH server daemon
   Loaded: loaded (/etc/rc.d/init.d/sshd; bad; vendor preset: enabled)
   Active: active (running) since Sat 2021-07-03 17:56:23 CST; 9s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 57383 ExecStart=/etc/rc.d/init.d/sshd start (code=exited, status=0/SUCCESS)
 Main PID: 57391 (sshd)
   CGroup: /system.slice/sshd.service
           └─57391 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups

Jul 03 17:56:23 postgreSQL systemd[1]: Starting SYSV: OpenSSH server daemon...
Jul 03 17:56:23 postgreSQL sshd[57383]: Starting sshd:[  OK  ]
Jul 03 17:56:23 postgreSQL systemd[1]: Can't open PID file /var/run/sshd.pid (yet?) ...ory
Jul 03 17:56:23 postgreSQL sshd[57391]: Server listening on 0.0.0.0 port 22.
Jul 03 17:56:23 postgreSQL sshd[57391]: Server listening on :: port 22.
Jul 03 17:56:23 postgreSQL systemd[1]: Started SYSV: OpenSSH server daemon.
Hint: Some lines were ellipsized, use -l to show in full.

 ##顺便设置一下开机自动启动 ##常规的 systemctl 设置会给予一个提示,命令被重定向了,那么就使用提示给的命令
[root@postgreSQL openssh-8.6p1]# systemctl enable sshd
sshd.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig sshd on

    ##再次设置开机启动
    ##下面显示2、3、4、5是on就可以,其数字代表启动级别
[root@postgreSQL openssh-8.6p1]# /sbin/chkconfig sshd on
[root@postgreSQL openssh-8.6p1]# chkconfig --list sshd

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

sshd               0:off    1:off    2:on    3:on    4:on    5:on    6:off

 ##现在的情况下,就已经可以连接了,但是不能登录,依然提示输入密码 ##类似的情况之前设置telnet时也出现了,所以要为用户设置登录的权限 ##结尾添加即可
[root@postgreSQL openssh-8.6p1]# vim /etc/ssh/sshd_config
    ... ...
    ... ...
permitRootlogin yes

    ##重启服务
[root@postgreSQL openssh-8.6p1]# service sshd restart
Restarting sshd (via systemctl):                           [  OK  ]

    ##之后尝试ssh连接登录
[C:\~]$ ssh 192.168.1.90


Connecting to 192.168.1.90:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Sat Jul  3 15:18:30 2021 from ::ffff:192.168.1.10
[root@postgreSQL ~]# 

 

删除scp相关文件;

 ##做了一套操作之后,好像忘了当初是因为什么原因才升级的,其实就是因为scp的问题 ##但是你现在scp一下看看
[root@postgreSQL ~]# scp
usage: scp [-346ABCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file]
            [-J destination] [-l limit] [-o ssh_option] [-P port]
            [-S program] source ... target
[root@postgreSQL ~]# 

    ##其实之前我们卸载旧版的 openssh 的时候带上的 openssh-clients,就是卸载scp的
    ##但是由于它本身是openssh软件中其中的一部分,我们重新编译安装后,其实也把它重新安装了
[root@postgreSQL ~]# which scp
/usr/bin/scp

    ##现在我们要卸载scp,由于是编译安装,直接将文件删除即可,不影响其他使用
[root@postgreSQL usr]# find /usr -name "scp*"
/usr/bin/scp
/usr/lib/firmware/mediatek/mt8183/scp.img
/usr/share/man/man1/scp.1
[root@postgreSQL usr]# find /usr -name "scp*" -exec rm -fr {} \;

    ##之后查看一下scp的命令
[root@postgreSQL usr]# scp
-bash: /usr/bin/scp: No such file or directory

 ##再开启另一个服务器(虚拟机)使用scp来拷贝文件 ##无论是向里传输文件,还是向外拷贝文件均不成功
[root@kafka-test ~]# which scp
/usr/bin/scp
[root@kafka-test ~]# scp 192.168.1.90:/root/file1 .
The authenticity of host '192.168.1.90 (192.168.1.90)' can't be established.
ECDSA key fingerprint is SHA256:+w4yEM9OVJu7utY/Xl5pO+/vc1ILUPzIJx2DvGX8NsQ.
ECDSA key fingerprint is MD5:27:89:b4:75:2c:b4:3b:85:e1:66:6a:b6:a5:3a:53:c2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.90' (ECDSA) to the list of known hosts.
root@192.168.1.90's password: 
bash: scp: command not found

[root@kafka-test ~]# scp file2 192.168.1.90:/root/
root@192.168.1.90's password: 
bash: scp: command not found
lost connection

 

 

--返回目录--

 

 

关闭telnet相关设置

当我们的sshd可以正常使用了之后,我们需要关闭之前临时开启的telnet(甚至卸载);

 ##删除允许telnet登录的设备,删除xvc0后面我们添加的即可
[root@postgreSQL ~]# vim /etc/securetty
... ... ... ... xvc0

 ##删除 root 登录的 telnet 配置文件
[root@postgreSQL ~]# cd /etc/xinetd.d/
[root@postgreSQL xinetd.d]# rm -f telnet

    ##取消开机启动并停止服务
[root@postgreSQL xinetd.d]# systemctl stop xinetd
[root@postgreSQL xinetd.d]# systemctl stop telnet.socket
[root@postgreSQL xinetd.d]# systemctl disable xinetd
Removed symlink /etc/systemd/system/multi-user.target.wants/xinetd.service.
[root@postgreSQL xinetd.d]# systemctl disable telnet.socket
Removed symlink /etc/systemd/system/sockets.target.wants/telnet.socket.

    ##telnet服务的端口号默认是23,可以查看一下,已经没有了
[root@postgreSQL xinetd.d]# netstat -antupl | grep :23
[root@postgreSQL xinetd.d]# lsof -i:23

    ##再彻底一点,就是将服务卸载,这一步根据自己的情况来做吧
[root@postgreSQL xinetd.d]# yum erase -y xinetd telnet-server

 

 

--返回目录--