OpenSSH rpm包构建与升级

环境

  • 硬件平台: PVE-KVM x86_64
  • 系统版本: CentOS 7.9 64bit
  • 当前软件版本: OpenSSH-7.4p1 OpenSSL-1.02K
  • 目标软件版本: OpenSSH-9.7p1 OpenSSL-1.1.1W

说明

  • OpenSSH-9.7p1依赖OpenSSL-1.1.1及以上版本, 请先升级OpenSSL, 参照这里
  • OpenSSH-8.6后默认为不允许root登录
  • 较新版本的CentOS7中 pam_stack.so模块已经被弃用删除, 请备份 /etc/pam.d/sshd
  • 默认允许使用PAM登录认证;
  • 默认允许使用X11Forwarding图形模块;
  • 需修改ssh_host_rsa_keyssh_host_ecdsa_keyssh_host_ed25519_key这三个文件的权限, OpenSSH-8.6之后缩小了这三个文件的权限为0600, 大于该权限将会导致SSHD启动失败

一、 OpenSSH rpm包构建

1.1 安装依赖

~]# yum install libXt libXt-devel imake gtk2-devel
~]# yum install rpm-build rpmlint rpmdevtools curl

1.2 rpmbuild 目录相关

注意:
下面两个操作请不要使用 root 用户操作

创建目录

~]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

目录配置

~]$ echo "%_topdir %{getenv:HOME}/rpmbuild" > ~/.rpmmacros

  • %_topdir:RPM 构建的顶层目录宏
  • %{getenv:HOME}:获取用户主目录的环境变量
  • ~/.rpmmacros:用户 RPM 配置文件

1.3 下载源码

  • 下载 OpenSSH-9.7p1和x11-ssh-askpass-1.2.4.1源码到 ~/rpmbuild/SOURCES目录
~]$ curl -o ~/rpmbuild/SOURCES/openssh-9.7p1.tar.gz https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-9.7p1.tar.gz
~]$ curl -o ~/rpmbuild/SOURCES/x11-ssh-askpass-1.2.4.1.tar.gz 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

1.4 配置 .SPEC文件

  • 从源码提取.SPEC 文件到SPEC目录

    ~]$ tar -xf ~/rpmbuild/SOURCES/openssh-9.7p1.tar.gz -C ~/rpmbuild/SPECS openssh-9.7p1/contrib/redhat/openssh.spec --strip-components=3 
  • 修改 .SPEC 文件 %pre server 区域新增如下配置, 备份ssh配置

    cp -Rf /etc/ssh{,.back}
  • 修改 .SPEC 文件 %post server 区域下面新增如下配置, 配置sshd

    sed -i -e "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
    sed -i -e "s/#UsePAM no/UsePAM yes/g" /etc/ssh/sshd_config
    sed -i -e "s/#X11Forwarding no/X11Forwarding yes/g" /etc/ssh/sshd_config
    chmod +x /etc/init.d/sshd
    chmod 600 /etc/ssh/ssh_host_rsa_key
    chmod 600 /etc/ssh/ssh_host_ecdsa_key
    chmod 600 /etc/ssh/ssh_host_ed25519_key
  • 修改 .SPEC 文件 %install 保留原pam配置

    # 注释这行
    #install -m644 contrib/redhat/sshd.pam $RPM_BUILD_ROOT/etc/pam.d/sshd

    # 增加此行
    install -m644 /etc/pam.d/sshd $RPM_BUILD_ROOT/etc/pam.d/sshd
  • 修改%configure 选项, without_openssl选项关闭, 并添加openssl-1.1.1w的路径

    .... # 前面代码省略
    --with-ssl-dir=/usr/openssl \ # 根据 rpm 安装 openssl 的路径决定的
    # %if ! %{without_openssl}
    # --without-openssl \
    # %endif
    .... # 后面代码省略

1.5 检查 .SPEC 文件

如果没有 error就可以下一步构建了

