升級前后對比
openSSH作為linux遠程連接工具,容易受到攻擊,必須更新版本來解決,低版本有如下等漏洞:
OpenSSH 遠程代碼執行漏洞(CVE-2016-10009)
OpenSSH auth_password函數拒絕服務漏洞(CVE-2016-6515)
OpenSSH 遠程代碼執行漏洞(CVE-2016-10009)
升級前漏洞掃描和openSHH版本:
升級后漏洞掃描和openSHH版本:
主機系統centos7.3.1161升級openssh到當前最新版7.7p1以后使用root用戶無法登陸,一直提示用戶名密碼錯誤(實際上用戶名密碼是對的)。下面對這個坑進行說明。
step 1 、升級前提說明:
1、升級OpenSSH后,原有公鑰失效,信任關系需要重新配置;
2、升級過程需要停止sshd服務,會導致ssh和sftp無法使用;
3、升級OpenSSH影響的業務有:QDG同步、Mediation及現場自己寫的同步腳本等;
4、升級需要關閉防火牆服務;
5、升級需要關閉selinux服務;
6、升級前需要開啟telnet,防止升級失敗,系統無法登錄,對應的防火牆需要開啟23端口,安裝需要telnet相關包(推薦通過系統ISO安裝)
7、升級過程中需要刷新lib庫:ldconfig -v;
8、升級順序:順序是zlib庫-> openssl -> openssh;
9、升級需要gcc、make、perl、zlib、zlib-devel、pam、pam-devel;
step 2 、版本升級說明
zlib-1.2.3 > zlib-1.2.11
OpenSSL 1.0.1e > OpenSSL 1.0.2o
OpenSSH 5.3p1 > OpenSSH 7.7p1
step 3、開啟telnet(或者安裝vnc)
一、開啟telnet
臨時開啟telnet服務,用於升級ssh,同時方總升級ssh過程中主機無法登錄。
1、掛載操作系統鏡像
2、安裝ftp所需系統包
yum -y install xinetd telnet telnet-server
3、允許root用戶通過telnet登陸:
編輯/etc/pam.d/login,注釋掉下面這行
vi /etc/pam.d/login
#auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
4、配置/etc/securetty
先備份/etc/securetty文件:
cp /etc/securetty /etc/securetty.bak
再配置
vi /etc/securetty
添加超級用戶登陸設備。
添加超級用戶登陸設備至/etc/securetty文件:
echo "pts/1" >> /etc/securetty
echo "pts/2" >> /etc/securetty
echo "pts/3" >> /etc/securetty
echo "pts/4" >> /etc/securetty
echo "pts/5" >> /etc/securetty
echo "pts/6" >> /etc/securetty
echo "pts/7" >> /etc/securetty
echo "pts/8" >> /etc/securetty
echo "pts/9" >> /etc/securetty
echo "pts/10" >> /etc/securetty
echo "pts/11" >> /etc/securetty
5、開啟root用戶遠程登陸
編輯/etc/pam.d/remote,注釋下列這行:
vi /etc/pam.d/remote
#auth required pam_securetty.so
6、重啟telnet和xinetd服務【telnet服務依賴於xinetd服務】
systemctl start telnet.socket
systemctl start xinetd
PS:如果開啟了防火牆,需要將23端口(系統默認23為telnet端口)添加到防火牆允許的端口的列表中。
7、開啟telnet和xinetd開機自動啟動
systemctl enable xinetd.service
systemctl enable telnet.socket
8、驗證開機啟動
systemctl list-unit-files |grep telnet
systemctl list-unit-files |grep xinetd
9、驗證
telnet xxx.xxx.xx.xx
二、安裝vnc
參考https://www.cnblogs.com/kevingrace/p/5821450.html,根據自己的需要進行選擇性操作,如果做了防火牆,會攔截vnc服務或端口,我這里是直接安裝,在檢驗的時候,才去設置防火牆:
1)安裝vnc:
yum update
yum groupinstall "GNOME Desktop" "X Window System" "Desktop"
yum install tigervnc-server tigervnc vnc vnc-server
2)配置vnc連接
配置服務:
cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
修改服務:
vi /etc/systemd/system/vncserver@:1.service
找到這一行
ExecStart=/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
PIDFile=/home/<USER>/.vnc/%H%i.pid
這里直接用root 用戶登錄為例,(其他用戶同理)
進入編輯模式:
i鍵
修改為:
ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i"
PIDFile=/root/.vnc/%H%i.pid
退出保存:
Esc鍵+:+wq
為VNC設密碼(比如密碼設置為123456)
vncpasswd
123456
123456
重加載 systemd
systemctl daemon-reload
啟動vnc
systemctl enable vncserver@:1.service
systemctl start vncserver@:1.service
3)檢查vnc連接
【1】通過端口檢查
lsof -i:5901
【2】進程檢查
ps -ef | grep Xvnc
【3】服務檢查
systemctl status vncserver@:1.service
【4】桌面VNC_Viewer連接測試:在兩個互通的主機之間測試
前面三個檢查都正常,但是在VNC_Viewer連接不上:很可能是防火牆的問題,現在就需要去設置防火牆(iptables或firewalld)了:
1)iptables設置端口白名單:
vi /etc/sysconfig/iptables
-A INPUT -p tcp -m tcp --dport 5901 -j ACCEPT
service iptables restart
2)關閉firewalld:
systemctl status firewalld
systemctl stop firewalld
配置之后即可進行登錄
登錄之后,打開終端,即可進行操作(與CRT 、Xshell類似):
step 4、安裝包准備
1、軟件包下載地址:
zlib-1.2.11.tar.gz
https://www.openssl.org/source/
openssh-7.7p1.tar.gz
https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/
2、創建上傳目錄
mkdir -p /soft/zlib
mkdir -p /soft/openssl
mkdir -p /soft/openssh
3、上傳下載的安裝包
step 5、關閉防火牆和selinux
systemctl status firewalld.service
檢查防火牆狀態,如果在運行停掉。
systemctl stop firewalld.service
關閉開機自啟動
systemctl disable firewalld
step 6、驗證selinux是否關閉
檢查是否關閉:
getenforce
如果未關閉,關閉之
setenforce 0
getenforce
上面只是臨時關閉了,重啟后不生效。下面改配置文件,使永久生效。
vi /etc/selinux/config
修改:
SELINUX=disabled
保存退出。
step 7、安裝openssh升級依賴包
檢查相關依賴包是否安裝
rpm -qa | egrep "gcc|make|perl|zlib|zlib-devel|pam|pam-devel"
我們這里看到是有的,如果沒有則安裝
yum -y install gcc make perl zlib zlib-devel pam pam-devel
step 8、正式開始升級openssh
PS: telnet登錄操作,升級順序:zlib庫-> openssl -> openssh。
1、停止sshd服務
檢查
systemctl is-active sshd
停止
systemctl stop sshd
檢查
systemctl is-active sshd
停止之后,無法用ssh維護了,可以通過vnc或者telnet維護
2、卸載系統里原有Openssh
查看系統原有openssh包
rpm -qa | grep openssh
根據上面查詢出的結果,卸載系統里原有Openssh
rpm -e --nodeps 'rpm -qa | grep openssh'
驗證
rpm -qa | grep openssh
3、編譯安裝zlib
解壓安裝zlib
cd /soft/zlib
tar -xzvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/usr/local/zlib
make
make test
make install
驗證zlib安裝是否成功
ll /usr/local/zlib
要包含include、lib、share上個目錄。
新建並編輯配置文件:
vi /etc/ld.so.conf.d/zlib.conf
加入如下內容后保存退出
/usr/local/zlib/lib
刷新庫文件,加載剛才編譯安裝的zlib生成的庫文件
ldconfig -v
4、升級OpenSSL
進入安裝包路徑
cd /soft/openssl
解壓安裝openssl包
tar -xzvf openssl-1.0.2o.tar.gz
編譯openssl
cd openssl-1.0.2o
./config shared zlib
make
make test
make install
重命名現有文件目錄
mv /usr/bin/openssl /usr/bin/openssl.bak
創建ssl相關軟連接
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
編輯配置文件
vi /etc/ld.so.conf.d/ssl.conf
加入如下內容后保存退出
/usr/local/ssl/lib
刷新庫文件,加載剛才編譯安裝的ssl生成的庫文件
ldconfig -v
查看openssl版本
openssl version -a
5、升級OpenSSH
重命名原有配置文件
mv /etc/ssh /etc/ssh.bak
安裝openssh
cd /soft/openssh
tar -xzvf openssh-7.7p1.tar.gz
cd openssh-7.7p1
./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/ssl --mandir=/usr/share/man --with-zlib=/usr/local/zlib
make
make install
6、驗證openssh版本
(沒啟動)升級后
/usr/local/openssh/bin/ssh -V
7、設置sshd服務開機自動啟動
拷貝配置文件
cp /soft/openssh/openssh-7.7p1/contrib/redhat/sshd.init /etc/init.d/sshd
給sshd的配置文件執行權限
chmod u+x /etc/init.d/sshd
添加sshd服務
chkconfig --add sshd
驗證開機啟動
chkconfig --list|grep sshd
8、設置 ssh -V驗證碼版本
替換配置文件
cp /soft/openssh/openssh-7.7p1/sshd_config /etc/ssh/sshd_config
配置sshd_config文件
將subsystem sftp路徑變更為實際路徑/usr/local/openssh/libexec/sftp-server
vi /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/sftp-server
注釋掉,換為如下一句:
Subsystem sftp /usr/local/openssh/libexec/sftp-server
拷貝命令
cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
拷貝sshd命令至/usr/bin/
cp /usr/local/openssh/bin/ssh /usr/bin/
檢查版ssh本
ssh -V
9、密碼認證和允許root用戶遠程直接登錄
拷貝ssh-keygen
cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
修改配置文件/etc/ssh/sshd_config
vi /etc/ssh/sshd_config
#PasswordAuthentication yes 行取消注釋
PasswordAuthentication yes
並下面添加
PermitRootLogin yes
PS:如果不允許root用戶遠程直接登錄,這里配置為PermitRootLogin no;
10、重啟sshd服務
啟動
service sshd restart
11、驗證sshd是否有效
1)驗證服務
systemctl is-active sshd
啟動后
啟動前
2)查看22端口監聽
netstat -an |grep LISTEN|grep :22
啟動前
啟動后
3)直接CRT登錄
啟動前
啟動后
4)互通之前跳轉
啟動前,無法用ssh維護了,可以通過vnc或者telnet維護
啟動后
5)本地登錄測試
ssh root@localhost
【1】Root用戶
[root@localhost openssh-7.7p1]# ssh root@localhost
The authenticity of host '192.***.43.211 (192.**8.**.211)' can't be established.
ECDSA key fingerprint is SHA256:ri3JqvmpBItq8Ezz03Tzsom4oHs40pdsPLb+X9KyvMY.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.**8.**.211' (ECDSA) to the list of known hosts.
root@192.168.43.211's password:
Last login: Sat Aug 4 05:19:42 2018 from ::ffff:192.**8.**.212
使用root用戶登錄,正常,則成功,若報錯(一次性通過,未遇到報錯,報錯的請自己驗證),
【2】普通用戶
root@ocsdb1[/data/openssh]#ssh wufan@ocsdb1
wufan@ocsdb1's password:
Last login: Sat May 19 12:24:33 2018 from 192.**8.**.211
wufan@ocsdb1[/home/wufan]$
是可以的。
下面修改:
vi /etc/init.d/sshd
在$SSHD $OPTIONS && success || failure這句話前面加一句:
OPTIONS="-f /etc/ssh/sshd_config"
配置如下:
- echo -n $"Starting $prog:"
- OPTIONS="-f /etc/ssh/sshd_config"
- $SSHD $OPTIONS && success || failure
- RETVAL=$?
保存退出。
重啟sshd服務:
systemctl restart sshd
再次登錄就可以了。
寫sh腳本,自動升級
新建腳本update_openssh.sh,加上以下內容,后面直接執行此腳本,即可。
注意:腳本里面指定了版本,你可以更改一下想要升級的版本,還有就是可能你的系統目錄不一樣,自己可以相應改一下,建議先在本地測試一下,線上系統不要輕易嘗試,升級前需要開啟telnet,防止升級失敗,系統無法登錄,對應的防火牆需要開啟telnet的端口
#!/bin/bash ##2019 03 12 15:45:55 ###判斷是否需要安裝wget### WGET=`rpm -qa | grep wget` if [$WGET -z ];then yum install -y wget fi ###准備參數### file=/soft zlib=http://www.zlib.net/zlib-1.2.11.tar.gz openssl=https://www.openssl.org/source/openssl-1.0.2s.tar.gz openssh=https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz ###創建目錄### mkdir -p $file/zlib mkdir -p $file/openssl mkdir -p $file/openssh ###下載安裝包### cd $file wget $zlib wget $openssl wget $openssh ###安裝相關依賴包### yum install -y gcc make perl zlib zlib-devel pam pam-devel ###解壓並進入到相關目錄### tar -xzf zlib*.tar.gz -C $file/zlib tar -xzf openssl*.tar.gz -C $file/openssl tar -xzf openssh*.tar.gz -C $file/openssh ###停止ssh服務,並卸載原有的openssh### systemctl stop sshd systemctl is-active sshd rpm -e --nodeps `rpm -qa | grep openssh` ###安裝zlib### cd $file/zlib/zlib* ./configure --prefix=/usr/local/zlib make make test make install echo '/usr/local/zlib/lib' >> /etc/ld.so.conf.d/zlib.conf ldconfig -v ###安裝opensshl### cd $file/openssl/openssl* ./config shared zlib make make test make install mv /usr/bin/openssl /usr/bin/openssl.bak ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl ln -s /usr/local/ssl/include/openssl /usr/include/openssl echo '/usr/local/ssl/lib' >> /etc/ld.so.conf.d/ssl.conf ldconfig -v openssl version -a ###升級openssh### mv /etc/ssh /etc/ssh.bak cd $file/openssh/openssh* ./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/ssl --mandir=/usr/share/man --with-zlib=/usr/local/zlib make make install /usr/local/openssh/bin/ssh -V cp /soft/openssh/openssh*/contrib/redhat/sshd.init /etc/init.d/sshd chmod u+x /etc/init.d/sshd chkconfig --add sshd chkconfig --list|grep sshd cp /soft/openssh/openssh*/sshd_config /etc/ssh/sshd_config sed -i 's/Subsystem/#Subsystem/g' /etc/ssh/sshd_config echo 'Subsystem sftp /usr/local/openssh/libexec/sftp-server'>> /etc/ssh/sshd_config cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd cp /usr/local/openssh/bin/ssh /usr/bin/ ssh -V cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen sed -i 's/#PasswordAuthentication\ yes/PasswordAuthentication\ yes/g' /etc/ssh/sshd_config echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config service sshd restart systemctl is-active sshd