centos7|操作系统|低版本的OpenSSH升级到最新版本OpenSSH-9.8.p1

CSDN 2024-07-29 11:07:02 阅读 66

言:

1、

OpenSSH是什么

OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。

2、

OpenSSH和telnet有什么区别?

两者都是通过网络协议连接服务器的工具,但OpenSSH是使用的TCP协议,更为安全,而telnet则是使用的UDP协议,从根本上来说,这个协议是不安全,不可控的,因此,telnet并不能取代sshd,在生产环境通常也是禁止使用telnet来进行远程连接的

3、

为什么要升级OpenSSH

OpenSSH是用于安全远程登录和其他安全网络服务的软件包,对于大多数Linux发行版来说,它都是默认安装的。随着时间的推移,OpenSSH的新版本可能会引入安全性更新和改进,因此升级到最新版本是很有必要的。特别是对于CentOS 7,由于它已经停止了官方支持,因此及时升级系统组件变得更加重要。

4、

OpenSSH升级的必要流程

第一,需要对旧的sshd以及客户端ssh以及相关配置文件做备份;

第二,获取到需要的安装升级包,可以是源码包的形式也可以是rpm包或者deb等等的形式;

第三,需要给自己留一个后门,防止升级失败把自己关在门外的情况发生,通常,我们是暂时启用telnet连接,并测试好telnet,确定telnet是可用的就可以了;

第四、开始正式升级安装sshd服务,可以是yum 或者apt升级的形式,也可以是rpm -Uvh这样的形式,也可以是编译安装并配置动态链接库,运行程序,配置文件这样的形式;

第五、OpenSSH升级安装完成后,检测sshd服务是否正常,可用,检查OpenSSH的各项功能,检查OpenSSH的版本

第六、如果发现OpenSSH升级有问题,不能正常ssh链接服务器,执行回滚操作,主要是利用第一步的备份文件进行恢复

第七、如果OpenSSH升级确认没有问题,清除安装过程产生的垃圾文件,关闭telnet这个后门,圆满结束此次升级工作

🆗,我已经在虚拟机编译生成了一个可用的OpenSSH rpm包,可用于centos7全系列,欧拉2.0以及欧拉2.5系列服务器

二、

OpenSSH最新版本9.8.p1版本的rpm包下载地址

链接:https://pan.baidu.com/s/1yYvThN2ayjWZLlHOUqVHXA?pwd=open 提取码:open 

以上是已经编译好的rpm包,直接就可用的,适用于centos7和欧拉2.0,或者配置成yum仓库,或者直接yum localinstall ,或者rpm -ivh 都可以,完全无毒,可放心使用

附件1是最新版的openssh-9.8的安装包,附件2是ssh-copy-id程序,附件3是openssh-9.3的升级文档,里面包含有telnet-server,附件4是通用的sshd服务配置文件

三、

备份sshd

二进制文件不需要备份,主要是备份配置文件,命令为

<code>cp -r /etc/ssh{,.bak}

四、

telnet-server的安装

该服务安装非常简单,一般配置好本地仓库就可以非常简单的安装了,安装命令为:

yum install telnet-server -y

修改telnet的配置文件,不要使用默认端口23,然后开放telnet连接权限,启动telnet服务就可以了

修改/usr/lib/systemd/system/telnet.socke 这个文件,端口修改为10023

[Unit]

Description=Telnet Server Activation Socket

Documentation=man:telnetd(8)

[Socket]

ListenStream=23

Accept=true

[Install]

WantedBy=sockets.target

开放telnet连接权限,这个pts/数字是表示登陆的终端号,必须要有这些才允许登陆:

echo "pts/0">>/etc/securetty

echo "pts/1">>/etc/securetty

echo "pts/2">>/etc/securetty

echo "pts/3">>/etc/securetty

echo "pts/4">>/etc/securetty

启动telnet服务,然后随便打开一个xshell,并配置协议为telnet 测试是否可以成功连接就可以了

启动telnet服务命令:

systemctl start telnet.socket

五、

正式升级OpenSSH

这一步非常简单,如果是把这些rpm包制作成yum仓库,使用yum安装,会自动给你备份配置文件,如果rpm安装,不会自动备份配置文件

rpm命令为:

<code>rpm -Uvh *.rpm

该命令会将旧的rpm包删除,大体执行后的日志如下:

[root@centos10 x86_64]# rpm -Uvh ./*.rpm

Preparing... ################################# [100%]

