最近用低版本的OpenSSH(5.9p1版本) 的漏洞給系統留了個後門 , 能夠劫持root密碼或者給root開啓後門密碼 : 利用Openssh後門 劫持root密碼html
若是公司還在用CentOS6的系統 , 那確定存在漏洞隱患 linux
建議升級OpenSSH , 升級OpenSSH的操做並不複雜 ,但若是是線上環境 ,那麼就須要謹慎操做 vim
特別須要注意的是 若是是經過ssh遠程鏈接服務器後進行的版本升級操做 ,萬一升級失敗了,則ssh就遠程登陸不上去了 固然 ,若是服務器安裝了iDRAC遠程管理卡就好說了,若是沒有iDRAC遠程管理卡,則須要提早開啓telnet遠程登陸(容許root帳號登陸)或是到機房現場進行升級操做比較穩當centos
centos7默認的是OpenSSH_7.4p1版本,能夠不用升級,只需升級centos6.9的openssh版本便可安全
OpenSSH_6.9 包括6.9在內和6.9以前的版本 , 都存在漏洞 , 登陸被影響主機查看OpenSSH版本號,如在影響範圍內,則對OpenSSH進行版本升級或更新bash
#!/bin/bash #關閉iptables防火牆和selinux /etc/init.d/iptables stop /bin/sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux /usr/sbin/setenforce 0 #備份ssh原來配置 cp -rf /etc/ssh /etc/ssh.bak #安裝配置telnet,暫時容許root用戶遠程telnet,以防ssh升級後遠程登陸不了 echo "Y"|/usr/bin/yum install telnet-server /bin/sed -i 's/= yes/= no/g' /etc/xinetd.d/telnet /etc/init.d/xinetd start /etc/init.d/xinetd restart mv /etc/securetty /etc/securetty.bak #安裝配置新版本openssh echo "Y"|/usr/bin/yum install -y gcc openssl-devel pam-devel rpm-build cd /usr/local/src /usr/bin/wget https://fastly.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.8p1.tar.gz /bin/tar -xf openssh-7.8p1.tar.gz cd /usr/local/src/openssh-7.8p1 ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-zlib --with-md5-passwords --with-tcp-wrappers make -j 4 && make install /bin/sed -i '/^#PermitRootLogin/s/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config /bin/sed -i 's_#PermitRootLogin yes_PermitRootLogin yes_g' /etc/ssh/sshd_config sed -i '/^GSSAPICleanupCredentials/s/GSSAPICleanupCredentials yes/#GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config sed -i '/^GSSAPIAuthentication/s/GSSAPIAuthentication yes/#GSSAPIAuthentication yes/' /etc/ssh/sshd_config sed -i '/^GSSAPIAuthentication/s/GSSAPIAuthentication no/#GSSAPIAuthentication no/' /etc/ssh/sshd_config service sshd start service sshd restart /usr/bin/ssh -V # 關閉telnet遠程登陸 NUM=$(/usr/sbin/lsof -i:23|wc -l) if [ $NUM -ne 0 ];then mv /etc/securetty.bak /etc/securetty fi
查看版本服務器
# 查看系統版本 , 最小化安裝可能會沒有centos-release的軟件包 , 能夠用下面的命令查看 [root@DaMoWang ~]# rpm -q centos-release centos-release-6-9.el6.12.3.x86_64 [root@DaMoWang ~]# cat /etc/centos-release CentOS release 6.9 (Final) [root@DaMoWang ~]# cat /etc/issue CentOS release 6.9 (Final) Kernel \r on an \m # 查看SSH版本 [root@DaMoWang ~]# ssh -V OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013 [root@DaMoWang ~]# ssh -V OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013 [root@DaMoWang ~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013 built on: Wed Mar 22 21:43:28 UTC 2017 platform: linux-x86_64 options: bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM OPENSSLDIR: "/etc/pki/tls" engines: rdrand dynamic
備份
ssh
目錄
session
[root@DaMoWang ~]# cp -rf /etc/ssh{,.bak}
安裝telnet , 避免
ssh
升級出現問題 ,致使沒法遠程管理
app
[root@DaMoWang ~]# yum -y install telnet-server [root@DaMoWang ~]# 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啓動後,23端口就會起不來 }
重啓telnet服務dom
[root@DaMoWang ~]# /etc/init.d/xinetd restart 中止 xinetd: [肯定] 正在啓動 xinetd: [肯定] # 查看服務是否開啓 [root@DaMoWang ~]# netstat -antup|grep 23 tcp 0 0 :::23 :::* LISTEN 2293/xinetd
若是是線上服務器 , 最好是添加防火牆策略 , 儘可能不要關閉防火牆
[root@DaMoWang ~]# iptables -I INPUT -p tcp --dport 23 -j ACCEPT [root@DaMoWang ~]# iptables -I INPUT -p udp --dport 23 -j ACCEPT # 臨時關閉SElinux [root@DaMoWang ~]# getenforce Enforcing [root@DaMoWang ~]# setenforce 0
雖然把23端口放行了 , 可是linux默認是不容許root用戶以telnet的方式登陸linux主機的 , 若是要用root用戶登陸 , 那麼可用如下方法實現
# 修改securetty文件 增長pts配置 若是登陸用戶較多,須要更多的pts/* [root@DaMoWang ~]# vim /etc/securetty # 或者直接刪除或修改文件名 , 避開驗證規則實現root用戶遠程登陸 [root@DaMoWang ~]# rm -f /etc/securetty
測試遠程登陸root用戶
[root@test ~]# hostname -I 192.168.94.11 [root@test ~]# telnet 192.168.94.66 Trying 192.168.94.66... Connected to 192.168.94.66. Escape character is '^]'. CentOS release 6.9 (Final) Kernel 2.6.32-696.el6.x86_64 on an x86_64 DaMoWang.localdomain login: root Password: Last login: Mon Jun 4 22:52:19 from 192.168.94.1 [root@DaMoWang ~]# hostname -I 192.168.94.66
通常不建議直接用root用戶遠程經過telnet登錄系統,由於telnet在數據傳輸過程採用明文方式,若是,數據包被人截獲,將會很容易獲取root用戶的密碼
仍是建議以普通用戶經過telnet遠程登錄,而後
su
到root,這樣相對比較安全。若是非要用root用戶遠程鏈接,建議採用SSH
如上操做後,就可使用root帳號進行telnet登陸服務器了 OpenSSH升級後還需禁止root用戶進行telnet登陸
安裝高版本的OpenSSH的依賴包
[root@DaMoWang ~]# yum -y install gcc openssl-devel pam-devel rpm-build tcp_wrappers-devel
下載高版本的OpenSSH
進到官網看到今天恰好更新7.8版本的源碼包 , 就用最新版本的來最升級吧
[root@DaMoWang src]# cd /usr/local/src/ [root@DaMoWang src]# ll 總用量 1512 -rw-r--r--. 1 root root 1548026 8月 25 2018 openssh-7.8p1.tar.gz [root@DaMoWang src]# tar xf openssh-7.8p1.tar.gz [root@DaMoWang src]# cd openssh-7.8p1 [root@DaMoWang openssh-7.8p1]# ./configure --prefix=/usr \ --sysconfdir=/etc/ssh \ --with-pam \ --with-zlib \ --with-md5-passwords \ --with-tcp-wrappers \ && make -j 4 && 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@DaMoWang openssh-7.8p1]# echo $? 0
修改配置文件,容許root登陸
[root@DaMoWang openssh-7.8p1]# sed -i '/^#PermitRootLogin/s/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config [root@DaMoWang openssh-7.8p1]# grep RootLogin /etc/ssh/sshd_config PermitRootLogin yes
重啓SSH服務
[root@DaMoWang openssh-7.8p1]# service sshd restart 中止 sshd: [肯定] 正在啓動 sshd:/etc/ssh/sshd_config line 81: Unsupported option GSSAPIAuthentication /etc/ssh/sshd_config line 83: Unsupported option GSSAPICleanupCredentials [肯定]
報錯解決方 , 只需把提示錯誤的行註釋掉便可
再重啓SSH服務
[root@DaMoWang openssh-7.8p1]# service sshd restart 中止 sshd: [肯定] 正在啓動 sshd: [肯定] [root@DaMoWang openssh-7.8p1]# service sshd status openssh-daemon (pid 12918) 正在運行...
查看SSH服務版本
[root@DaMoWang openssh-7.8p1]# ssh -V OpenSSH_7.8p1, OpenSSL 1.0.1e-fips 11 Feb 2013
在升級SSH時你的SSH是不會由於升級或重啓服務而斷掉的
注意 :
OpenSSH升級後,必定要修改
/etc/ssh/sshd_config的
PermitRootLogin no
改成 PermitRootLogin yes
,而後再重啓OpenSSH服務
不然,再另開一個終端窗口,使用root用戶
ssh
登陸該機器就會失敗了,由於此時
ssh
已經禁止root用戶登陸了
還有禁止DNS反向解析 , 修改端口號等細節須要注意
SSH能夠鏈接 , 在線升級成功
[root@test ~]# ssh -p22 192.168.94.66 The authenticity of host '192.168.94.66 (192.168.94.66)' can't be established. ECDSA key fingerprint is SHA256:/r5E0VYms6owRZhRXVckaVAgrT5eytIEUO7+D80rfbU. ECDSA key fingerprint is MD5:1a:0e:a2:82:a5:08:bc:ed:23:7b:f7:c3:47:f0:dd:3b. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.94.66' (ECDSA) to the list of known hosts. root@192.168.94.66's password: Last login: Sat Aug 25 01:12:57 2018 from 192.168.94.66 [root@DaMoWang ~]# hostname -I 192.168.94.66
這是源碼編譯升級 , 若是主機使用update升級更新系統 , 那麼OpenSSH的版本會回退默認版本
順便說一下 , 以前用CentOS7更換OpenSSH版本 , 有坑 , systemctl restart sshd 啓動服務超時 , 服務啓動失敗 , 可是重啓服務那短暫的時間 , 仍是能夠鏈接上ssh的
緣由不少 , 根據自身實際狀況來解決
升級成功後不能使用systemctl start sshd啓動程序 :
一、編譯安裝時未啓用某些功能支持致使使用舊配置文件沒法啓動sshd,如GSSAPIAuthentication、UsePrivilegeSeparation
二、配置文件權限錯誤,致使沒法啓動,如:ssh_host_rsa_key、ssh_host_ecdsa_key、ssh_host_ed25519_key
升級成功後輸入密碼沒法登陸系統 :
一、未對配置文件進行修改,openssh7.5默認配置不容許使用root登陸系統
二、pam配置文件錯誤或丟失
三、配置文件中未啓用pam選項:UsePAM
若是實在運行不了ssh服務 , 那麼好 , 就利用那重啓服務短暫的空隙 , 只須要讓服務無限重啓 , 保持ssh的進程便可 , 這個方法並不能解決實際問題 , 不過在沒找到問題緣由以前 , 能夠暫時使用
[root@test ~]# cat /etc/centos-release CentOS Linux release 7.5.1804 (Core) [root@test ~]# vim /opt/restart-ssh.sh #/bin/bash ps -ef|grep "systemctl restart sshd"|awk '{print $2}'|xargs kill -9 nohup systemctl restart sshd & # 服務啓動超時 , 殺掉ssh進程 , 再重啓ssh服務 # 加到計劃任務中 10秒執行一次