1.配置备用的 telnet环境(兜底)
# 安装telnet-server
yum -y install telnet-server
# 启动并设置开机自启动
systemctl start telnet.socket && systemctl enable telnet.socket
# 如果有防火墙,则需要放行23端口
firewall-cmd --zone=public --add-port=23/tcp --permanent
# 在使用 telnet 连接服务器时,默认是不允许使用root登陆的,因此需要创建一个普通用户并赋予sudo权限
# 添加普通用户并设置密码
useradd tempuser
echo 123456 | passwd --stdin tempuser
# 增加tempuser账号的sudo权限
# 在配置文件 /etc/sudoers 中添加配置,但该文件默认是没有写权限的,因此需要先增加写权限
chmod u+w /etc/sudoers
vi /etc/sudoers
tempuser ALL=(ALL) ALL
# 上面配置完成后就可以在windows下的终端中使用telnet命令来测试连接
telnet 192.168.0.31 23
2.升级openssh
# 下载安装包,当前最新的openssh版本是9.3p1
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.3p1.tar.gz
# 接下来的步骤建议使用telnet的方式连接服务器后在操作
# 首先停止当前的ssh服务器
systemctl stop sshd
# 备份当前ssh服务
cp -a /etc/ssh /etc/ssh.bak
cp -a /usr/sbin/sshd /usr/sbin/sshd.bak
cp -a /usr/bin/ssh /usr/bin/ssh.bak
# 查看当前openssh的软件包
rpm -qa | grep openssh
# openssh-clients-7.4p1-16.el7.x86_64
# openssh-7.4p1-16.el7.x86_64
# openssh-server-7.4p1-16.el7.x86_64
# 卸载这三个软件包
rpm -e `rpm -qa | grep openssh` --nodeps
# 会提示原有的文件已经备份到 sshd_config.rpmsave下面
warning: /etc/ssh/sshd_config saved as /etc/ssh/sshd_config.rpmsave
# 安装依赖包
yum install -y gcc gcc-c++ glibc make automake autoconf zlib zlib-devel pcre-devel perl perl-Test-Simple openssl-devel
# 解压源码包
tar -zxvf openssh-9.3p1.tar.gz
cd openssh-9.3p1
# 查看INSTALL文件里面有安装条件以及安装说明
cat INSTALL
# 编译安装
./configure --prefix=/usr/local/openssh --with-ssl-dir=/usr/local/openssl --with-zlib
make && make install
# 正常情况下按上面的配置编译安装即可,如果想安装其它模块,则需要安装对应依赖
# 如下面列出的一些模块,以及对应的依赖包
# --with-pam --with-ssl-engine --with-selinux
# yum install -y pam-devel libselinux-devel
# 配置启动脚本,源码包中提供了启动脚本
# 配置启动脚本前先检查原来openssh的systemd配置文件,如果有则将其删除,防止和新的启动脚本冲突
# 正常情况下这些脚本都会在卸载老版本openssh的自动删除
ls /usr/lib/systemd/system/ssh*
rm -f /usr/lib/systemd/system/ssh*
# 拷贝启动脚本
cp contrib/redhat/sshd.init /etc/init.d/sshd
# 如果安装了pam模块则需要拷贝sshd.pam配置文件
# cp contrib/redhat/sshd.pam /etc/pam.d/
# 建立软连接
ln -s /usr/local/openssh/etc /etc/ssh
ln -s /usr/local/openssh/sbin/sshd /usr/sbin/
ln -s /usr/local/openssh/bin/* /usr/bin/
systemctl daemon-reload
# 启动并设置开机自启动
systemctl start sshd && systemctl enable sshd
# 查看状态,已经是 running 状态了
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 Wed 2022-08-10 22:35:16 CST; 1 day 17h ago
# Docs: man:systemd-sysv-generator(8)
# Main PID: 10712 (sshd)
# CGroup: /system.slice/sshd.service
# ├─10712 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
# ├─13611 sshd: hckj [priv]
# ├─13613 sshd: hckj@pts/0
# ├─13614 -bash
# ├─13645 sudo -i
# ├─13646 -bash
# └─13711 systemctl status sshd
# 查看版本号已经升级成功
ssh -V
# OpenSSH_9.3p1, OpenSSL 1.1.1q 5 Jul 2022
# ssh的默认配置文件是禁止root用户远程登录的
# 若需要root用户远程登录,则按修改如下配置文件,然后重启ssh服务即可
vi /usr/local/openssh/etc/sshd_config
# 加入下面命令
PermitRootLogin yes
# 重启
systemctl restart sshd
3.删除备用telnet
如果一切正常,删除备用的telnet
systemctl stop telnet.socket
systemctl disable telnet.socket
rpm -e telnet-server
# 删除用户
userdel -r tempuser
# 编辑sudo配置文件,去除对应配置段
vi /etc/sudoers
# 恢复sudo配置文件的权限
chmod u-w /etc/sudoers
4.版本降级
实际情况,如内部使用了jenkins做远程发布,低版本的jenkins远程免密登录服务器,不怎么支持ssh9以上的版本,就需要回退降级或者自己使用密码。
# 删除历史信息
cd /usr/bin/
ls -lh ssh* # 删除所有带ssh的命令文件
rm -rf ssh.bak ssh-keygen
# 删除历史信息
cd /usr/sbin/
ls -lh ssh*
rm -rf sshd sshd.bak
# 删除之前的软连配置,如果有才删除
cd /etc/ssh
rm -rf 软连路径
# 执行重新安装 一般会重新覆盖
yum -y install openssh openssh-server openssh-clients
# 重启服务
systemctl restart sshd