前言

学校信网办对服务器进行了安全扫描,然后报了一大堆高危漏洞出来,仔细看了一下以后基本都是 ssh 的漏洞,apt 源只到了 8.2p1,想安装最新的 9.3p1 只能从源码安装了。服务器系统版本为 Ubuntu 20.04.

一、安装

1.1 编译安装 OpenSSL

由于 OpenSSL 1.1.1 将于2023-09-11结束支持,故而直接从源码编译 3.1.0 版本.

  1. 安装必要的依赖项,包括编译器、开发工具包、Zlib 开发库.

    1
    2
    3
    4
    sudo apt update
    # build-essential 提供编译支持
    # zlib1g-dev 提供zlib压缩库支持
    sudo apt install build-essential zlib1g-dev -y
  2. 获取源码,并进入对应目录,最新版本可从官网获取.

    1
    2
    3
    4
    5
    6
    7
    8
    # 下载
    wget https://www.openssl.org/source/openssl-3.1.0.tar.gz

    # 解压
    tar -zxf openssl-3.1.0.tar.gz

    # 进入目录
    cd openssl-3.1.0/
  3. 编译安装,安装路径为/usr/local/openssl-3.1.0

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # --prefix 设置安装目录
    # --openssldir 设置配置和运行文件的存储目录
    ./config --prefix=/usr/local/openssl-3.1.0 --openssldir=/usr/local/openssl-3.1.0

    # 编译
    make

    # install_sw 指示编译器在编译完成后安装OpenSSL库和头文件到系统中。
    sudo make install_sw
  4. 配置动态库,编译后的版本需要动态库支持才可以正常运行.

    1
    2
    3
    4
    5
    6
    7
    # 添加动态库配置文件
    sudo vi /etc/ld.so.conf.d/openssl-3.1.0.conf
    # 加入以下内容
    /usr/local/openssl-3.1.0/lib64

    # 刷新动态库,使配置生效
    `sudo ldconfig`
  5. 验证,若未配置动态库,此命令会报依赖异常,后续 openssh 编译也会报错.

1
/usr/local/openssl-3.1.0/bin/openssl version

1.2 编译安装 OpenSSH

在安装过程中要保证 ssh 连接不会中断,否则可能存在无法连接的问题,需要通过 ipmi 进行维护。

  1. 备份现有配置,一般情况下配置会复用。

    1
    2
    cp /etc/ssh/sshd_config sshd_config.backup
    cp /etc/pam.d/sshd sshd.backup
  2. 清理现有 apt 安装的 openssh-server 版本。

    1
    2
    3
    sudo apt remove openssh-server
    # 可选步骤,清理不需要的安装包,默认清理的应该是ncurses-term openssh-sftp-server ssh-import-id
    sudo apt autoremove
  3. 安装必要的依赖项,包括编译器、开发工具包、OpenSSL 开发库、Zlib 开发库和 PAM 开发库。

    1
    2
    3
    4
    5
    6
    7
    8
    sudo apt update
    # build-essential 提供编译支持
    # libssl-dev 提供基本的1.1.1f版本支持,后续会替换为3.1.0
    # zlib1g-dev 提供zlib压缩库支持
    # libpam0g-dev 提供PAM支持
    # libkrb5-dev 提供Kerberos 5 协议支持
    # libgssglue-dev 提供GSSAPI支持
    sudo apt install build-essential libssl-dev zlib1g-dev libpam0g-dev libkrb5-dev libgssglue-dev -y
  4. 获取源码,并进入对应目录,最新版本可从官网获取.

    1
    2
    3
    4
    5
    6
    7
    8
    # 下载
    wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.3p1.tar.gz

    # 解压
    tar -xzf openssh-9.3p1.tar.gz

    # 进入目录
    cd openssh-9.3p1
  5. 编译安装,安装路径为/usr,配置路径复用为/etc/ssh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # --prefix 指定安装路径
    # --sysconfdir 指定配置信息路径
    # --with-privsep-path 指定特权分离路径
    # --with-ssl-dir 指定ssl库路径,启用openssl支持,若想使用系统默认版本,请将路径修改为 /usr/include/openssl
    # --with-pam 启用PAM支持
    # --with-zlib 启用zlib支持
    # --with-kerberos5 启用gssapi支持
    ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-privsep-path=/var/empty --with-ssl-dir=/usr/local/openssl-3.1.0 --with-pam --with-zlib --with-kerberos5

    # 编译 openssh-server
    make

    # 安装
    sudo make install
  6. 验证

    1
    2
    ssh -V
    > OpenSSH_9.3p1, OpenSSL 3.1.0 14 Mar 2023
  7. 配置服务,手动编译安装后,需要重新配置服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    ## 删除旧有符号链接
    sudo rm /etc/systemd/system/sshd.service

    ## 解除服务锁定
    sudo systemctl unmask ssh.service

    ## 配置自启动
    sudo vi /etc/systemd/system/sshd.service
    ## 添加以下内容
    [Unit]
    Description=OpenSSH Daemon
    After=network.target auditd.service

    [Service]
    ExecStart=/usr/sbin/sshd -D
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=always

    [Install]
    WantedBy=multi-user.target

    ## 配置sftp
    sudo vi /etc/ssh/sshd_config
    ## 修改以下内容
    ## 将 /usr/lib/openssh/sftp-server 改为 /usr/libexec/sftp-server
    Subsystem sftp /usr/libexec/sftp-server

    ## 启动
    sudo systemctl daemon-reload
    sudo systemctl enable sshd.service
    sudo systemctl start sshd.service
    sudo systemctl status sshd.service

参考文档