在第3篇,我講過用putty/winscp輸入使用者名/密碼,遠端登入伺服器,這種登入方式存在一些安全隐患。而本篇講的密鑰登入是一種安全性别更高的登入方式。關于密鑰及其他本篇講到的一些安全性知識概念,參考web安全 (1)。
ssh密碼登入
linux遠端連接配接是使用的ssh,和https有點類似,流程如下:
1.伺服器開啟時預設會打開ssh服務,ssh服務會檢測伺服器私鑰/公鑰,如果不存在就自動生成。
2.使用者請求連接配接伺服器。
3.伺服器發送公鑰給用戶端。我在第3篇講過,如果使用者是第一次連接配接伺服器,會彈出一個視窗。提示大意是收到了來自伺服器的公鑰,而且它是未知的,是否信任它?如果選是,會将這個公鑰儲存在用戶端,以後再次登入時,将新收到的公鑰和之前的對比一緻,說明它是可信的,不再彈出提示。如果和之前的不一緻,可能是伺服器修改了密鑰,或者遇到了黑客。此時也會有提示:
4.用戶端生成對稱密鑰,使用伺服器的公鑰加密,發給伺服器。
5.伺服器用自己的私鑰解密,拿到對稱密鑰。
6.安全通道建立,用戶端和伺服器使用對稱密鑰完成登入和通信。
以上過程看似安全,但仍然有隐患:
1.我在web安全 (1)中講過,公鑰配置設定并不是安全的,是以如何保證用戶端第一次拿到公鑰是真實的?這一點最後再講。
2.密碼雖然加了密,但隻要開放了密碼登入,就存在被黑客攻破的可能性。而ssh密鑰登入就是要關閉密碼登入。
ssh密鑰登入
使用者生成一對公鑰/私鑰,公鑰放在伺服器,私鑰放在用戶端。每次登入通過公鑰和私鑰進行認證,而不再使用密碼。如下:
生成公鑰/私鑰
這裡用root登入伺服器,執行生成密鑰指令:ssh-keygen -t rsa
rsa是現在主流的非對稱加密算法,執行過程中途會問你密鑰儲存位置,以及是否需要密碼,如果設了密碼以後提取密鑰的時候都需要輸入密碼,如果密鑰被盜,而對方不知道密碼将無法正常使用密鑰。這裡全部回車跳過,全預設不設密碼。預設會将公鑰/私鑰儲存在目前使用者的.ssh即/root/.ssh/目錄下。
伺服器公鑰配置
上圖最後一條指令:cat ./.ssh/id_rsa.pub >> ./.ssh/authorized_keys
将生成的公鑰檔案id_rsa.pub的内容,寫入/root/.ssh/authorized_keys檔案中,密鑰登入時,伺服器就是用目前使用者.ssh目錄下的authorized_keys檔案進行認證的。登入其他使用者也是一樣。
用戶端私鑰配置(winscp)
用戶端以winscp為例,将上面生成的私鑰檔案/root/.ssh/id_rsa複制到window中來。在登入winscp時選擇進階,如下配置:
上圖右下角選擇你的id_rsa私鑰檔案,檔案類型選擇全部才能看到,會彈出以下提示,确定轉換格式并會儲存為id_rsa.ppk檔案,如上紅框密鑰檔案處。私鑰配置完畢。
winscp密鑰登入
此時,不需要輸入密碼,直接用root登入winscp,會提示公鑰認證,如下
我在第3篇綁定了winscp和putty,此時會自動用密鑰登入綁定的putty
putty密鑰登入配置
如果要單獨登入putty,配置如下
密鑰登入流程
1.用戶端請求連接配接,伺服器配置設定公鑰,這個過程和上面ssh密碼登入一樣,這裡省略。
2.用戶端請求使用密鑰登入。
3.伺服器生成随機字元串,使用使用者的公鑰加密,發給用戶端。
4.用戶端用自己的私鑰解密随機字元串,生成md5散列值,發回給伺服器。
5.伺服器用原始随機字元串同樣生成md5散列值,與用戶端的比對一緻,認證登入成功。
以上過程中,不需要輸入密碼,而一次性的随機數即使洩露了也沒有任何意義。
關閉密碼登入
修改/etc/ssh/sshd_config檔案,将其中PasswordAuthentication 參數從yes改為no:PasswordAuthentication no
執行指令重新開機ssh服務:systemctl restart sshd
第一次登入的問題
ssh不像https有證書,是以如何保證第一次登入的安全性?
第一次登入時,伺服器上通常什麼資料也沒有,此時并沒有多大風險,而且有足夠的時間檢查你所連接配接的伺服器是否真實,以及檢查是否有人登入過,曾經執行過的指令曆史等。假如真的有黑客在第一次入侵,可以參考我在第11篇講的方法,找到他的id,執行kill,立即修改密碼。然後建立密鑰登入方式,關閉密碼登入。此時即使第一次登入的密碼洩露了也沒事。