CentOS 7安装完成之后,openssh版本是7.4,存在一些安全漏洞,需要升级到8.0以上版本,目前【2020-7-31】最新版本是8.3p1,下面是升级openssh过程,测试过的CentOS版本为7.7、7.8,测试过的openssh版本有8.2、8.3

安装之前需要先安装基本开发环境,可以在系统安装时直接勾选“开发工具”组件,

或用yum安装: yum install gcc make perl

1、下载openssh8.3升级包及依赖的zlib和openssl。

openssh-8.3p1.tar.gz、zlib-1.2.11.tar.gz、openssl-1.1.1g.tar.gz

wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.3p1.tar.gz

wget http://www.zlib.net/zlib-1.2.11.tar.gz

wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz

2、关闭SElinux

关闭SElinux命令:

setenforce 0

上面只是临时关闭了,重启后不生效。下面改配置文件,使永久生效。

vi /etc/selinux/config

修改:

SELINUX=disabled

保存退出

3、停止ssh服务

以下命令将停止系统原有的sshd服务,这将导致服务器无法通过ssh远程连接。建议直接操作服务器进行升级openssh的过程,如果不方便直接操作服务器,可以安装配置telnet,通过telnet远程连接服务器,具体方法本文不赘述

systemctl stop sshd

4、卸载原有的openssh包

看系统原有openssh包

rpm -qa | grep openssh

根据上面查询出的结果,卸载系统里原有Openssh(一般有三个包,全部卸载)

rpm -e --nodeps ***(***替换为上面查询的结果)

卸载完成后执行rpm -qa | grep openssh,确保没有回显

5、解压源码包

tar -zxvf zlib-1.2.11.tar.gz
tar -zxvf openssh-8.3p1.tar.gz
tar -zxvf openssl-1.1.1g.tar.gz

6、编译安装zlib

cd zlib-1.2.11
./configure --prefix=/usr/local/zlib
make && make install

新建并编辑配置文件:
vi /etc/ld.so.conf.d/zlib.conf
加入如下内容后保存退出
/usr/local/zlib/lib
刷新库文件,加载刚才编译安装的zlib生成的库文件
ldconfig -v

7、编译安装openssl

cd openssl-1.1.1g
./config --prefix=/usr/local/ssl -d shared
make && make install
备份现有文件目录
mv /usr/bin/openssl /usr/bin/openssl.bak
创建ssl相关软连接
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
新建并编辑配置文件
vi /etc/ld.so.conf.d/ssl.conf
加入如下内容后保存退出
/usr/local/ssl/lib
刷新库文件,加载刚才编译安装的ssl生成的库文件
ldconfig -v
查看openssl版本
openssl version -a

8、编译安装openssh

cd openssh-8.3p1
./configure --prefix=/usr/local/openssh --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/local/ssl
make && make install

sshd_config文件修改

echo 'PermitRootLogin yes' >>/usr/local/openssh/etc/sshd_config
echo 'PubkeyAuthentication yes' >>/usr/local/openssh/etc/sshd_config
echo 'PasswordAuthentication yes' >>/usr/local/openssh/etc/sshd_config

备份原有文件,并将新的配置复制到指定目录

mv  /etc/ssh /etc/ssh.old
mv /usr/sbin/sshd /usr/sbin/sshd.bak
mv /usr/bin/ssh /usr/bin/ssh.bak
mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.bak
因为上面卸载了openssh,上面的一些文件已经不存在了,如果备份没成功,不必在意
mkdir /etc/ssh
cp /usr/local/openssh/etc/sshd_config /etc/ssh/sshd_config
cp /usr/local/openssh/etc/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key.pub
cp /usr/local/openssh/bin/ssh /usr/bin/ssh
cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen

8、配置sshd服务开机启动

注意啦!注意啦!使用默认的源码安装的openssh,在使用systemd管理sshd服务时,你会发现,启动命令会卡住,稍后用systemctl 查看status时发现卡在正在启动(activating)的阶段

此时虽然可以通过ssh连接此服务器,但如果查看系统日志,会发现sshd服务在不断尝试重新启动。

出现这个问题的原因是openssh的源码默认并没有与systemd进行集成和适配,sshd在启动完成后,没有给systemd发消息,systemd就一直在那傻等,等过了超时时间就尝试重新启动sshd。解决此问题的方法有两种,一种是修改openssh的源代码,与systemd适配,可参考http://blog.chinaunix.net/uid-28813320-id-5786956.html,本人未尝试此方法,有兴趣的可以尝试看看。另一种方式就是以旧的sysv方式启动sshd服务,具体过程如下:

cd openssh-8.3p1
cp -p contrib/redhat/sshd.init /etc/init.d/sshd
chmod +x /etc/init.d/sshd
chkconfig --add sshd
chkconfig sshd on
service sshd restart

查看sshd服务状态

systemctl status sshd

查看openssh版本

ssh -V

如果正常,就重启服务器再查看一下,确认sshd服务能否正常开机启动

1 个评论

发表评论

您的电子邮箱地址不会被公开。

15 − 9 =