Updating / installing...

1:openssh-9.8p1-1.el7 ################################# [ 13%]

2:openssh-askpass-gnome-9.8p1-1.el7################################# [ 25%]

3:openssh-clients-9.8p1-1.el7 ################################# [ 38%]

4:openssh-server-9.8p1-1.el7 ################################# [ 50%]

5:openssh-debuginfo-9.8p1-1.el7 ################################# [ 63%]

Cleaning up / removing...

6:openssh-server-7.4p1-21.el7 ################################# [ 75%]

7:openssh-clients-7.4p1-21.el7 ################################# [ 88%]

8:openssh-7.4p1-21.el7 ################################# [100%]

六、

测试sshd服务是否正常

1、

打印sshd服务的版本号

[root@centos10 x86_64]# sshd -V

OpenSSH_9.8p1, without OpenSSL

 这里稍微解释一下,without OpenSSL并不是说OpenSSL  就不需要了,只是我编译的时候和OpenSSL解绑了而已OpenSSH服务完全是可以正常使用的,这点无需担心

2、

ssh-keygen 生成密钥

[root@centos10 x86_64]# ssh-keygen -t ed25519

Generating public/private ed25519 key pair.

Enter file in which to save the key (/root/.ssh/id_ed25519):

/root/.ssh/id_ed25519 already exists.

Overwrite (y/n)? y

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_ed25519

Your public key has been saved in /root/.ssh/id_ed25519.pub

The key fingerprint is:

SHA256:qtiHX2pKI0C88MsRMvVXjMLIXIt5PmOAa1+ziY9clgU root@centos10

The key's randomart image is:

+--[ED25519 256]--+

| o.+. o. |

|.o++o.... |

|=o= +E. |

|o=.= .. |

|ooo =o .S |

|.o.+oo*. |

| +ooB. . |

| .=*ooo |

| .o+*o |

+----[SHA256]-----+

可以看到十分正常的就生成了,但是需要说明一点rsa密钥用不了,原因未知,如果介意就不要用这个升级包了

3、

ssh-copy-id  

在上面的百度网盘内有提供,放到系统环境变量下就可以使用了,经测试该命令也是没有问题的

其它的ssh族命令经测试都是正常的,这里我就不把测试结果贴出来了

4、

sshd服务的重启

sshd服务重启命令为

systemctl restart sshd

第一次重启,发现有很多报错,无所谓,这个说的是证书文件权限太高而已,都修改成0600权限就可以了 

- Unit sshd.service has finished shutting down.

Jul 08 04:38:48 centos10 systemd[1]: Starting SYSV: OpenSSH server daemon...

-- Subject: Unit sshd.service has begun start-up

-- Defined-By: systemd

-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

--

-- Unit sshd.service has begun starting up.

Jul 08 04:38:48 centos10 sshd[27344]: Starting sshd:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Jul 08 04:38:48 centos10 sshd[27344]: @ WARNING: UNPROTECTED PRIVATE KEY FILE! @

Jul 08 04:38:48 centos10 sshd[27344]: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Jul 08 04:38:48 centos10 sshd[27344]: Permissions 0640 for '/etc/ssh/ssh_host_rsa_key' are too open.

Jul 08 04:38:48 centos10 sshd[27344]: It is required that your private key files are NOT accessible by others.

Jul 08 04:38:48 centos10 sshd[27344]: This private key will be ignored.

Jul 08 04:38:48 centos10 sshd[27344]: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Jul 08 04:38:48 centos10 sshd[27344]: @ WARNING: UNPROTECTED PRIVATE KEY FILE! @

Jul 08 04:38:48 centos10 sshd[27344]: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Jul 08 04:38:48 centos10 sshd[27344]: Permissions 0640 for '/etc/ssh/ssh_host_ed25519_key' are too open.

Jul 08 04:38:48 centos10 sshd[27344]: It is required that your private key files are NOT accessible by others.

Jul 08 04:38:48 centos10 sshd[27344]: This private key will be ignored.

Jul 08 04:38:48 centos10 sshd[27344]: sshd: no hostkeys available -- exiting.

Jul 08 04:38:48 centos10 sshd[27344]: [FAILED]

Jul 08 04:38:48 centos10 systemd[1]: sshd.service: control process exited, code=exited status=1

Jul 08 04:38:48 centos10 systemd[1]: Failed to start SYSV: OpenSSH server daemon.

-- Subject: Unit sshd.service has failed