[dev@pve-centos7 SPECS]$ rpmlint ./openssh.spec 
./openssh.spec:95: W: unversioned-explicit-obsoletes ssh
./openssh.spec:132: W: unversioned-explicit-obsoletes ssh-clients
./openssh.spec:137: W: unversioned-explicit-obsoletes ssh-server
./openssh.spec:147: W: unversioned-explicit-obsoletes ssh-extras
./openssh.spec:153: W: unversioned-explicit-obsoletes ssh-extras
./openssh.spec:280: W: macro-in-comment %{_bindir}
./openssh.spec:349: W: mixed-use-of-spaces-and-tabs (spaces: line 349, tab: line 208)
./openssh.spec: W: invalid-url Source1: http://www.jmknoble.net/software/x11-ssh-askpass/ x11-ssh-askpass-1.2.4.1.tar.gz <urlopen error unknown url type: socks5>
./openssh.spec: W: invalid-url Source0: https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/ openssh-9.7p1.tar.gz ''
0 packages and 1 specfiles checked; 0 errors, 9 warnings.
[dev@pve-centos7 SPECS]$

1.6 构建 OpenSSH rpm包

~] $ rpmbuild -ba ~/rpmbuild/SPECS/openssh.spec

如下结果一般就没什么问题了

图

二、 更新 OpenSSH-9.7p1

2.1 输出rpm包详情

[dev@pve-centos7 rpmbuild]$ tree -L 3 RPMS/
RPMS/
└── x86_64
├── openssh-9.7p1-1.el7.x86_64.rpm
├── openssh-askpass-9.7p1-1.el7.x86_64.rpm
├── openssh-askpass-gnome-9.7p1-1.el7.x86_64.rpm
├── openssh-clients-9.7p1-1.el7.x86_64.rpm
├── openssh-debuginfo-9.7p1-1.el7.x86_64.rpm
├── openssh-server-9.7p1-1.el7.x86_64.rpm
├── openssl-1.1.1w-1.el7.x86_64.rpm
├── openssl-debuginfo-1.1.1w-1.el7.x86_64.rpm
└── openssl-devel-1.1.1w-1.el7.x86_64.rpm
1 directory, 9 files
[dev@pve-centos7 rpmbuild]$

2.2 rpm -Uvh 更新 OpenSSH

注意:
更新的前提是, openssl 已经升级至 openssl-1.1.1w 版本

  • 升级openssh的时候, 涉及openssl相关的组件:
    • 只需要升级 openssl-1.1.1w
    • openssl-devel可以不升级
    • openssl-libs 切记不能升级
# 注意 openssl 的版本
[root@pve-centos7 x86_64]# rpm -aq | grep openssl
openssl-libs-1.0.2k-26.el7_9.x86_64
openssl-1.1.1w-1.el7.x86_64
openssl-devel-1.0.2k-1.el7.x86_64
[root@pve-centos7 x86_64]#

# 更新 openssh
[root@pve-centos7 x86_64]# rpm -Uvh openssh-9.7p1-1.el7.x86_64.rpm openssh-server-9.7p1-1.el7.x86_64.rpm openssh-clients-9.7p1-1.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:openssh-9.7p1-1.el7 ################################# [ 17%]
2:openssh-server-9.7p1-1.el7 ################################# [ 33%]
3:openssh-clients-9.7p1-1.el7 ################################# [ 50%]
Cleaning up / removing...
4:openssh-clients-7.4p1-23.el7_9 ################################# [ 67%]
5:openssh-server-7.4p1-23.el7_9 ################################# [ 83%]
6:openssh-7.4p1-23.el7_9 ################################# [100%]
[root@pve-centos7 x86_64]#

2.3 重启 OpenSSH

注意:
操作不当会导致sshd服务无法启动, 请确保你有其他登录服务器的方式

systemctl daemon-reload
systemctl restart sshd

三、 常见问题

3.1 ssh升级成功但是登录失败

  • 报错: PAM unable to dlopen(/usr/lib64/security/pam_stack.so): /usr/lib64/security/pam_stack.so: cannot open shared object file

  • 原因: pam_stack.so 在较新版本的CentOS中已经弃用并删除

  • 解决: 不升级 /etc/pam.d/sshd 文件, 或者使用旧版本的文件替换

3.2 yum update 报错

  • openssl更新到了 openssl-1.1.1w, 但是对应的openssl-devel和openssl-libs没有更新, 版本的原因, 也不推荐更新这两个
  • 解决: /etc/yum.conf 添加 exclude=openssl

四、 附件