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.g
z
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服务能否正常开机启动
太赞了,非常感谢