CentOS7升級openssh
升級版本的原因,是安全漏洞掃描出了高危漏洞;
漏洞的描述大概是這麼個意思:
伺服器本身運行的openssh服務版本低,並且開啟了scp,需要升級最新版(最新版居然也解決不了scp的問題);
同時需要禁用scp,可以臨時開啟rsync來替代(其實就關閉scp就完事了rsync也不開了…,不過若有需求則需要開啟,本篇主要是ssh和ssl升級);
起初由於是外地機房,為了防止出現問題,是負責機房硬體維護的人員進行的openssh升級並卸載了scp,雖然順利升級,但是在複查時,這個問題居然沒有修復;
在詢問了幾位安全人員這個問題原因後,被告知,這個問題沒有修復並不在openssh上面,而是在openssl上面(問題在openssl上,只不過掃描只能告訴你是openssh的問題);
升級openssh是需要一起升級openssl的,並要求新的openssh使用新的openssl;
(硬體維護並不是我司的專職人員,時間比較緊,那麼我就自己動手吧…😅)
3、升級openssh (順便處理scp的安全問題,直接給卸載嘍)↓
這個telnet比較重要奧,因為我們要動的是openssh,也就是sshd的服務會動,萬一你出錯了,對於遠程操作的我來說就是致命的,只能跑到機房處理了;
配置並開啟telnet
保證在沒有sshd服務正常運行的情況下,依然可以遠程連接到伺服器進行操作(用完記得關掉)
##yum 來安裝服務,沒有外網情況請使用rpm包安裝
[root@postgreSQL ~]# yum install -y xinetd telnet-server
我們的升級軟體需要root的許可權,我這裡是直接登錄root用戶進行操作(用完記得將這些配置清除);
而安裝完成後默認是不允許登錄的,你連接可以,但是當輸入密碼後,會一直提示你輸入密碼;
這裡我們需要配置一下,允許root用戶連接;
##直接vi或vim打開文件,一般這個文件安裝過後是沒有的 [root@postgreSQL ~]# vim /etc/xinetd.d/telnet service telnet { disable = yes flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd log_on_failure += USERID } ##配置允許root用戶登錄後,其實也不能登錄,需要再配置另一個文件; ## /etc/securetty 是設置 root 用戶允許從哪個設備登錄 ## 直接添加到最後面就可以 [root@postgreSQL ~]# vim /etc/securetty ... ... ... ... pts/0 pts/1 pts/2 pts/3
配置之後,我們嘗試使用telnet來連接到伺服器;
##開啟xinetd [root@postgreSQL ~]# systemctl start xinetd [root@postgreSQL ~]# systemctl status xinetd ● xinetd.service - Xinetd A Powerful Replacement For Inetd Loaded: loaded (/usr/lib/systemd/system/xinetd.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2021-07-03 14:58:24 CST; 36s ago Process: 1480 ExecStart=/usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid $EXTRAOPTIONS (code=exited, status=0/SUCCESS) Main PID: 1481 (xinetd) CGroup: /system.slice/xinetd.service └─1481 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid Jul 03 14:58:24 postgreSQL xinetd[1481]: removing discard Jul 03 14:58:24 postgreSQL xinetd[1481]: removing discard ... ... ... ... ##開啟telnet,如果提示你找不到服務什麼的,記得加後面 .socket [root@postgreSQL ~]# systemctl start telnet.socket [root@postgreSQL ~]# systemctl status telnet.socket ● telnet.socket - Telnet Server Activation Socket Loaded: loaded (/usr/lib/systemd/system/telnet.socket; disabled; vendor preset: disabled) Active: active (listening) since Sat 2021-07-03 14:59:12 CST; 17s ago Docs: man:telnetd(8) Listen: [::]:23 (Stream) Accepted: 0; Connected: 0 Jul 03 14:59:12 postgreSQL systemd[1]: Listening on Telnet Server Activation Socket. ##以防萬一,設置下開機啟動 [root@postgreSQL ~]# systemctl enable xinetd [root@postgreSQL ~]# systemctl enable telnet.socket [root@postgreSQL ~]# systemctl is-enabled xinetd enabled [root@postgreSQL ~]# systemctl is-enabled telnet.socket enabled
嘗試登錄(我使用Xshell,登錄時把開頭 ssh 換為 telnet );
登錄成功後,就可以保證在沒有sshd運行的情況下,依然可以連接到伺服器了;
Xshell 7 (Build 0073) Copyright (c) 2020 NetSarang Computer, Inc. All rights reserved. Type `help' to learn how to use Xshell prompt. [C:\~]$ telnet 192.168.1.90 Connecting to 192.168.1.90:23... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Kernel 3.10.0-1160.el7.x86_64 on an x86_64 postgreSQL login: root Password: Last failed login: Sat Jul 3 15:06:27 CST 2021 from ::ffff:192.168.1.10 on pts/1 There was 1 failed login attempt since the last successful login. Last login: Sat Jul 3 14:34:52 from 192.168.1.10 [root@postgreSQL ~]#
升級openssl
我們先來看看當前的情況:
##ssl的版本是1.0.2k [root@postgreSQL ~]# openssl version OpenSSL 1.0.2k-fips 26 Jan 2017 ##當前ssh版本為OpenSSH_7.4p1,使用的ssl是1.0.2k ##我們當前時間最新的版本為 openssh-8.6p1 和 openssl-1.1.1k [root@postgreSQL ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 ##當前 scp 是可執行的命令 [root@postgreSQL ~]# scp usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 ... [[user@]host2:]file2
升級openssl並重新編譯Nginx – 感覺不妥 – 部落格園 (cnblogs.com)
這個是我之前在處理TLS相關的安全漏洞時升級openssl寫的一篇,其目的是使nginx可以使用符合要求的TLS版本;
但當時是我第一次升級openssl,當時安裝並沒有指定安裝路徑,導致了一堆問題(順便都處理了);
這次我依然使用不指定路徑的方式來安裝,因為之後在安裝openssh的時候,其中的參數有一些問題,沒有寫對,是會報錯的;
(報錯了,你才會去了解,這些參數需要的是什麼值)
##簡單寫一下openssl升級的命令,詳細一點可以看下上面的連接 ##安裝依賴包 [root@postgreSQL ~]# yum -y install perl perl-devel gcc gcc-c++ wget ##下載openssl的軟體包 [root@postgreSQL ~]# wget //www.openssl.org/source/openssl-1.1.1k.tar.gz ##解壓包,可以 -C 來指定一個目錄位置,方便管理 [root@postgreSQL ~]# tar -xvf openssl-1.1.1k.tar.gz ##編譯安裝,如果想,可以添加 --prefix= 來指定路徑 ##執行後會生成一些文件,默認為當前目錄 ##所以要先cd一下,否則當前目錄會生成很多文件 [root@postgreSQL ~]# cd openssl-1.1.1k [root@postgreSQL openssl-1.1.1k]# ./config [root@postgreSQL openssl-1.1.1k]# make && make install ##解決一些鏈接庫的問題 [root@postgreSQL openssl-1.1.1k]# ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/ [root@postgreSQL openssl-1.1.1k]# ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/ [root@postgreSQL openssl-1.1.1k]# cp -a libssl.a /usr/local/lib/ [root@postgreSQL openssl-1.1.1k]# cp -a libcrypto.a /usr/local/lib/ ##查看版本 [root@postgreSQL openssl-1.1.1k]# openssl version OpenSSL 1.1.1k 25 Mar 2021 [root@postgreSQL openssl-1.1.1k]# which openssl /usr/local/bin/openssl ##若版本不是新版,需要替換舊版 [root@postgreSQL openssl-1.1.1k]# which openssl /usr/bin/openssl [root@postgreSQL openssl-1.1.1k]# cd /usr/bin/ [root@postgreSQL bin]# mv openssl openssl102 [root@postgreSQL bin]# ln -s /usr/local/bin/openssl openssl ##卸載舊版本 [root@postgreSQL bin]# yum erase -y openssl
此刻你便擁有了新版的openssl。
升級openssh
官方下載地址://www.openssh.com/portable.html
根據自己的需要下載版本;
##下載安裝包,我直接wget下了 ##找自己需要的版本,地址替換即可 [root@postgreSQL ~]# wget //ftp.spline.de/pub/OpenBSD/OpenSSH/portable/openssh-8.6p1.tar.gz ##解壓包 [root@postgreSQL ~]# ls -lh openssh-8.6p1.tar.gz -rw-r--r-- 1 root root 1.8M Apr 19 07:07 openssh-8.6p1.tar.gz [root@postgreSQL ~]# tar -xvf openssh-8.6p1.tar.gz
接下來我沒清理一下舊版本的軟體及各種配置文件;
##查看下當前服務 [root@postgreSQL ~]# systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2021-07-03 22:31:21 CST; 6h left Docs: man:sshd(8) man:sshd_config(5) Main PID: 936 (sshd) CGroup: /system.slice/sshd.service ... ... ... ... ##刪除原有配置文件 [root@postgreSQL ~]# cd /etc/ [root@postgreSQL etc]# rm -fr ssh ##卸載舊版本 [root@postgreSQL etc]# rpm -qa | grep openssh-* openssh-clients-7.4p1-21.el7.x86_64 openssh-7.4p1-21.el7.x86_64 openssh-server-7.4p1-21.el7.x86_64 [root@postgreSQL etc]# systemctl stop sshd [root@postgreSQL etc]# yum erase -y openssh-clients openssh-server openssh ##完成卸載 [root@postgreSQL etc]# ssh -v -bash: /bin/ssh: No such file or directory
這裡插一段,先說一下編譯安裝時的兩個參數:
–with-openssl-includes=/usr/local/include
指定路徑錯誤會報:configure: error: OpenSSL library not found.
##由於之前我的openssl的安裝沒有指定目錄,其會直接安裝到 /usr/local 下 [root@postgreSQL openssl]# cd /usr/local/ [root@postgreSQL local]# ls bin etc games include lib lib64 libexec sbin share src ssl ##這裡的 include 便是我們安裝的新版的 openssl 的運行文件; ##我們使用編譯安裝都需要 gcc gcc-c++ ,它們使用的是C C++ ,這些是運行需要的頭文件; ##我暫時不會C語言,也只是看相關帖子說明事大概這麼個意思; ##這裡需要知道的,就是我們要指定我們新安裝的openssl的目錄即可; [root@postgreSQL openssh-8.6p1]# cd /usr/local/include [root@postgreSQL include]# ls openssl [root@postgreSQL include]# cd openssl/ [root@postgreSQL openssl]# ls aes.h cms.h ecdsa.h modes.h rand.h store.h asn1err.h comperr.h ecerr.h objectserr.h rc2.h symhacks.h asn1.h comp.h ec.h objects.h rc4.h tls1.h asn1_mac.h conf_api.h engineerr.h obj_mac.h rc5.h tserr.h asn1t.h conferr.h engine.h ocsperr.h ripemd.h ts.h asyncerr.h conf.h e_os2.h ocsp.h rsaerr.h txt_db.h async.h cryptoerr.h err.h opensslconf.h rsa.h uierr.h bioerr.h crypto.h evperr.h opensslv.h safestack.h ui.h bio.h cterr.h evp.h ossl_typ.h seed.h whrlpool.h blowfish.h ct.h hmac.h pem2.h sha.h x509err.h bnerr.h des.h idea.h pemerr.h srp.h x509.h bn.h dherr.h kdferr.h pem.h srtp.h x509v3err.h buffererr.h dh.h kdf.h pkcs12err.h ssl2.h x509v3.h buffer.h dsaerr.h lhash.h pkcs12.h ssl3.h x509_vfy.h camellia.h dsa.h md2.h pkcs7err.h sslerr.h cast.h dtls1.h md4.h pkcs7.h ssl.h cmac.h ebcdic.h md5.h rand_drbg.h stack.h cmserr.h ecdh.h mdc2.h randerr.h storeerr.h
–with-ssl-dir=/usr/local/bin
指定路徑錯誤會報:configure: error: *** working libcrypto not found, check config.log
##這個參數需要你指定openssl的目錄 ##但是你需要注意,若之前沒有卸載舊版本的話,會出現多個openssl ##有多個openssl的時候,你需要看一下哪個路徑下的openssl是新版,之後指定這個路徑即可 [root@postgreSQL openssh-8.6p1]# which openssl /usr/local/bin/openssl [root@postgreSQL openssh-8.6p1]# /usr/local/bin/openssl version OpenSSL 1.1.1k 25 Mar 2021
–with-pam
指定了pam參數但沒有安裝服務會報:configure: error: PAM headers not found
##安裝需要的軟體包即可 [root@postgreSQL openssh-8.6p1]# yum install -y pam-devel
之後我們開始安裝新版;
##切回openssh的解壓目錄 [root@postgreSQL etc]# cd /root/openssh-8.6p1 ##這裡需要解讀一些配置的參數,寫錯了會報錯的 [root@postgreSQL openssh-8.6p1]# ./configure --prefix=/usr/ --sysconfdir=/etc/ssh \ > --with-openssl-includes=/usr/local/include --with-ssl-dir=/usr/local/bin \ > --with-zlib --with-md5-passwords --with-pam ## --prefix=/usr/ 這裡還是指定一下安裝的目錄路徑 ## --sysconfdir=/etc/ssh 這裡指定的配置文件的目錄路徑 ## --with-openssl-includes=/usr/local/include 看上面講一下 ## --with-ssl-dir=/usr/local/openssl 看上面講一下 ##後面參數不需要調整,寫上就可以啦 ##安裝 [root@postgreSQL openssh-8.6p1]# make && make install ##看下資訊,已經完成升級了 [root@postgreSQL openssh-8.6p1]# ssh -V OpenSSH_8.6p1, OpenSSL 1.1.1k 25 Mar 2021
配置服務及啟動;
##在我們解壓的軟體包目錄下有自帶的服務配置文件 [root@postgreSQL openssh-8.6p1]# ls contrib/redhat/sshd.init contrib/redhat/sshd.init ##將其複製到啟動配置文件的目錄下 [root@postgreSQL openssh-8.6p1]# cp -a contrib/redhat/sshd.init /etc/init.d/sshd ##查看是否有執行許可權,若沒有,需要 chmod +x 來賦權 [root@postgreSQL openssh-8.6p1]# ls -l /etc/init.d/sshd -rwxr-xr-x 1 root root 1721 Apr 16 11:55 /etc/init.d/sshd ##添加服務 [root@postgreSQL openssh-8.6p1]# chkconfig --add sshd ##啟動服務並查看狀態 [root@postgreSQL openssh-8.6p1]# systemctl start sshd [root@postgreSQL openssh-8.6p1]# systemctl status sshd ● sshd.service - SYSV: OpenSSH server daemon Loaded: loaded (/etc/rc.d/init.d/sshd; bad; vendor preset: enabled) Active: active (running) since Sat 2021-07-03 17:56:23 CST; 9s ago Docs: man:systemd-sysv-generator(8) Process: 57383 ExecStart=/etc/rc.d/init.d/sshd start (code=exited, status=0/SUCCESS) Main PID: 57391 (sshd) CGroup: /system.slice/sshd.service └─57391 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups Jul 03 17:56:23 postgreSQL systemd[1]: Starting SYSV: OpenSSH server daemon... Jul 03 17:56:23 postgreSQL sshd[57383]: Starting sshd:[ OK ] Jul 03 17:56:23 postgreSQL systemd[1]: Can't open PID file /var/run/sshd.pid (yet?) ...ory Jul 03 17:56:23 postgreSQL sshd[57391]: Server listening on 0.0.0.0 port 22. Jul 03 17:56:23 postgreSQL sshd[57391]: Server listening on :: port 22. Jul 03 17:56:23 postgreSQL systemd[1]: Started SYSV: OpenSSH server daemon. Hint: Some lines were ellipsized, use -l to show in full. ##順便設置一下開機自動啟動 ##常規的 systemctl 設置會給予一個提示,命令被重定向了,那麼就使用提示給的命令 [root@postgreSQL openssh-8.6p1]# systemctl enable sshd sshd.service is not a native service, redirecting to /sbin/chkconfig. Executing /sbin/chkconfig sshd on ##再次設置開機啟動 ##下面顯示2、3、4、5是on就可以,其數字代表啟動級別 [root@postgreSQL openssh-8.6p1]# /sbin/chkconfig sshd on [root@postgreSQL openssh-8.6p1]# chkconfig --list sshd Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration. If you want to list systemd services use 'systemctl list-unit-files'. To see services enabled on particular target use 'systemctl list-dependencies [target]'. sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off ##現在的情況下,就已經可以連接了,但是不能登錄,依然提示輸入密碼 ##類似的情況之前設置telnet時也出現了,所以要為用戶設置登錄的許可權 ##結尾添加即可 [root@postgreSQL openssh-8.6p1]# vim /etc/ssh/sshd_config ... ... ... ... permitRootlogin yes ##重啟服務 [root@postgreSQL openssh-8.6p1]# service sshd restart Restarting sshd (via systemctl): [ OK ] ##之後嘗試ssh連接登錄 [C:\~]$ ssh 192.168.1.90 Connecting to 192.168.1.90:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. WARNING! The remote SSH server rejected X11 forwarding request. Last login: Sat Jul 3 15:18:30 2021 from ::ffff:192.168.1.10 [root@postgreSQL ~]#
刪除scp相關文件;
##做了一套操作之後,好像忘了當初是因為什麼原因才升級的,其實就是因為scp的問題 ##但是你現在scp一下看看 [root@postgreSQL ~]# scp usage: scp [-346ABCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] [-J destination] [-l limit] [-o ssh_option] [-P port] [-S program] source ... target [root@postgreSQL ~]# ##其實之前我們卸載舊版的 openssh 的時候帶上的 openssh-clients,就是卸載scp的 ##但是由於它本身是openssh軟體中其中的一部分,我們重新編譯安裝後,其實也把它重新安裝了 [root@postgreSQL ~]# which scp /usr/bin/scp ##現在我們要卸載scp,由於是編譯安裝,直接將文件刪除即可,不影響其他使用 [root@postgreSQL usr]# find /usr -name "scp*" /usr/bin/scp /usr/lib/firmware/mediatek/mt8183/scp.img /usr/share/man/man1/scp.1 [root@postgreSQL usr]# find /usr -name "scp*" -exec rm -fr {} \; ##之後查看一下scp的命令 [root@postgreSQL usr]# scp -bash: /usr/bin/scp: No such file or directory ##再開啟另一個伺服器(虛擬機)使用scp來拷貝文件 ##無論是向里傳輸文件,還是向外拷貝文件均不成功 [root@kafka-test ~]# which scp /usr/bin/scp [root@kafka-test ~]# scp 192.168.1.90:/root/file1 . The authenticity of host '192.168.1.90 (192.168.1.90)' can't be established. ECDSA key fingerprint is SHA256:+w4yEM9OVJu7utY/Xl5pO+/vc1ILUPzIJx2DvGX8NsQ. ECDSA key fingerprint is MD5:27:89:b4:75:2c:b4:3b:85:e1:66:6a:b6:a5:3a:53:c2. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.90' (ECDSA) to the list of known hosts. [email protected]'s password: bash: scp: command not found [root@kafka-test ~]# scp file2 192.168.1.90:/root/ [email protected]'s password: bash: scp: command not found lost connection
關閉telnet相關設置
當我們的sshd可以正常使用了之後,我們需要關閉之前臨時開啟的telnet(甚至卸載);
##刪除允許telnet登錄的設備,刪除xvc0後面我們添加的即可 [root@postgreSQL ~]# vim /etc/securetty ... ... ... ... xvc0 ##刪除 root 登錄的 telnet 配置文件 [root@postgreSQL ~]# cd /etc/xinetd.d/ [root@postgreSQL xinetd.d]# rm -f telnet ##取消開機啟動並停止服務 [root@postgreSQL xinetd.d]# systemctl stop xinetd [root@postgreSQL xinetd.d]# systemctl stop telnet.socket [root@postgreSQL xinetd.d]# systemctl disable xinetd Removed symlink /etc/systemd/system/multi-user.target.wants/xinetd.service. [root@postgreSQL xinetd.d]# systemctl disable telnet.socket Removed symlink /etc/systemd/system/sockets.target.wants/telnet.socket. ##telnet服務的埠號默認是23,可以查看一下,已經沒有了 [root@postgreSQL xinetd.d]# netstat -antupl | grep :23 [root@postgreSQL xinetd.d]# lsof -i:23 ##再徹底一點,就是將服務卸載,這一步根據自己的情況來做吧 [root@postgreSQL xinetd.d]# yum erase -y xinetd telnet-server