
服务器操作系统为:CentOS Linux release 8.5.2111,被扫描出openssh低版本漏洞:CVE-2020-15778、CVE-2021-41617、CVE-2023-38408
将openssh升级为最新的版本。
1.新开一个ssh端口,避免旧的出问题连不上,命令如下:
# 复制一份 sshd 配置sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config_alt# 修改新配置文件,把 Port 22 改为其他端口,比如 2222sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config_alt# 用新配置启动一个独立的 sshd 进程sudo /usr/sbin/sshd -f /etc/ssh/sshd_config_alt -p 2222# 防火墙放行新端口sudo firewall-cmd --add-port=2222/tcp --permanentsudo firewall-cmd --reload2.升级openssh为最新的10.3p1版本
# 1. 安装编译依赖sudo dnf groupinstall "Development Tools" -ysudo dnf install pam-devel zlib-devel openssl-devel wget -y# 2. 下载并编译 OpenSSH 10.3p1cd /usr/local/src# 可替换为其他镜像源,注意检查下载是否成功sudo wget https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-10.3p1.tar.gzsudo tar -xzf openssh-10.3p1.tar.gzcd openssh-10.3p1# 3. 配置、编译、安装sudo ./configure --prefix=/usr --sysconfdir=/etc/sshsudo makesudo make install# 4. 检查新版本是否安装成功/usr/sbin/sshd -V 2>&1 | grep -i openssh# 应输出类似:OpenSSH_10.3p1, OpenSSL 1.1.1k ...3.安装完之后重启服务。
这一步总是重启失败,有很多问题,踩了很多坑,主要是配置文件的一些配置和新版本的openssh不兼容,需要修改后才能启动。
这里新开启的2222服务的配置文件和原来22的配置文件同理,都存在一样的问题。
这里以2222端口启动报错为例,其报如下错误:
报错1: Unsupported option GSSAPIxxx、UsePAM(配置参数不识别)
原因:sshd_config_alt配置文件中存在当前 openssh 版本不支持的 GSSAPI/PAM 配置项
修复方案:
3.1 编辑备用配置文件
vi /etc/ssh/sshd_config_alt3.2 在 84/85/101 行,在报错参数前加#注释掉:
#GSSAPIAuthentication yes#GSSAPICleanupCredentials yes#UsePAM yes报错2:密钥权限过宽 Permissions 0640 ... are too open
原因:SSH 私钥文件权限不能被组 / 其他用户读取,标准权限:私钥600、公钥644,当前0640超出安全权限,sshd 拒绝加载密钥。
一键修复权限:
# 私钥仅root可读chmod 600 /etc/ssh/ssh_host_*_key# 公钥放宽权限chmod 644 /etc/ssh/ssh_host_*_key.pub# 归属统一改为rootchown root:root /etc/ssh/ssh_host_*修复后重启2222端口,发现可以重新启动:
/usr/sbin/sshd -f /etc/ssh/sshd_config_alt -p 22224.重启本机自己的22端口服务,验证在服务器重启之后,22端口也能正常连接。
这一步也出问题了,首先22端口的sshd服务死活启动不了,也是配置文件的问题,而且它的配置文件还比较复杂要改的地方比较多。
检查默认配置文件语法:
sshd -t -f /etc/ssh/sshd_config需要注释 /etc/ssh/sshd_config 文件中有关 GSS的相关配置,如上面3.2步骤的操作。
这几个注释了,还是会报一个错:配置里存在不兼容参数 GSSAPIKexAlgorithms
这里又是另外一个配置文件里面配置了这个GSS相关的参数,它是被写到systemd启动命令的环境参数里了。
需要修改路径:/etc/crypto-policies/back-ends/opensshserver.config 下的有关 GSSAPIKexAlgorithms 的配置项。
修改完之后,重载+重启服务:
# 重载systemd配置systemctl daemon-reload# 停止不断重启的sshdsystemctl stop sshd# 启动systemctl start sshd# 查看状态systemctl status sshd经过上述修改之后,服务可以启动了,但是通过xshell连接的时候,还是报密码错误连接不上。
临时关闭 SELinux ,就可以连接了。
setenforce 0这里为了避免服务器重启之后,这个配置失效,这里设置永久关闭SELinux
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config但是这里有个问题就是,设置了这个选项,可能会被漏洞扫描扫出来问题。
这里为了保险,我将2222端口服务也设置为开机自启动,最后发现还是要关闭SELinux。
1.创建系统服务自启服务
# 创建独立的 sshd-alt 服务文件sudo tee /etc/systemd/system/sshd-alt.service <<'EOF'[Unit]Description=OpenSSH server on alternate port 2222After=network.target[Service]Type=notifyExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd_config_altTimeoutStartSec=90sRestart=always[Install]WantedBy=multi-user.targetEOF2.SELinux 添加 ssh 自定义端口权限
# 将2222端口加入ssh允许端口类型ssh_port_tsudo semanage port -a -t ssh_port_t -p tcp 22223.启用并启动服务
# 刷新系统服务sudo systemctl daemon-reload# 开机自启sudo systemctl enable sshd-alt# 立即启动sudo systemctl start sshd-alt# 查看状态(验证是否运行)sudo systemctl status sshd-alt查看端口是否占用,杀掉进程
netstat -tulpn|grep 2222kill-9 PID# 查看防火墙状态firewall-cmd --list-ports