CentOS-OpenSSH升级过程

目录

  • 升级背景
  • 升级前注意事项
  • 手动升级流程
  • rpm包升级流程
  • 遇到问题及解决

升级背景

搜扫发现主机的 OpenSSH 相关高危漏洞,通过升级解决。

服务器版本

  • centos7.6-1811-2nic
  • centos7.4-1708-2nic

升级前注意事项

CentOS7.4和7.6的 OpenSSH 的自带版本

OpenSSH 的版本

  • ssh -V
    • OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
  • rpm -qa zlib
    • zlib-1.2.7-17.el7.x86_64

OpenSSH 官方网站

openssl官方网站

zlib官方网站

到 OpenSSH 官网下载最新版本源码,然后解压后,通过INSTALL文件可以知道其依赖组件的版本要求,然后查看系统组件决定是否升级(没有问题就不升级)

  • OpenSSL 1.0.x >= 1.0.1 or 1.1.0 >= 1.1.0g or any 1.1.1(条件满足,无需升级)
  • Zlib 1.1.4或1.2.1.2或更高版本(早期1.2.x版本有问题)(条件满足,无需升级)

普通服务器操作前注意安装 telnetxinetd 工具,通过 telnet 连接,防止升级过中 ssh 远程中断导致无法远程连接。

rpm包升级流程

1. 制作 rpm 升级包

  1. 分别下载 openssh-8.8p1的源码包,和 x11-ssh-askpass-1.2.4.1 的源码包(手动下载,或者 wget 到打包的服务器上)

    1
    2
    3
    wget https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-8.8p1.tar.gz

    wget https://src.fedoraproject.org/repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz/8f2e41f3f7eaa8543a2440454637f3c3/x11-ssh-askpass-1.2.4.1.tar.gz
  2. 安装打包和编译 openssh-8.8p1 源码的依赖()

    1
    2
    yum install rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel
    #(TODO,perl-devel 依赖是否需要安装,这块找一个新机器重新安装测试一下,没有这个试一试能否编译并打包成功,编译openssh是不需要这个包的,是否制作rpm需要?测试一下)
  3. 创建本地打包目录,并将 opensshx11-ssh-askpass 源码 copy 到指定位置

    1
    2
    3
    mkdir -p /root/rpmbuild/{SOURCES,SPECS}
    cp /root/dev_ops/openssh-8.8p1.tar.gz /root/rpmbuild/SOURCES
    cp /root/dev_ops/x11-ssh-askpass-1.2.4.1.tar.gz /root/rpmbuild/SOURCES/
  4. 解压 openssh 源码包到其他目录,然后 copy 其构建目录下的 openssh.spec 文件到打包目录中的SPECS 子目录下,并修改文件权限

    1
    2
    3
    tar -zxf openssh-8.8p1.tar.gz -C /opt/
    cp /opt/openssh-8.8p1/contrib/redhat/openssh.spec /root/rpmbuild/SPECS/
    chown sshd:sshd /root/rpmbuild/SPECS/openssh.spec
  5. 修改 openssh.spec 文件内容并进行打包

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sed -i -e "s/%global no_x11_askpass 0/%global no_x11_askpass 1/g" openssh.spec

    sed -i -e "s/%global no_gnome_askpass 0/%global no_gnome_askpass 1/g" openssh.spec


    并注释掉 `BuildRequires: openssl-devel < 1.1` 这行内容
    # 因为openssl安装的版本低于1.1

    # 这时就可以rpmbuild打包了
    # 生成源码和rpm文件
    rpmbuild -ba openssh.spec
  6. 压缩并下载生成的 rpm 包,以备后面使用

    1
    2
    cd /root/rpmbuild/RPMS/x86_64
    tar -zcvf openssh-8.8p1_rpm_package.tar.gz *.rpm

