近期對IDC機房伺服器做了一次安全漏洞掃描,漏掃結果顯示伺服器的OpenSSH版本太低(CentOS6預設是OpenSSH_5.3p1),存在漏洞隱患,安全部門建議升級到OpenSSH_7.6p1。升級OpenSSH的操作並不複雜,但由於是線上環境,故需要謹慎操作。特別需要注意的是:如果是通過ssh遠端連線伺服器後進行的版本升級操作,萬一升級失敗了,則ssh就遠端登入不上去了。當然,如果伺服器安裝了iDRAC遠端管理卡就好說了,如果沒有iDRAC遠端管理卡,則需要提前開啟telnet遠端登入(允許root賬號登入)或是到機房現場進行升級操作比較妥當!
一、漏洞描述
漏洞描述:OpenSSH 6.9及之前版本的sshd中的auth2-chall.c檔案中的lsquokbdint_next_devicersquo函式存在安全漏洞,該漏洞源於程式沒有正確限制處理單連結中的keyboard-interactive裝置。
影響範圍:OpenSSHthrough 6.9
涉及資產:xxxxxx
漏洞影響:遠端攻擊者可藉助ssh -oKbdInteractiveDevices選項中較長且重複的列表利用該漏洞實施暴力破解攻擊,或造成拒絕服務(CPU消耗)。
漏洞加固建議:登入被影響主機檢視OPENSSH版本號,如在影響範圍內,則對OPENSSH進行版本升級或更新。
centos7預設的是OpenSSH_7.4p1版本,可以不用升級,只需升級centos6.9的openssh版本即可!
openssh升級到7.6版本的一鍵執行指令碼的下載地址:https://pan.baidu.com/s/1-D0gZsNc5f6QFyLnMSNXbA
提取密碼:9ma2
二、Centos6.9升級預設OpenSSH版本的操作記錄
檢視作業系統版本 [root@Centos6 ~]# cat /etc/redhat-release #或者執行"cat /etc/issue" CentOS release 6.9 (Final) 檢視預設的OpenSSH版本 [root@Centos6 ~]# ssh -V OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013 openssl預設版本如下,這個是關係到下面編譯安裝openssh的成功與否。 [root@Centos6 ~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013 備份ssh目錄(此步非常重要,一定要記得提前做備份) [root@Centos6 ~]# cp -rf /etc/ssh /etc/ssh.bak 安裝telnet,記得提前部署telnet遠端登入環境(root使用者登入),避免ssh升級出現問題,導致無法遠端管理! [root@Centos6 ~]# yum install telnet-server [root@Centos6 ~]# vim /etc/xinetd.d/telnet # default: on # description: The telnet server serves telnet sessions; it uses \ # unencrypted username/password pairs for authentication. service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd log_on_failure += USERID disable = no #將預設的yes修改為no。開啟telnet服務功能,否則telnet啟動後,23埠就會起不來! } 重啟telnet服務 [root@Centos6 ~]# /etc/init.d/xinetd start Starting xinetd: [ OK ] [root@Centos6 ~]# /etc/init.d/xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ] telnet預設用於遠端登入的埠是23(21是預設的ftp埠、22是預設的ssh埠、23是預設的telnet埠) [root@Centos6 ~]# lsof -i:23 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME xinetd 2489 root 5u IPv6 22131982 0t0 TCP *:telnet (LISTEN) 關閉iptables防火牆和selinux。如果開啟了iptables防火牆,則需要開啟23埠(即"iptables -I INPUT -p tcp --dport 23 -j ACCEPT" 和"iptables -I INPUT -p udp --dport 23 -j ACCEPT" )。 [root@Centos6 ~]# /etc/init.d/iptables stop [root@Centos6 ~]# vim /etc/sysconfig/selinux ....... SELINUX=disabled [root@Centos6 ~]# setenforce 0 setenforce: SELinux is disabled ===================================================================================================================== 預設情況下,linux不允許root使用者以telnet方式登入linux主機,若要允許root使用者登入,可採取以下兩種方法中的任何一種方法: 1)第一種方法:修改securetty檔案 增加pts配置。如果登入使用者較多,需要更多的pts/*。 [root@Centos6 ~]# vim /etc/securetty ...... pts/0 pts/1 pts/2 2)第二種方法:移除securetty檔案 驗證規則設定在/etc/security檔案中,該檔案定義root使用者只能在tty1-tty6的終端上記錄,刪除該檔案或者將其改名即可避開驗證規則實現root使用者遠端登入。 [root@Centos6 ~]# rm -rf /etc/securetty 以上兩種方法中的任意一種設定後,在客戶端使用telnet遠端登入目標伺服器(使用root使用者)都是可以的! 192.168.10.206是telnet目標伺服器,192.168.10.202是客戶端機器。 [root@client ~]# telnet 192.168.10.206 23 Trying 192.168.10.206... Connected to 192.168.10.206. Escape character is '^]'. CentOS release 6.9 (Final) Kernel 2.6.32-696.el6.x86_64 on an x86_64 Centos6.9-OS login: root Password: Last login: Tue Aug 14 14:28:02 from 192.168.10.202 ------------------------溫馨提示------------------------- 一般不建議直接用root使用者遠端通過telnet登陸系統,因為telnet在資料傳輸過程採用明文方式,如果,資料包被人截獲,將會很容易獲取root使用者的登陸口令; 還是建議以普通使用者通過telnet遠端登陸,然後su到root,這樣相對比較安全。如果非要用root使用者遠端連線,建議採用SSH. 如上操作後,就可以使用root賬號進行telnet登入伺服器了!OpenSSH升級後建議再修改回還原設定(即禁止root使用者進行telnet登入)。 ========================================================================================================================== 安裝高版本的OpenSSH 升級前需要先安裝幾個元件 [root@Centos6 ~]# yum install -y gcc openssl-devel pam-devel rpm-build tcp_wrappers-devel 本案例升級openssh選擇的是openssh-7.6p1.tar.gz 百度雲盤下載地址是:https://pan.baidu.com/s/1C5B5ZZh_PRBNicvdzTxS2g 提取密碼:dssh [root@Centos6 ~]# cd /usr/local/src/ [root@Centos6 src]# ll openssh-7.6p1.tar.gz -rw-rw-r-- 1 root root 1489788 Aug 14 2018 openssh-7.6p1.tar.gz [root@Centos6 src]# tar -zvxf openssh-7.6p1.tar.gz [root@Centos6 src]# cd openssh-7.6p1 [root@Centos6 openssh-7.6p1]# ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-zlib --with-md5-passwords --with-tcp-wrappers [root@Centos6 ~]# make && make install 安裝後提示: /etc/ssh/ssh_config already exists, install will not overwrite /etc/ssh/sshd_config already exists, install will not overwrite /etc/ssh/moduli already exists, install will not overwrite ssh-keygen: generating new host keys: ECDSA ED25519 /usr/sbin/sshd -t -f /etc/ssh/sshd_config /etc/ssh/sshd_config line 81: Unsupported option GSSAPIAuthentication /etc/ssh/sshd_config line 83: Unsupported option GSSAPICleanupCredentials 修改配置檔案,允許root登入 [root@Centos6 openssh-7.6p1]# sed -i '/^#PermitRootLogin/s/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config [root@Centos6 openssh-7.6p1]# cat /etc/ssh/sshd_config|grep RootLogin PermitRootLogin yes 重啟OpenSSH [root@Centos6 openssh-7.6p1]# service sshd restart Stopping sshd: [ OK ] Starting sshd: /etc/ssh/sshd_config line 81: Unsupported option GSSAPIAuthentication /etc/ssh/sshd_config line 83: Unsupported option GSSAPICleanupCredentials [ OK ] 如上重啟OpenSSH出現的告警錯誤,解決辦法如下: 將/etc/ssh/sshd_config檔案中以上行數內容註釋下即可 [root@Centos6 openssh-7.6p1]# sed -i '/^GSSAPICleanupCredentials/s/GSSAPICleanupCredentials yes/#GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config [root@Centos6 openssh-7.6p1]# sed -i '/^GSSAPIAuthentication/s/GSSAPIAuthentication yes/#GSSAPIAuthentication yes/' /etc/ssh/sshd_config [root@Centos6 openssh-7.6p1]# sed -i '/^GSSAPIAuthentication/s/GSSAPIAuthentication no/#GSSAPIAuthentication no/' /etc/ssh/sshd_config 再次重啟OpenSSH服務,則不會出現錯誤了 [root@Centos6 openssh-7.6p1]# service sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ] 升級後版本 [root@Centos6 openssh-7.6p1]# ssh -V OpenSSH_7.6p1, OpenSSL 1.0.1e-fips 11 Feb 2013 ---------------------------------------------------------------------------------------------------- 溫馨提示: 1)由於之前將原ssh目錄修改名字了("mv /etc/ssh /etc/ssh_bak"),修改後,需要立即需要修改下配置: 修改配置檔案,禁止root登入 [root@Centos6 ~]# sed -i '/^#PermitRootLogin/s/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config 可以不操作,禁止dns解析 [root@Centos6 ~]# sed -i '/^#UseDNS yes/s/#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config 可以不操作預設是22,修改ssh埠至6022 [root@Centos6 ~]# echo "Port 6022" >> /etc/ssh/sshd_config 注意: - 在升級SSH時你的SSH是不會因為升級或重啟服務而斷掉的。 - 但是記得OpenSSH升級後,要修改/etc/ssh/sshd_config,將"PermitRootLogin no" 改為 "/etc/ssh/sshd_config",然後再重啟OpenSSH服務, 否則,再另開一個終端視窗,使用root使用者ssh登入該機器就會失敗了,因為此時ssh已經禁止root使用者登入了! 2)更新後ssh有如下提示,但不影響使用: [root@Centos6 ~]# ssh -p22 192.168.10.206 /etc/ssh/ssh_config line 50: Unsupported option "gssapiauthentication" 解決措施: 註釋/etc/ssh/ssh_config的gssapiauthentication內容 ----------------------------------------------------------------------------------------------------
重要提示:
1)在升級完openssh版本後,如果你進行了系統update或者升級用到ssh包的相關軟體包,會導致ssh的版本回退到原來的版本。
2)實際使用中發現ansible和jenkins使用時有些問題,網上查詢了下,需要在/etc/ssh/sshd_config檔案中最後增加兩行(第一行是ansible支援加入,第二行是jenkins支援加入):
Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-cbc KexAlgorithms diffie-hellman-group1-sha1,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1
因為升級了openssh太新導致通訊時加密演算法出現問題,加上後重啟就可以了。
==================================================================
如上升級centos6的openssh版本到7.6之後,在另一臺伺服器上使用java呼叫sftp服務失敗!
解決辦法: 1)在java伺服器的sshd_config檔案末尾新增下面內容(即新增驗證方式),並重啟sshd服務。 [root@tomcat ~]# cat /etc/ssh/sshd_config ...... KexAlgorithms diffie-hellman-group1-sha1,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1 [root@tomcat ~]# /etc/init.d/sshd restart 2)升級jsch新版本(如jsch-0.1.53.jar )
===============================================
順便提一下在centos7下升級openssh之後的一個坑
上面的升級操作同樣可以在centos7系統下進行,升級前,centos7預設版本 [root@centos7 ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 在centos7伺服器上執行上面的一鍵升級指令碼,執行後檢查ssh版本: [root@centos7 ~]# ssh -V OpenSSH_7.6p1, OpenSSL 1.0.2k-fips 26 Jan 2017 此時重啟ssh服務(systemctl restart sshd),會一直卡著,使用"systemctl status sshd"檢視,會提示幾個檔案許可權過大 修改幾個檔案許可權 [root@centos7 ~]# chmod 600 /etc/ssh/ssh_host_* 接著再次重啟sshd服務,會提示不識別sshd_config檔案中第94行、第123行檔案。 註釋掉這兩行內容即可 最後重啟ssh服務 [root@centos7 ~]# systemctl restart sshd 會發現重啟命令一直在卡著!!!! 發現的坑的情況: 1)發現centos7升級到openssh7.6之後,重啟sshd服務會一直在卡著,卡著過程中,在遠端使用ssh是可以正常登入本機。 2)但是卡一段時間後(大概2分鐘左右),sshd服務就會因為啟動超時而關閉,屆時在遠端使用ssh重新登入本機就會失敗! 3)但只要在遠端使用ssh成功登入到本機後的終端視窗,不管centos7機器的ssh服務起來與否,該終端視窗始終保持連線! 4)所以,儘管升級後,重啟ssh服務是一直卡的狀態,但只要是在啟動中,遠端ssh新連線就不會斷開。 5)故要保證升級後,遠端使用ssh登入centos7本機不受影響,無感知,就需要升級後的centos7機器的ssh服務一直在啟動中。 需要一個保持sshd服務持續啟動的指令碼 [root@centos7 ~]# cat /opt/ssh-restart.sh #/bin/bash ps -ef|grep "systemctl restart sshd"|awk '{print $2}'|xargs kill -9 nohup systemctl restart sshd & 每20秒執行一次指令碼 [root@centos7 ~]# crontab -l * * * * * /bin/bash -x /opt/ssh-restart.sh >/dev/null 2>&1 * * * * * sleep 20;/bin/bash -x /opt/ssh-restart.sh >/dev/null 2>&1 * * * * * sleep 40;/bin/bash -x /opt/ssh-restart.sh >/dev/null 2>&1 始終保證一個重啟sshd服務的程式在 [root@centos7 ~]# ps -ef|grep "systemctl restart sshd" root 18368 1 0 17:18 ? 00:00:00 systemctl restart sshd root 18478 18460 0 17:18 pts/4 00:00:00 grep --color=auto systemctl restart sshd 以上是臨時想到的解決辦法,究其原因和最終解決辦法,還需要進一步分析(後續更新)~
=============補充一下:centos7開啟telnet遠端登入的方法==============
[root@Centos7 ~]# yum install -y telnet-server xinetd [root@Centos7 ~]# systemctl enable xinetd.service [root@Centos7 ~]# systemctl enable telnet.socket [root@Centos7 ~]# systemctl start telnet.socket [root@Centos7 ~]# systemctl start xinetd 預設情況下,centos7系統是不允許root使用者telnet遠端登入的。如果要使用root使用者直接登入,有下面兩種方法: 1)第一種方法:修改securetty檔案 增加pts配置。如果登入使用者較多,需要更多的pts/*。 [root@Centos6 ~]# vim /etc/securetty ...... pts/0 pts/1 pts/2 2)第二種方法:移除securetty檔案 驗證規則設定在/etc/security檔案中,該檔案定義root使用者只能在tty1-tty6的終端上記錄,刪除該檔案或者將其改名即可避開驗證規則實現root使用者遠端登入。 [root@Centos6 ~]# rm -rf /etc/securetty 然後在客戶端使用telnet登入 [root@client ~]# telnet 192.168.10.220 23 Trying 192.168.10.220... Connected to 192.168.10.220. Escape character is '^]'. Kernel 3.10.0-862.3.2.el7.x86_64 on an x86_64 Centos7 login: root Password: Last login: Wed Aug 15 01:10:15 from ::ffff:192.168.10.39 [root@Centos7 ~]#