CentOS Linux 7 的生命周期(EOL)將於 2024 年 6 月 30 日終止,目前仍然有大量伺服器使用 CentOS 7。
官方的 YUM 源中 OpenSSH 停止在 7.4 版本,每年低版本 OpenSSH 都會爆出新漏洞,需要升級最新版 OpenSSH 往往需要下載原始碼編譯安裝,但是很多內網伺服器缺少編譯環境,Github 上 boypt 大佬提供了最新版 OpenSSH 原始碼構建 rpm 包的腳本,並嵌入了新版 OpenSSL,使升級最新版 OpenSSH 變得簡單了。
生成 rpm 包#
準備打包環境#
最好在 CentOS 7 的環境中打包,可以使用 CentOS 7 的虛擬機,也可以部署 CentOS 7 的 WSL,進入 CentOS 7,執行下面的命令安裝開發工具和依賴,本次打包環境為 CentOS 7.9
yum groupinstall -y "Development Tools"
yum install -y imake rpm-build pam-devel krb5-devel zlib-devel libXt-devel libX11-devel gtk2-devel perl perl-IPC-Cmd
下載打包腳本#
可以使用 git clone 拉取腳本,也可以從 Github 下載 zip 解壓,這裡使用 git
git clone https://github.com/boypt/openssh-rpms.git
執行 pullsrc.sh 下載原始碼#
執行腳本目錄下 pullsrc.sh 會自動下載 OpenSSH 和 OpenSSL 以及 x11-ssh-askpass 的最新版原始碼文件
下載完成後會保存到 openssh-rpms/downloads 目錄下,openssh-rpms 是上一步下載的腳本目錄
[root@localhost ~]# cd openssh-rpms/
[root@localhost openssh-rpms]# ./pullsrc.sh
執行 compile.sh 編譯原始碼構建 rpm 包#
執行腳本目錄下 compile.sh 解壓原始碼包進行編譯,最後在 openssh-rpms/el7/RPMS/x86_64/ 目錄下生成最新版 OpenSSH 的 rpm 包
編譯過程與系統性能相關,使用 WSL 的 CentOS 7 打包在 3 分鐘左右,虛擬機 CentOS 7 根據分配的 CPU 和內存大小時間會有差異
[root@localhost openssh-rpms]# ./pullsrc.sh
rpm 歸檔#
rpm 構建完成後可以使用 tar 歸檔,將 4 個 rpm 包壓縮為 .tar.gz 文件,拷貝到需要升級 ssh 的 CentOS 的伺服器上解壓安裝
[root@localhost openssh-rpms]# cd el7/RPMS/x86_64/
[root@localhost x86_64]# tar czvf openssh-9.8_el7.tar.gz openssh*.rpm
伺服器安裝新版 OpenSSH#
注意:若使用 ssh 登入升級伺服器,不要斷開 ssh 連接,升級結束後新建 ssh 窗口可以正常登入後才算升級完成,測試升級伺服器為 CentOS 7.9
拷貝安裝包,卸載舊版 OpenSSH#
首先把打包好的 openssh-9.8_el7.tar.gz 使用 scp 或者 sftp 拷貝到目標伺服器,這裡拷貝到了 opt 目錄下,然後卸載伺服器的舊版 openssh
[root@server ~]# yum remove openssh* -y
安裝新版 OpenSSH#
進入 opt 目錄,解壓 openssh-9.8_el7.tar.gz,然後使用 rpm 命令安裝即可
[root@server ~]# cd /opt
[root@server opt]# tar xf openssh-9.8_el7.tar.gz
[root@server opt]# rpm -ivh openssh*.rpm
問題處理#
安裝完重啟 sshd 會報錯,查看錯誤信息發現是 /etc/ssh/ssh_host_ed25519_key
文件權限為 0640 報錯,修改 ssh_host_*_key 文件權限後重啟 sshd 即可
[root@server opt]# chmod 0600 /etc/ssh/ssh_host_*_key
[root@server opt]# systemctl restart sshd
sshd 服務正常運行後新建 ssh 連接窗口,測試是否可以正常登入,一切正常則升級完成