2. 升级步骤

  1. 备份配置文件

    1
    2
    3
    mkdir -p /opt/ssh_bak/
    cp /etc/ssh/sshd_config /opt/ssh_bak/
    cp /etc/pam.d/sshd /opt/ssh_bak/
  2. 安装 telnet

    避免 openssh 升级识别无法登陆,安装telnet(同时开启两个窗口)

    1
    2
    3
    4
    5
    6
    7
    # 没有repo源就提前下载然后手动安装
    # yum localinstall xxx 或 rpm -ivh xxx
    yum install telnet-server xinetd -y

    systemctl enable --now xinetd.service

    systemctl enable --now telnet.socket
  3. 配置 telnet 登录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    sed -i 's/^auth [user_unknown=/#&/' /etc/pam.d/login

    cat >> /etc/securetty <<EOF

    pts/0
    pts/1
    pts/2
    pts/3
    EOF
  4. 安装升级 openssh

    1
    2
    tar -zxvf openssh-8.8p1_rpm_package.tar.gz
    yum localinstall ./*.rpm
  5. 启动 ssh 服务,恢复备份文件,并重启 sshd

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    cp /opt/ssh_bak/sshd_config /etc/ssh/sshd_config
    cp /opt/ssh_bak/sshd /etc/pam.d/sshd


    # 添加或修改:
    # PermitRootLogin yes
    # PasswordAuthentication yes
    # UseDNS no
    # 这里主要修改PermitRootLogin yes允许root用户登录,其他两个原有配置都是开启的
    sed -i "s/#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config

    # 修改/etc/ssh/ 目录下key文件的权限
    chmod 600 /etc/ssh/*

    # 重启并添加开机自启
    systemctl restart sshd
    # 因为rpm默认没有systemctl enable sshd 命令需要的文件,所以centos7也需要使用 centos6配置开机自启的命令
    chkconfig sshd on
  6. 验证登录,和升级后 ssh 版本

    新开窗口连接登陆测试,没有问题后再进行下面的关闭telnet步骤。
    注意:请勿关闭当前窗口,另外新开窗口连接没问题,再关闭。

    1
    ssh -V
  7. 关闭 telnet

    注意:开启telnet的root远程登录极度不安全,账号密码都是明文传输,尤其在公网,所以一般只限于在某些情况下内网中ssh无法使用时,临时调测,使用完后,将相关配置复原,彻底关闭telnet服务!

    1
    2
    3
    systemctl stop telnet.socket && systemctl disable telnet.socket

    systemctl stop xinetd.service && systemctl disable xinetd.service

手动升级流程

与 rpm 包升级流程的区别仅在于第4步骤,安装升级 openssh

手动安装时,需要下载 openssh-8.8p1.tar.gz 源码到需要升级的机器上,编译然后安装

参考其他博客内容,暂时不写,验证后再写。

所谓羁绊,

  • 君以志诚待我,我必以志诚报之。

遇到问题及解决

1. 制作 rpm 包遇到的问题

制作时,参考其他博客或文章时,发现所有人默认都添加了 x11-ssh-askpass 这个包,但是查看该包作用时发现是 x11 可视化有关,考虑到我使用的是服务器模式,应该不需要,所以开始的时候,并没有添加这个包,结果制作过程中报错如下,缺少该包。

  • 应该是在specs文件中没有正确去掉,但是也没有深入研究,添加后就解决了。
1
2
3
4
5
6
# 没有添加 x11-ssh-askpass-1.2.4.1.tar.gz 包
error: Bad file: /root/rpmbuild/SOURCES/x11-ssh-askpass-1.2.4.1.tar.gz: No such file or directory


RPM build errors:
Bad file: /root/rpmbuild/SOURCES/x11-ssh-askpass-1.2.4.1.tar.gz: No such file or directory

解决:下载并添加到报错指定的位置即可。

2. /etc/ssh/ 目录下的文件权限不对

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@test-for-qianxin-linshi1 dev_ops]# systemctl restart sshd
Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.
[root@test-for-qianxin-linshi1 dev_ops]#

[root@test-for-qianxin-linshi1 dev_ops]# systemctl status sshd.service
● sshd.service - SYSV: OpenSSH server daemon
Loaded: loaded (/etc/rc.d/init.d/sshd; bad; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2022-01-20 15:04:01 UTC; 51s ago
Docs: man:systemd-sysv-generator(8)
Process: 21036 ExecStop=/etc/rc.d/init.d/sshd stop (code=exited, status=0/SUCCESS)
Process: 21077 ExecStart=/etc/rc.d/init.d/sshd start (code=exited, status=1/FAILURE)
Main PID: 1232 (code=exited, status=0/SUCCESS)

Jan 20 15:04:01 test-for-qianxin-linshi1 sshd[21077]: It is required that your private key files are NOT accessible by others.
Jan 20 15:04:01 test-for-qianxin-linshi1 sshd[21077]: This private key will be ignored.
Jan 20 15:04:01 test-for-qianxin-linshi1 sshd[21077]: Unable to load host key "/etc/ssh/ssh_host_ed25519_key": bad permissions
Jan 20 15:04:01 test-for-qianxin-linshi1 sshd[21077]: Unable to load host key: /etc/ssh/ssh_host_ed25519_key
Jan 20 15:04:01 test-for-qianxin-linshi1 systemd[1]: sshd.service: control process exited, code=exited status=1
Jan 20 15:04:01 test-for-qianxin-linshi1 sshd[21077]: sshd: no hostkeys available -- exiting.
Jan 20 15:04:01 test-for-qianxin-linshi1 systemd[1]: Failed to start SYSV: OpenSSH server daemon.
Jan 20 15:04:01 test-for-qianxin-linshi1 sshd[21077]: [FAILED]
Jan 20 15:04:01 test-for-qianxin-linshi1 systemd[1]: Unit sshd.service entered failed state.
Jan 20 15:04:01 test-for-qianxin-linshi1 systemd[1]: sshd.service failed.

问题:升级后重启sshd服务时报错,通过上面报错可知,/etc/ssh目录下的几个ssh key有问题。

解决:查看该目录有这些文件,那就是权限不对,修改权限为600即可。

批量升级操作

通过 ansible 脚本进行批量升级,

ansible脚本放在该文档的同级目录下,供参考。

可能需要注意的

参考openssh_8.8p1的release

关于启用加密算法的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
For most users, this change should be invisible and there is
no need to replace ssh-rsa keys. OpenSSH has supported RFC8332
RSA/SHA-256/512 signatures since release 7.2 and existing ssh-rsa keys
will automatically use the stronger algorithm where possible.

Incompatibility is more likely when connecting to older SSH
implementations that have not been upgraded or have not closely tracked
improvements in the SSH protocol. For these cases, it may be necessary
to selectively re-enable RSA/SHA1 to allow connection and/or user
authentication via the HostkeyAlgorithms and PubkeyAcceptedAlgorithms
options. For example, the following stanza in ~/.ssh/config will enable
RSA/SHA1 for host and user authentication for a single destination host:

Host old-host
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa

We recommend enabling RSA/SHA1 only as a stopgap measure until legacy
implementations can be upgraded or reconfigured with another key type
(such as ECDSA or Ed25519).

可能值老的远程客户端无法连接到升级后的远端机器上。

xshell6之前可能会遇到报错:

1
找不到匹配的 host key 算法

服务器端日志如下:

1
2
Apr  7 19:51:34 fgfc-web-1 sshd[4355]: Unable to negotiate with 10.2.10.17 port 65226: no matching host key type found. Their offer: ssh-rsa,ssh-dss [preauth]

就是上面默认不支持 ssh-rsa 算法导致

解决

要么服务器端启用 ssh-rsa 算法,要么换一个客户端,例如 putty,或者 xhell6,或者xshell5中ssh-> 安全性->密钥交换,有其他加密算法的也可以。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 ligongzhao
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信