步驟如下:
1、准備工作
1.1、下載相關軟件包
OpenSSH需要依賴ZLIB和OpenSSL,因此需要從官網下載三者的源碼包。需要注意的是:OpenSSH最新版8.1p1依賴的OpenSSL版本為1.0.2k,而不是其最新版1.1.0e(使用此版會升級失敗),ZLIB可以使用最新 版1.2.11。 三者源碼下載地址:
http://www.zlib.net/
http://www.openssl.org/
http://www.openssh.org/
1.2、查看系統當前軟件版本
# rpm -q zlib
# openssl version
# ssh -V
1.3、配置在線yum源
# cd /etc/yum.repos.d
# rm -rf * #刪除當前所有yum源文件
# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo #連接阿里雲在線源
1.4、安裝telnet服務並啟用
因升級OpenSSH過程中需要卸載現有OpenSSH, 因此為了保持服務器的遠程連接可用,需要啟用telnet服務作為替代,如升級出現問題,也可通過telnet登錄服務器進行回退。
A、安裝telnet服務
# yum -y install telnet-server*
B、啟用telnet
先關閉防火牆,否則telnet可能無法連接
# service iptables stop
# chkconfig iptables off
# vi /etc/xinetd.d/telnet
將其中disable字段的yes改為no以啟用telnet服務
# mv /etc/securetty /etc/securetty.old #允許root用戶通過telnet登錄
# /etc/init.d/xinetd start #啟動telnet服務
# chkconfig xinetd on #使telnet服務開機啟動,避免升級過程中服務器意外重啟后無法遠程登錄系統
# telnet [ip] #新開啟一個遠程終端以telnet登錄驗證是否成功啟用
1.5、安裝編譯所需工具包
# yum -y install gcc pam-devel zlib-devel
2、正式升級
2.1、升級ZLIB
A、解壓zlib_1.2.11源碼並編譯
# tar -zxvf zlib-1.2.11.tar.gz
# cd zlib-1.2.11
# ./configure --prefix=/usr
# make
B、卸載當前zlib
注意:此步驟必須在步驟A執行完畢后再執行,否則先卸載zlib后,/lib64/目錄下的zlib相關庫文件會被刪除,步驟A編譯zlib會失敗。
# rpm -e --nodeps zlib
C、安裝之前編譯好的zlib
# make install 在zlib編譯目錄執行如下命令
D、共享庫注冊
zlib安裝完成后,會在/usr/lib目錄中生產zlib相關庫文件,需要將這些共享庫文件注冊到系統中。
# echo '/usr/lib' >> /etc/ld.so.conf
# ldconfig #更新共享庫cache
2.2、升級OpenSSL
A、備份當前openssl
# find / -name openssl
/usr/lib64/openssl
/usr/bin/openssl
/etc/pki/ca-trust/extracted/openssl
# mv /usr/lib64/openssl /usr/lib64/openssl.old
# mv /usr/bin/openssl /usr/bin/openssl.old
# mv /etc/pki/ca-trust/extracted/openssl /etc/pki/ca-trust/extracted/openssl.old
如下兩個庫文件必須先備份,因系統內部分工具(如yum、wget等)依賴此庫,而新版OpenSSL不包含這兩個庫
# cp /usr/lib64/libcrypto.so.10 /usr/lib64/libcrypto.so.10.old
# cp /usr/lib64/libssl.so.10 /usr/lib64/libssl.so.10.old
B、卸載當前openssl
# rpm -qa | grep openssl
openssl-1.0.1e-42.el6.x86_64
# rpm -e --nodeps openssl-1.0.1e-42.el6.x86_64
# rpm -qa | grep openssl
C、解壓openssl_1.0.2k源碼並編譯安裝
# tar -zxvf openssl-1.0.2k.tar.gz
# cd openssl-1.0.2k
# ./config --prefix=/usr --openssldir=/etc/ssl --shared zlib #必須加上--shared,否則編譯時會找不到新安裝的openssl的庫而報錯
# make
# make test #必須執行這一步結果為pass才能繼續,否則即使安裝完成,ssh也無法使用
# make install
# openssl version -a #查看是否升級成功
D、恢復共享庫
由於OpenSSL_1.0.2k不提供libcrypto.so.10和libssl.so.10這兩個庫,而yum、wget等工具又依賴此庫,因此需要將先前備份的這兩個庫進行恢復,其他的可視情況考慮是否恢復。
# mv /usr/lib64/libcrypto.so.10.old /usr/lib64/libcrypto.so.10
# mv /usr/lib64/libssl.so.10.old /usr/lib64/libssl.so.
2.3、升級OpenSSH
A、備份當前openssh
# mv /etc/ssh /etc/ssh.old
B、卸載當前openssh
# rpm -qa | grep openssh
openssh-clients-5.3p1-111.el6.x86_64
openssh-server-5.3p1-111.el6.x86_64
openssh-5.3p1-111.el6.x86_64
openssh-askpass-5.3p1-111.el6.x86_64
# rpm -e --nodeps openssh-5.3p1-111.el6.x86_64
# rpm -e --nodeps openssh-server-5.3p1-111.el6.x86_64
# rpm -e --nodeps openssh-clients-5.3p1-111.el6.x86_64
# rpm -e --nodeps openssh-askpass-5.3p1-111.el6.x86_64
# rpm -qa | grep openssh 查看是否卸載成功
C、openssh安裝前環境配置
# install -v -m700 -d /var/lib/sshd
# chown -v root:sys /var/lib/sshd
# groupadd -g 50 sshd
# useradd -c 'sshd PrivSep' -d /var/lib/sshd -g sshd -s /bin/false -u 50 sshd
D、解壓openssh_7.4p1源碼並編譯安裝
# tar -zxvf openssh-8.1p1.tar.gz
# cd openssh-8.1p1
# ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib --with-openssl-includes=/usr --with-privsep-path=/var/lib/sshd
# make
# make install
E、openssh安裝后環境配置
# 在openssh編譯目錄執行如下命令
# install -v -m755 contrib/ssh-copy-id /usr/bin
# install -v -m644 contrib/ssh-copy-id.1 /usr/share/man/man1
# install -v -m755 -d /usr/share/doc/openssh-8.1p1
# install -v -m644 INSTALL LICENCE OVERVIEW README* /usr/share/doc/openssh-8.1p1
# ssh -V #驗證是否升級成功
F、啟用OpenSSH服務
# 在openssh編譯目錄執行如下目錄
# echo 'X11Forwarding yes' >> /etc/ssh/sshd_config
# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config #允許root用戶通過ssh登錄
# cp -p contrib/redhat/sshd.init /etc/init.d/sshd
# chmod +x /etc/init.d/sshd
# chkconfig --add sshd
# chkconfig sshd on
# chkconfig --list sshd
# /etc/init.d/sshd restart
注意:如果升級操作一直是在ssh遠程會話中進行的,上述sshd服務重啟命令可能導致會話斷開並無法使用ssh再行登入(即ssh未能成功重啟),此時需要通過telnet登入再執行sshd服務重啟命令。
3、善后工作
新開啟遠程終端以ssh [ip]登錄系統,確認一切正常升級成功后,只需關閉telnet服務以保證系統安全性即可。
# mv /etc/securetty.old /etc/securetty
# chkconfig xinetd off
# /etc/init.d/xinetd stop