rpmbuild入門知識
openssh/ssl二進制升級
文章目錄
- 前言
- 一、資源準備
- 1.下載openssh、openssl二進制包
- 2.安裝rpmbuild工具
- 3.拷貝源碼包到SOURCES目錄下
- 4.系統開啟telnet,防止意外導致shh無法連接
- 5.編譯工具安裝
- 6.補充說明
- 二、制作 OpenSSL RPM 包
- 1.編寫 SPEC 文件
- 2.驗證 SPEC 文件
- 3.執行構建命令
- 4.查看構建完成的rpm包
- 三、通過RPM包更新 OpenSSL
- 1.檢查并備份舊openssl相關文件
- 2.卸載舊版本openssl
- 3.安裝新版openssl
- 4.驗證openssl版本
前言
2025年第一個漏洞登場,系統中目前在使用的是OpenSSH_7.4p1, OpenSSL 1.0.2k-fips,然后就收到了漏掃團隊的郵件,說該版本的openssh存在Openssh存在遠程代碼執行漏洞(CVE-2024-6387),因此需要升級到7.9版本及以上。在2024年8月份也寫過一篇通過二進制方式升級openssh的文章,也就是頂部的第二篇文章,但是過程比較繁瑣。本次將使用rpmbuild的知識,將源碼包構建為RPM包形式,實現一鍵部署升級,提高效率。
一、資源準備
系統
centos_7.6、x86架構
old | new |
---|---|
openssh_7.4p1 | openssh_9.8p1 |
OpenSSL 1.0.2k-fips | openssl-1.1.1s |
1.下載openssh、openssl二進制包
1、下載openssh源碼包
[root@localhost ~]# wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz
--2025-01-06 11:02:15-- https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz
Resolving cdn.openbsd.org (cdn.openbsd.org)... 146.75.115.52, 2a04:4e42:15::820
Connecting to cdn.openbsd.org (cdn.openbsd.org)|146.75.115.52|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1910393 (1.8M) [application/octet-stream]
Saving to: ‘openssh-9.8p1.tar.gz’38% [=========================================> 729,088 49.9KB/s eta 22s2、下載openssl源碼包
[root@localhost ~]# wget https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_1_1_1s.tar.gz
2.安裝rpmbuild工具
[root@localhost ~]# yum install -y rpm-build
[root@localhost ~]# yum install rpmdevtools
[root@localhost ~]# yum install rpmlint -y #spec文件檢查工具
[root@localhost ~]# vim /root/.rpmmacros
%_topdir /export/rpmbuild #/root/.rpmmacros文件是存儲各種宏定義,比如_topdir宏的值來自定義打包路徑
創建rpmbuild目錄
[root@localhost ~]# cd /export/
[root@localhost /export]# rpmdev-setuptree
[root@localhost /export]# cd rpmbuild && ls
BUILD RPMS SOURCES SPECS SRPMS
3.拷貝源碼包到SOURCES目錄下
[root@localhost ~]# mv openssh-9.8p1.tar.gz /export/rpmbuild/SOURCES
[root@localhost ~]# mv OpenSSL_1_1_1s.tar.gz /export/rpmbuild/SOURCES
4.系統開啟telnet,防止意外導致shh無法連接
[root@localhost ~]# yum install -y telnet-server
[root@localhost ~]# yum install -y telnet
[root@localhost ~]# yum install -y xinetd #也可以不裝
[root@localhost ~]# systemctl start telnet.socket && systemctl start xinetd.service#因為默認情況下系統是不允許root用戶telnet遠程登錄的。如果要使用root用戶直接登錄,需設置如下內容
[root@localhost ~]# echo 'pts/0' >> /etc/securetty
[root@localhost ~]# echo 'pts/1' >> /etc/securetty#開啟telnet連接
[root@localhost ~]# telnet localhost
輸入用戶名
輸入密碼
完成登錄
5.編譯工具安裝
[root@localhost ~]# yum install -y gcc make gcc-c++ perl perl-WWW-Curl
至此,前期資源準備完成
6.補充說明
1、OpenSSH-9.8p1依賴OpenSSL-1.1.1及以上版本, 因此需要先升級openssl2、OpenSSH-8.6后默認為不允許root登錄3、較新版本的CentOS7中 pam_stack.so模塊已經被棄用刪除, 請備份 /etc/pam.d/sshd4、默認允許使用PAM登錄認證;5、默認允許使用X11Forwarding圖形模塊;6、需修改ssh_host_rsa_key、ssh_host_ecdsa_key、ssh_host_ed25519_key這三個文件的權限,OpenSSH-8.6之后縮小了這三個文件的權限為0600, 大于該權限將會導致SSHD啟動失敗
二、制作 OpenSSL RPM 包
1.編寫 SPEC 文件
代碼如下(示例):
Name: openssl
Version: 1.1.1s
Release: 1%{?dist}
Summary: Utilities from the general purpose cryptography library with TLS implementation
Group: System Environment/Libraries
License: GPLv2+
URL: https://www.openssl.org/
Source0: https://www.openssl.org/source/%{name}-%{version}.tar.gz
BuildRequires: make gcc perl perl-WWW-Curl
Requires: %{name} = %{version}-%{release}
BuildRoot: %_topdir/BUILDROOT%global openssldir /usr/openssl%description
The OpenSSL toolkit provides support for secure communications between
machines.%package devel
Summary: Secure Sockets Layer and cryptography static libraries and headers
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
%description devel
The OpenSSL devel tool%prep
%setup -q%build
./config --prefix=%{openssldir} --openssldir=%{openssldir}
make %{?_smp_mflags}%install
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}
%make_install
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_libdir}
ln -sf %{openssldir}/lib/libssl.so.1.1 %{buildroot}%{_libdir}
ln -sf %{openssldir}/lib/libcrypto.so.1.1 %{buildroot}%{_libdir}
ln -sf %{openssldir}/bin/openssl %{buildroot}%{_bindir}# 安裝man手冊
mkdir -p %{buildroot}%{_mandir}/man1
cp -p man/man1/openssl.1 %{buildroot}%{_mandir}/man1/%clean
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}%files
%{openssldir}
%defattr(-,root,root)
%{_bindir}/openssl
%{_libdir}/libcrypto.so.1.1
%{_libdir}/libssl.so.1.1
%{_mandir}/man1/openssl.1 # 確保man頁面文件被列出%files devel
%{openssldir}/include/*
%defattr(-,root,root)%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
2.驗證 SPEC 文件
代碼如下(示例):
errors為0則驗證通過
[root@localhost SPECS]# rpmlint openssl.spec
openssl.spec: W: invalid-url Source0: https://www.openssl.org/source/openssl-1.1.1s.tar.gz <urlopen error ('_ssl.c:602: The handshake operation timed out',)>
0 packages and 1 specfiles checked; 0 errors, 1 warnings.
3.執行構建命令
[root@localhost SPECS]# rpmbuild -D "version 1.1.1s" -ba openssl.spec
4.查看構建完成的rpm包
注意事項: 上述 SPEC文件只構建了 openssl,openssl-devel和openssl-debuginfo三個包, 而且 更新之后 man openssl 會提示找不到手冊,對比網上其他的SPEC文件少了很多內容,總之不影響使用
三、通過RPM包更新 OpenSSL
1.檢查并備份舊openssl相關文件
[root@localhost SPECS]# whereis openssl
openssl: /usr/bin/openssl /usr/lib64/openssl /usr/include/openssl /usr/share/man/man1/openssl.1ssl.gz
找到幾個就備份幾個
[root@localhost SPECS]# cp -rp /usr/bin/openssl /usr/bin/openssl.old
[root@localhost SPECS]# cp -rp /usr/lib64/openssl /usr/lib64/openssl.old
[root@localhost SPECS]# cp -rp /usr/include/openssl /usr/include/openssl.old
[root@localhost SPECS]# cp -rp /usr/share/man/man1/openssl.1ssl.gz /usr/share/man/man1/openssl.1ssl.gz.old
2.卸載舊版本openssl
[root@localhost SPECS]# rpm -e openssl --nodeps
3.安裝新版openssl
升級openssl注意事項
1、只需要升級 openssl-1.1.1s
2、openssl-devel可以不升級
3、openssl-libs 切記不能升級
升級
[root@localhost SPECS]# rpm -ivh ../RPMS/x86_64/openssl-1.1.1s-1.el7.x86_64.rpm --nodeps
準備中... ################################# [100%]
正在升級/安裝...1:openssl-1.1.1s-1.el7 ################################# [100%]
4.驗證openssl版本
至此,openssl升級完成.緊接著下篇文章升級openssh