由於全網安全檢查需要,要對項目中1280台Linux系統升級SSH及openssl,其中:
OPENSSH 升級為 openssh 7.9p
下載地址:
openssl 升級為 1.0.2o
下載地址:
涉及的系統版本為:
rhel5 32 位、64位
rhel6 32 位、64位
rhel7 64位
openssl下對應的兩個關鍵庫文件(用多了就知道,這兩個東西出問題了就該找誰):
libssl.so
libcrypto.so
准備工具:
1. openssl 編譯安裝包
2. ssh 安裝包(已經被改造成公司自用版)
3. ansible (批量操作軟件)
前期工作:
1. 根據不同系統版本,打包為不同的 openssl 及 ssh 升級包,內部包含升級腳本
openssl 升級命令為 :
# tar -zxf openssl-1.0.2o.tar.gz
# cd openssl-1.0.2o
# make clean
# ./config --prefix=/home/caya/openssh --shared /*默認路徑為 /usr ,為避免遠古腳本無法執行,此處修改為 /home/caya/openssh */
(32位加上參數 -m32)
# make && make install
/*新測試,可不需要 -m32 ,包本身必須干凈,別用編譯過的再打包給別人編譯!!!*/
openssh 升級命令為:
# tar -zxf openssh-7.9p1.tar.gz
# cd openssh-7.9p1
# mv /etc/ssh /etc/ssh.bak 備份配置文件
# vi version.h /* 修改成你喜歡的版本號,此處可忽略*/
# ./configure /* 請寫到一行 */
--prefix=/home/caya/openssh /*安裝目錄,默認為 /usr*/
--sysconfdir=/home/caya/openssh/etc/ssh /*配置文件目錄,默認為 /ect/ssh */
--with-md5-passwords /*這個隨便吧*/
--with-ssl-dir=/home/caya/openssl /*此處是關鍵!要與前面ssl安裝的路徑一致!*/
# make && make install
2. 編寫腳本根據系統版本分發安裝包
檢測系統版本指指令為:
dis=$(uname -a|awk '{print $3}'|awk -F 'el' '{print $2}'|awk -F '.' '{print $1}')
bites=$(uname -a|grep x86_64|wc -l)
([[ $dis = 7 ]]&&[[ $bites = 1 ]] && wget ...)||
([[ $dis = 6 ]]&&[[ $bites = 1 ]] && wget ...)||
([[ $dis = 6 ]]&&[[ $bites = 0 ]] && wget ...)||
([[ $dis = 5 ]]&&[[ $bites = 1 ]] && wget ...)||
([[ $dis = 5 ]]&&[[ $bites = 0 ]] && wget ...)||
(echo unknown system)
3. 通過 ansible 分發腳本並執行
ansible 本身實際上是逐個通過ssh執行操作的, 一旦下載文件的地址不通的話就會讓后面的操作一直阻塞,
最好下載文件的位置與ansible是同一IP 這樣就能有效避免阻塞導致升級失敗(頂多就是超時連不上跳到下一台機)
升級過程出現的問題:
1. ansible 直接多條命令執行運行效果不好,特別是對變量無法有效賦值, 最后通過 copy 模塊把腳本分發到服務器解決
2. 由於ansible執行方式是根據hosts逐條通過ssh登錄系統,目標系統內如果wget 無法連接源倉庫的話,該主機會一直嘗試連接,最終會導致后面所有主機一直等待
3. 部分主機會提示插件問題,待后期處理
4. ssh 編譯時提示: configure: error: OpenSSL version header not found
分析:不知道,反正裝了下面那個就可以,舊版也可以不影響升級
解決方法:yum -y install openssl-devel
升級后出現的問題:
1. 32位系統全部升級失敗,編譯過程中有冗余文件提示
解決方法:
a. 可能是原升級包被編譯過再進行打包, 執行指令 make clean 清理冗余文件
b. 生成庫文件版本不對, ./config 后添加 -m32 強制所有庫文件為32位文件
2. 升級后提示缺失 libcrypto.so 庫文件
解決方法:
去別的同類型系統復制一個庫文件並做好軟連接即可
3. 提示 openssl 版本不對
分析: 實際上還是庫文件目錄問題,根據其環境變量優先使用就近庫文件,導致庫文件不匹配
解決方法:
1. ldd /usr/sbin/sshd 檢查庫文件目錄:
linux-vdso.so.1 => (0x00007fff56a7d000)
libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00002b876b7ef000)
librt.so.1 => /lib64/librt.so.1 (0x00002b876bbb5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b876bdbf000)
libutil.so.1 => /lib64/libutil.so.1 (0x00002b876bfc3000)
libz.so.1 => /lib64/libz.so.1 (0x00002b876c1c6000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00002b876c3db000)
2. 明顯 libcrypto.so.1.0.0 位置與其他庫文件不同,環境變量的鍋
mv /usr/local/ssl/lib /usr/local/ssl/lib.bak 封了那個搞事的庫
3. service sshd restart 提示成功!
4. ssh 重啟提示: /usr/lib64/libcrypto.so.10: no version information available
分析: /usr/lib64/libcrypto.so.10 軟連接到不合適的 libcrypto.so.1.0.0文件去了
解決方法: 重新編譯openssh
總結:
單獨升級openssh或者openssl出現問題會比較多,這一般是早期配置環境的人使用非默認位置導致的
最好的解決方法是兩個一起編譯安裝,熟悉了目錄規則之后就知道怎么在不重新編譯的情況下解決庫的問題了。
熟用ldd是非常好的。
更新:
動態庫庫的管理工具為: ldconfig, 及其配置文件:/etc/ld.so.conf
ldconfig //更新動態庫
ldconfig -p //打印出所有關聯庫的位置
因此,如果不想多余的動態庫被連接,可以通過修改/etc/ld.so.conf解決