前言

  • 已验证系统版本
    • centos6.x
    • centos7.x
    • 麒麟系统,可能出现sshd重启卡死情况,但实际是启动的。

安装 Telnet 服务和 xinetd

防止openSSH升级失败,导致无法连接服务器

关闭防火墙

sh脚本命令: 判断启用的防火墙,并尝试关闭防火墙。

firewalld

service firewalld stop

iptables

service iptables stop

安装 Telnet 服务和 xinetd

yum install -y telnet-server xinetd

配置服务

cat <<EOL > /etc/xinetd.d/telnet
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no
}
EOL

启动并设为开机自启

根据情况选择其一

systemctl命令方式

systemctl start xinetd
systemctl enable xinetd

常规命令执行方式

service xinetd start
chkconfig xinetd on

卸载关闭 xinetd

执行升级openSSH成功后,可以卸载关闭xinetd服务

centos6

service xinetd stop
chkconfig xinetd off
yum remove -y telnet-server xinetd

centos7

systemctl stop xinetd
systemctl disable xinetd
yum remove -y telnet-server xinetd

升级安装OpenSSH

openssh官网

openssh-9.8p1.tar.gz

CVE-2024-6387关于openssh的漏洞,升级openssh到9.8版本

安装依赖环境

yum -y install gcc gcc-c++ zlib-devel openssl-devel pam-devel perl-IPC-Cmd
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz
tar -zxvf openssh-9.8p1.tar.gz

配置环境

请优先升级ssl版本,在当前网站内查询关于升级ssl的文章。

cd openssh-9.8p1/ && ./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/openssl_3.3 --with-zlib --with-pam
  • –prefix=/usr/local/openssh 指定 OpenSSH 的安装路径
  • –sysconfdir=/etc/ssh 指定 SSH 配置文件路径
  • –with-ssl-dir=/usr/local/openssl 指定 OpenSSL 库路径
  • –with-zlib 启用 zlib 压缩支持
  • –with-pam 启用 PAM 认证支持
make -j 2 && make install -j 2

备份旧版本并创建符号链接

备份旧版本

\cp -rf  /usr/bin/ssh /usr/bin/ssh.bak && \cp -rf  /usr/sbin/sshd /usr/sbin/sshd.bak && \cp -rf /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
rm -rf  /usr/bin/ssh && rm -rf  /usr/sbin/sshd

创建软链接

ln -s /usr/local/openssh/bin/ssh /usr/bin/ssh && ln -s /usr/local/openssh/sbin/sshd /usr/sbin/sshd

更新配置文件和库路径

更新库路径

echo "/usr/local/openssh/lib" | tee -a /etc/ld.so.conf && ldconfig

更新环境变量

echo 'export PATH=/usr/local/openssh/bin:$PATH' | tee -a /etc/profile && source /etc/profile

验证 sshd_config 文件

对比配置文件(可选)

diff /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

恢复配置文件(可选)

cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config

重启 SSH 服务并验证

重启
systemctl restart sshd


service sshd restart

验证

ssh -V

问题记录

启动失败

/etc/ssh/ssh_host_ed25519_key 文件的权限设置过于宽松。SSH 主机密钥文件需要更严格的权限,以确保其安全性。具体来说,只有 root 用户应该拥有读取和写入权限,其他用户不应有任何权限。

修复文件权限

chmod 600 /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key

验证文件权限

ls -l /etc/ssh/ssh_host_*

配置不支持

sed -i 's/^GSSAPIAuthentication/#&/' /etc/ssh/sshd_config && sed -i 's/^GSSAPICleanupCredentials/#&/' /etc/ssh/sshd_config && sed -i 's/^UsePAM/#&/' /etc/ssh/sshd_config

允许root用户登录服务器(可选)

#sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config 

无法正常重启

问题描述:

执行命令 systemctl restart sshd会卡住,然后ctrl c,在执行 systemctl status sshd,发现已启动

查看sshd日志

journalctl -u sshd

编译升级最新OpenSSH_8.4p1, 替换sshd.service,解决启动卡死的问题

解决步骤

安装依赖包

centos

yum install systemd-devel -y

ubuntu

apt-get install libsystemd-dev

修改源码

  1. 在源码目录下,找到sshd.c

  2. 在开头添加引用

    #include <systemd/sd-daemon.h>
  3. 在函数server_accept_loop(第二处位置)前添加代码:sd_notify(0, "READY=1")

    /* Signal systemd that we are ready to accept connections */
    sd_notify(0, "READY=1");

    /* Accept a connection and return in a forked child */
    server_accept_loop(&sock_in, &sock_out,&newsock, config_s);
    }

修改编译文件Makefile

需要先./configure ...才会生成Makefile文件

找到变量LIBS,修改如下:

LIBS=-lcrypto -ldl -lutil -lz -lcrypt -lresolv -lsystemd
make 
make install

Xshell等ssh工具无法正常连接

升级完openSSH之后,所有主机使用root无法ssh登陆

修改ssh配置文件

vim /etc/ssh/sshd_config

注释以下配置

#GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
#UsePAM yes

允许root登录

PermitRootLogin yes

重启sshd服务

service sshd restart