背景

服务器自带OpenSSH通常为7.x版本,会包含很多漏洞,因此需要将其版本进行升级,但是又无法直接通过yum进行升级。

准备工作

  1. 安装编译所需依赖软件包:

    1
    yum install -y wget gcc pam-devel libselinux-devel zlib-devel openssl-devel
  2. 下载 OpenSSH 安装包上传至服务器或 wget 直接下载:

    1
    2
    cd /usr/local/src
    wget -O openssh.tar.gz https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-9.0p1.tar.gz
  3. 备份配置文件,一般卸载的时候都会把配置文件以sshd_config.rpmsave的方式另存一份,但是/etc/pam.d/sshd这个配置文件并没有另存,所以建议都备份一下。

    1
    2
    cp /etc/ssh/sshd_config sshd_config.backup
    cp /etc/pam.d/sshd sshd.backup
  4. 删除低版本OpenSSH的的rpm包

    1
    rpm -e --nodeps `rpm -qa | grep openssh`

开始安装

  1. 解压

    1
    2
    tar -zxvf openssh.tar.gz
    cd openssh-9.0p1
  2. 编译配置

    1
    ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib --with-tcp-wrappers --with-ssl-dir=/usr/local/ssl --without-hardening

    如果配置过程出现如下错误:

    configure: error: PAM headers not found

    可通过安装依赖解决:yum -y install pam-devel

  3. 编译安装

    1
    make && make install

配置

  1. 调整文件权限

    1
    chmod 600 /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key
  2. 复制配置文件

    1
    2
    cp -a contrib/redhat/sshd.init /etc/init.d/sshd
    chmod u+x /etc/init.d/sshd
  3. 还原配置文件

    1
    2
    mv ../sshd.backup /etc/pam.d/sshd
    mv ../sshd_config.backup /etc/ssh/sshd_config
  4. 添加添加自启服务ssh到开机启动项

    1
    2
    chkconfig --add sshd
    chkconfig sshd on
  5. 重启服务

    1
    systemctl restart sshd

验证结果

1
ssh -V

运行结果

OpenSSH_9.0p1, OpenSSL 1.0.2k-fips 26 Jan 2017

到此,OpenSSH升级完成,可新增一个窗口通过ssh确认是否能连接服务器,确认无误之前不要关闭现有连接窗口,防止出现问题无法登录。

清理源代码

1
rm -rf /usr/local/src/openssh*

修改默认端口

通过修改/etc/ssh/sshd_config文件中的Port属性为指定端口,重启sshd服务即可。如果无法连接,请检测防火墙是否开启相应端口。

可能出现的问题

升级后,如果发现ssh可以连接,但是sftp无法连接,解决方式如下:

1
2
3
4
5
6
7
# 首先通过命令找到sftp-server的路径
find / -name 'sftp-server'
# 运行结果:/usr/libexec/sftp-server


# 修改配置文件中的路径
vim /etc/ssh/sshd_config

将原有配置:

Subsystem sftp /usr/libexec/openssh/sftp-server

修改为:

Subsystem sftp /usr/libexec/sftp-server