-- Defined-By: systemd

-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

例如:

chmod 0600 /etc/ssh/ssh_host_ed25519_key

权限文件解决后,查看sshd服务的配置文件,确认没有问题,再次重启sshd服务就可以结束升级了

七、

关于回滚问题

for i in `rpm -qa |grep openssh`;do rpm -e $i --nodeps ;done

一般用for循环强制删除,删除后,利用本地仓库安装原来的旧sshd服务就可以了

本地仓库相关知识见我的博客:Linux的完全本地仓库搭建指南(科普扫盲贴)_linux7如何搭建本地仓库-CSDN博客

OpenSSH-9.8.p1的源码安装包的下载地址:https://openbsd.cs.toronto.edu/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz

八、

通用的sshd配置文件:

此配置文件基本已在几十台服务器使用过,基本没有什么问题

cat >/etc/ssh/sshd_config<<EOF

#     $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $

# This is the sshd server system-wide configuration file.  See

# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/openssh/bin

# The strategy used for options in the default sshd_config shipped with

# OpenSSH is to specify options with their default value where

# possible, but leave them commented.  Uncommented options override the

# default value.

#Port 22

Port 10022

#AddressFamily any

#ListenAddress 0.0.0.0

#ListenAddress ::

#HostKey /usr/local/openssh/etc/ssh_host_rsa_key

#HostKey /usr/local/openssh/etc/ssh_host_ecdsa_key

#HostKey /usr/local/openssh/etc/ssh_host_ed25519_key

# Ciphers and keying

#RekeyLimit default none

# Logging

#SyslogFacility AUTH

#LogLevel INFO

# Authentication:

#LoginGraceTime 2m

#PermitRootLogin yes

#StrictModes yes

#MaxAuthTries 6

#MaxSessions 10

#PubkeyAuthentication yes

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2

# but this is overridden so installations will only check .ssh/authorized_keys

AuthorizedKeysFile .ssh/authorized_keys

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none

#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /usr/local/openssh/etc/ssh_known_hosts

#HostbasedAuthentication no

# Change to yes if you don't trust ~/.ssh/known_hosts for

# HostbasedAuthentication

#IgnoreUserKnownHosts no

# Don't read the user's ~/.rhosts and ~/.shosts files

#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!

#PasswordAuthentication yes

#PermitEmptyPasswords no

# Change to no to disable s/key passwords

#ChallengeResponseAuthentication yes

# Kerberos options

#KerberosAuthentication no

#KerberosOrLocalPasswd yes

#KerberosTicketCleanup yes

#KerberosGetAFSToken no

# GSSAPI options

#GSSAPIAuthentication no

#GSSAPICleanupCredentials yes

# Set this to 'yes' to enable PAM authentication, account processing,

# and session processing. If this is enabled, PAM authentication will

# be allowed through the ChallengeResponseAuthentication and

# PasswordAuthentication.  Depending on your PAM configuration,

# PAM authentication via ChallengeResponseAuthentication may bypass

# the setting of "PermitRootLogin without-password".

# If you just want the PAM account and session checks to run without

# PAM authentication, then enable this but set PasswordAuthentication

# and ChallengeResponseAuthentication to 'no'.

#UsePAM no

#AllowAgentForwarding yes

#AllowTcpForwarding yes

#GatewayPorts no

#X11Forwarding no

#X11DisplayOffset 10

#X11UseLocalhost yes

#PermitTTY yes

#PrintMotd yes

#PrintLastLog yes

#TCPKeepAlive yes

#PermitUserEnvironment no

#Compression delayed

#ClientAliveInterval 0

#ClientAliveCountMax 3

#UseDNS no

#PidFile /var/run/sshd.pid

#MaxStartups 10:30:100

#PermitTunnel no

#ChrootDirectory none

#VersionAddendum none

# no default banner path

#Banner none

# override default of no subsystems

Subsystem   sftp   /usr/libexec/openssh/sftp-server

# Example of overriding settings on a per-user basis

#Match User anoncvs

#     X11Forwarding no

#     AllowTcpForwarding no

#     PermitTTY no

#     ForceCommand cvs server

PermitRootLogin yes

PubkeyAuthentication yes

EOF

九、

升级OpenSSH经常遇到的三个错误:

第一种情况:

如果有遇到sshd服务状态(systemctl status sshd命令)里带有Permissions字样的报错,例如下面这样的:

