服務器密碼被暴力破解了shell
原由:前幾天在騰訊雲建立了個雲服務器,這兩天玩的還挺好,學到很多東西。然而今早忽然看到微信提示,服務器被破解了(具體是root密碼被暴力破解了)。忽然有點懵,而後迅速登錄上服務器查看以後發現並無什麼影響,僅僅只是root密碼被暴力破解。以後不由一陣感慨,服務器居然這麼脆,簡簡單單的2457次嘗試以後就成"別人"的了,網絡還真是個好東西,咱們之間的距離被拉扯到如此之近=.=。ubuntu
解決:感慨一陣事後,我得想辦法解決,因而開始百度,開始嘗試,解決辦法能夠是①關閉端口,能夠關閉全部的端口,沒有端口開放,天然也就不會有什麼入侵了,不過這不太可取。②在端口上限制ip訪問,把22端口從公網到服務器訪問的ip僅僅限制到本機ip地址可訪問便可。騰訊雲的後臺管理提供了這個方法的便捷操做過程,這個可取,馬上設置。③將登錄方式改成ssh祕鑰登陸,禁掉密碼登陸,這個貌似比較安全還比較通用,可取,可是剛開始不太理解原理。但由於有了被破解的經歷,爲了安全就經過一些文檔的說明完成了這一步(其實這是一種私鑰和公鑰配對的方式驗證的,後面才知道)。經過②③兩步服務器基本安全了,問題也就解決了。可是ssh加密以及ssh驗證等問題搞不明白,就有點鬱悶,因而就去看了看服務器的維護,ssh登陸的一些操做,今天主要就是寫這塊。windows
一、ssh傳輸安全
在window上遠程鏈接服務器最經常使用的工具就是xshell、xftp這兩個工具,xshell登陸服務器須要用戶名,密碼(或私鑰),端口號,而服務器只要打開ssh服務,xshell就能夠鏈接進來,得到shell環境。這裏面就有連個問題:登陸和傳輸。服務器
傳輸:通常狀況下,在本機上會用用戶名和密碼(服務器上某個用戶的信息)+端口號(22)登陸,登陸事後開始傳輸數據,那麼傳輸的數據是不是安全的呢?用一些工具能不能查看到數據?其實用xshell(ssh的客戶端)登陸後傳輸數據是安全的,這是由於在傳輸過程當中服務器和客戶端都會對數據進行加密,這裏用到公鑰和私鑰,是一種非對稱加密。微信
細分登陸過程:①啓動ssh服務後,服務器會去找/etc/ssh/ssh_host*(存放公鑰和私鑰),若是沒有則sshd主動創建公鑰,以及私鑰。②客戶端請求創建鏈接。③服務器將公鑰發送給客戶端(公鑰是明文存在)。④若是第一次與服務器鏈接,將公鑰加入~/.ssh/know_hosts文件中,若不是第一次鏈接,則對比與之前的記錄是否有差別(這裏的差別是,服務器那邊將公鑰換過以後,客戶端並不知道)。⑤客戶端將自身生成私鑰和公鑰,並將公鑰回傳給服務器。到此客戶端有「服務器的公鑰和自身的私鑰」,服務器有客戶端的「公鑰和自身的私鑰」。這即是非對稱加密。⑥服務器和客戶端開始雙向傳輸數據,客戶端用本身私鑰加密--->服務器用客戶端的公鑰解密,反之亦然。網絡
經過這種登陸過程以後,服務器和客戶端相互傳遞信息是安全的。ssh
二、ssh登陸工具
說回以前的ssh登陸(具體是登陸時所用的密碼或祕鑰),由於今天在看東西的時候把登陸和傳輸搞混了,所以在這裏分開寫。這裏不說windows的xshell了,直接說ssh命令,其實xshell的登陸方式就是使用的ssh命令,只不過他多出圖形化界面。加密
在用ssh命令登陸服務器時,要輸入用戶密碼才能夠登陸成功。輸入密碼這種方式很簡單很容易理解,新手也很容易操做,在本地虛擬機上採用這種方式登陸很方便。可是就像上面圖片所示,若是服務器對外網開放,用戶密碼很容易被暴力破解,所以,通常的服務器不推薦這種方式登陸。在這裏就要用到祕鑰了,具體來講是一對祕鑰(公鑰和私鑰)。配置的具體過程是這樣的:先生成一對祕鑰,將公鑰拷貝到服務器某個用戶的~/.ssh/authorized_keys文件中去,將私鑰(id_rsa文件)拷貝到客戶端某個用戶的~/.ssh文件夾中,id_rsa權限爲600,~/.ssh目錄權限爲700。客戶端有id_rsa的用戶在使用ssh命令登陸服務器那個拷貝過公鑰的用戶時就不須要密碼或其餘東西了。
這裏很容易出現誤解,我以前用過scp命令,和ssh命令類似,就出現了誤解。由於不須要密碼,因此很簡單很方便,用的挺開心。可是碰到今天的事情以後,就有了疑問,騰訊云爲何綁定一個文件到服務器,又要下載一個祕鑰文件,加載到xshell中後才能登陸?
下面將ssh免密登陸的過程在走一遍:
①在家目錄下(~)運行ssh-keygen -t rsa 而後敲三次回車 //別的目錄運行也能夠,不過要移動文件。
②將.ssh文件下的id_rsa.pub拷貝到服務器的某用戶(這裏是ubuntu這個用戶)~/.ssh目錄下的authorized_keys文件中。//最好在服務器的家目錄下也運行①中的命令,建立出./ssh文件。這個文件是默認隱藏的,用ls -al能夠查看
③上面scp命令,將本地公鑰拷貝到服務器,由於還用講公鑰寫入服務器的authorized_keys文件,因此用ssh命令登陸服務器,這兩條命令都須要輸入密碼(爲了方便先打開密碼可用)
④上圖將公鑰寫入服務器的~/.ssh/authorized_keys,並退出。接下來在從客戶端登陸服務器不在須要密碼,以下圖。固然scp命令也就不須要密碼了,這就是祕鑰登陸,本地保存一份私鑰,服務器上有公鑰,就能夠實現免密登陸了,這裏重點區別前面所說的傳輸是用的公鑰和私鑰(重)。
三、說回不理解的地方
爲何騰訊雲生成ssh祕鑰後將祕鑰與服務器綁定,在提供用戶下載一份後,就能夠經過祕鑰鏈接服務器了?
其實就是2中所說的登陸原理,與雲服務器綁定的祕鑰是公鑰,用戶下載的是私鑰,本地有了私鑰就不須要驗證了。在登陸時要把私鑰位置告訴ssh命令或者xshell便可。
上圖所示,將私鑰移動到家目錄後在登陸就須要密碼了,由於.ssh目錄下沒有私鑰了。而後ssh命令加-i 參數,明確指出私鑰地址後,登陸不須要密碼。這種加-i的方式就使用與從雲服務器上下載的私鑰。
最後說明,登陸到服務器意爲:客戶端某用戶登陸到服務器上的某用戶,在這裏祕鑰的驗證發生在用戶和用戶之間,所以公鑰私鑰都是放在某用戶的家目錄下。與以前所說的把祕鑰放在/etc/ssh/ssh_host*文件中區別看待。