[root@pg2 aarch64]# 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 Thu 2024-07-11 12:58:12 CST; 10s ago

     Docs: man:systemd-sysv-generator(8)

  Process: 30984 ExecStop=/etc/rc.d/init.d/sshd stop (code=exited, status=0/SUCCESS)

  Process: 31113 ExecStart=/etc/rc.d/init.d/sshd start (code=exited, status=0/SUCCESS)

 Main PID: 31121 (sshd)

   CGroup: /system.slice/sshd.service

           └─31121 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups

Jul 11 12:58:12 pg2 sshd[31113]: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Jul 11 12:58:12 pg2 sshd[31113]: Permissions 0640 for '/etc/ssh/ssh_host_ecdsa_key' are too open.

Jul 11 12:58:12 pg2 sshd[31113]: It is required that your private key files are NOT accessible by others.

Jul 11 12:58:12 pg2 sshd[31113]: This private key will be ignored.

Jul 11 12:58:12 pg2 sshd[31113]: Unable to load host key "/etc/ssh/ssh_host_ecdsa_key": bad permissions

Jul 11 12:58:12 pg2 sshd[31113]: Unable to load host key: /etc/ssh/ssh_host_ecdsa_key

Jul 11 12:58:12 pg2 sshd[31121]: Server listening on 0.0.0.0 port 10022.

Jul 11 12:58:12 pg2 sshd[31113]: [  OK  ]

Jul 11 12:58:12 pg2 sshd[31121]: Server listening on :: port 10022.

提示有哪些报错的文件赋权,赋权后重启sshd服务,示例如下:

chmod 0600 /etc/ssh/ssh_host_ecdsa_key

systemctl restart sshd

第二种情况:

如果sshd服务状态(systemctl status sshd命令)内有format字样,需要回退到低版本7.4p,然后重新生成sshd服务的证书文件,一般是四个

报错如下,主要是有format字样

[root@pg1 aarch64]# chmod -Rf 0600 /etc/ssh/

[root@pg1 aarch64]# systemctl restart sshd

[root@pg1 aarch64]# 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 Thu 2024-07-11 14:14:39 CST; 11s ago

     Docs: man:systemd-sysv-generator(8)

  Process: 65356 ExecStart=/etc/rc.d/init.d/sshd start (code=exited, status=0/SUCCESS)

 Main PID: 65364 (sshd)

   CGroup: /system.slice/sshd.service

           └─65364 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups

Jul 11 14:14:39 pg1 systemd[1]: Starting SYSV: OpenSSH server daemon...

Jul 11 14:14:39 pg1 sshd[65356]: Starting sshd:Unable to load host key "/etc/ssh/ssh_host_rsa_key": invalid format

Jul 11 14:14:39 pg1 sshd[65356]: Unable to load host key: /etc/ssh/ssh_host_rsa_key

Jul 11 14:14:39 pg1 sshd[65356]: Unable to load host key "/etc/ssh/ssh_host_ecdsa_key": invalid format

Jul 11 14:14:39 pg1 sshd[65356]: Unable to load host key: /etc/ssh/ssh_host_ecdsa_key

Jul 11 14:14:39 pg1 sshd[65364]: Server listening on 0.0.0.0 port 10022.

Jul 11 14:14:39 pg1 sshd[65364]: Server listening on :: port 10022.

Jul 11 14:14:39 pg1 sshd[65356]: [  OK  ]

Jul 11 14:14:39 pg1 systemd[1]: Started SYSV: OpenSSH server daemon.

证书生成命令如下:

ssh-keygen -t rsa  -f /etc/ssh/ssh_host_rsa_key

ssh-keygen -t ecdsa  -f /etc/ssh/ssh_host_ecdsa_key

ssh-keygen -t ecdsa  -f /etc/ssh/ssh_host_ecdsa_key

ssh-keygen -t ed25519  -f /etc/ssh/ssh_host_ed25519_key

每个命令都需要先手动输入y,表示同意覆盖,然后回车直到命令结束

证书文件生成后,在利用for循环命令删除低版本sshd,然后再次升级sshd就可以正常升级完成了,如果懒得修改配置文件,直接使用上面的通用配置文件就可以了 

第三种情况:

systemctl status sshd 查看sshd服务状态,里面有shadow字样报错

这个错误是由于操作系统的selinux没有关闭产生的,非常简单,关闭selinux,如果服务器不方便重启,就执行如下命令暂时关闭selinux:

<code>setenforce 0



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。