在Windows管理Linux服務器時,常使用putty登陸ssh進行遠程管理。默認登陸驗證方式為密碼認證,該方式雖然簡單,但每次登陸都要輸入一長串的密碼,相當麻煩。而且,如果萬一把root允許登陸打開,還有可能被強力破解,導致嚴重的后果。
所以,通常建議用密鑰登陸驗證代替密碼方式,即簡單,又可靠。
一、為什么建議使用密鑰登陸
通常現在的Linux發行版都使用OpenSSH代替telnet、rsh等明文傳輸的終端服務。
以紅旗 DC Server 5.0為例:
# rpm -qa|grep -E -w 'openssh'
openssh-clients-4.0p1-1.2AX
openssh-server-4.0p1-1.2AX
openssh-4.0p1-1.2AX
而OpenSSH默認是同時支持密碼和密鑰兩種認證方式的。轉一個說明:
為什么要使用公鑰認證
通常,通過ssh登錄遠程服務器時,使用密碼認證,分別輸入用戶名和密碼,兩者滿足一定規則就可以登錄。但是密碼認證有以下的缺點:
a)用戶無法設置空密碼(即使系統允許空密碼,也會十分危險)
b)密碼容易被人偷窺或猜到
c)服務器上的一個帳戶若要給多人使用,則必須讓所有使用者都知道密碼,導致密碼容易泄露,而且修改密碼時必須通知所有人
而使用公鑰認證則可以解決上述問題。
a)公鑰認證允許使用空密碼,省去每次登錄都需要輸入密碼的麻煩
b)多個使用者可以通過各自的密鑰登錄到系統上的同一個用戶
c)即使修改了對應用戶的密碼,也不會影響登陸
d)若同時禁用密碼認證,則只要保證私鑰的安全,不會受到暴力破解的威脅
二、使用putty生成密鑰和登陸
根據公鑰認證的原理(見后面說明),認證雙方任何一方都可制作該鑰匙對,并且只要認證方有被認證方的公鑰信息,即可匹配成功。
這里,我們先以Windows上的putty登陸Linux服務器為例說明。所以,該密鑰對由putty制作。
繼續前,請確保您已經把整個putty包都下載完:
官方網站:點擊
最新版本:0.63或1.0,我截圖的版本是0.55的。
點擊這里下載文件
其中包括:PuTTY、Puttygen、PSCP、Plink、Pagent 等工具。
1、使用puttygen制作密鑰
啟動puttygen工具,為兼容OpenSSH密鑰,選擇“SSH2 RSA”:
單擊 Generate 按鈕,并使用鼠標在“key”框內移動,以獲得足夠的隨機數據供生成密鑰使用:
※期間,你會看到進度條上面有個提示“Please generate some radomness by moving the mouse over the blank area.”,意思就是讓你用鼠標在空白區域隨機移動。隨著鼠標在空白區域的移動,進度條會一直走下去。停止移動鼠標,進度條也就停止了。所以,那我們要移動鼠標,直到進度條走滿為止。
完成后的窗口如下:
其中:
引用
Key comment:是注釋,不會影響密鑰的有效性,但可作為自己用于區別其他密鑰的參考;
Key passphrase 和 Confirm passphrase :用于保護私鑰,如果不輸入該信息,那么任何人只要拿到該私鑰,即可無密碼登陸系統,非常危險;通常情況下,我是建議大家輸入的,但這里為了方便說明,暫時留空,請看后面使用的說明。
隨后,點擊“Save private key”保留私鑰。
如果沒有輸入Key passphrase信息,會有警告:
輸入私鑰的文件名:
※公鑰信息可以不用保留在本地的,puttygen可以從私鑰得到它,驗證時也不會用到。
2、修改openssh配置
修改/etc/ssh/sshd_config:
ChallengeResponseAuthentication no #關閉挑戰應答方式
UsePAM no #不使用PAM認證
然后重啟sshd服務,原因見:這里
3、拷貝公鑰信息
上面密鑰信息窗口的“Key”框最后生成的就是公鑰信息:
需要把該信息拷貝到Linux服務器的特定文件中:~/.ssh/authorized_keys
其中,“~”表示對應用戶的主目錄,以root為例。
若.ssh目錄不存在,請創建它,并把公鑰信息寫入文件中:
# mkdir ~/.ssh
# chmod 700 ~/.ssh
# vi ~/.ssh/authorized_keys
# chmod 644 ~/.ssh/authorized_keys
※請務必留意:文件和目錄的權限問題,用戶必須是將要進行認證的用戶,而權限必須是0644,也就是禁止其他人對該文件寫入信息。(否則,某些有心人把自己的公鑰寫入這里,他也可以無密碼進來了)
因為,通常umask是0022或0002的,所以請使用chown和chmod修改為對應的權限咯。
4、使用putty使用密鑰登陸
對putty進行一些簡單配置,即可使用密鑰登陸Linux服務器。
選擇Connection-SSH-Auth,在“Private key file for authentication”輸入密鑰的路徑:
然后在Connection的“Auth-login username”輸入登陸的用戶名,例如root:
◎Putty 0.60 版本在Connection-Data頁內。
然后點擊Open即可:
若一切正常,則可以在session中Save保存配置。
三、使用OpenSSH生成密鑰
密鑰既可使用putty生成,也可用OpenSSH生成。
1、Linux下生成密鑰
運行:
引用
# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <-密鑰路徑
Enter passphrase (empty for no passphrase): <-密鑰保護密碼
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa. <-私鑰
Your public key has been saved in /root/.ssh/id_rsa.pub. <-公鑰
The key fingerprint is:
17:28:4c:c3:e4:18:d4:c2:31:bd:be:a7:a9:d4:a8:48 [email protected]
2、把公鑰信息寫入authorized_keys文件中
運行:
# cd ~/.ssh
# cat id_rsa.pub >> authorized_keys
3、生成putty的私鑰
由于SSH的標準中,并沒有固定密鑰文件的格式。而Putty使用的私鑰格式和OpenSSH生成的有點不同,需要轉換一下。
a)把id_rsa傳到Windows機器上
b)使用puttygen的“Load”讀取id_rsa文件
這里也可以從圖中的公鑰信息,與id_rsa.pub對比一下,應該是一致的。
c)點擊“Save private key”保留私鑰。
d)putty使用該新的私鑰登陸服務器即可。
四、注意事項
1、檢查OpenSSH服務端的配置
OpenSSH的配置通常保存在:/etc/ssh/sshd_config
PermitRootLogin no # 禁止root用戶登陸
StrictModes yes # 檢查密鑰的用戶和權限是否正確,默認打開的
RSAAuthentication yes # 啟用 RSA 認證
AuthorizedKeysFile .ssh/authorized_keys # 驗證公鑰的存放路徑
PubkeyAuthentication yes # 啟用公鑰認證
PasswordAuthentication no # 禁止密碼認證,默認是打開的。
說明:
a)如果StrictModes為yes,而authorized_keys的權限為664等的情況,則驗證密鑰的時候,會報錯:
bad ownership or modes for file /home/linuxing/.ssh/authorized_keys
b)若PasswordAuthentication設置為no,則禁用密碼認證,配合啟動公鑰認證,是更安全的方式。
2、公鑰存放的路徑
Putty作為客戶端是不需要使用公鑰的,而Linux服務端的公鑰是存放在:~/.ssh/authorized_keys中。
也就是講,如果登陸用戶的主目錄不同,存放的路徑是不相同的。
例如某用戶:
$ echo ~
/home/linuxing
則密鑰在:
/home/linuxing/.ssh/authorized_keys
若你想使用同一私鑰,但不同用戶登陸服務器,則請保證公鑰信息已經寫入每個用戶的驗證文件中咯。并且一定要注意驗證文件的用戶和權限不能搞錯哦。
3、Key passphrase密碼
如果你在保存私鑰的時候,輸入了Key passphrase密碼。其就會使用該信息對私鑰加密。這會帶來一個好處:就是萬一您的私鑰給盜走了,但如果小偷不知道該密碼,他也無法使用該私鑰登陸服務器的。簡單來說,就是加強了安全性。
a)在putty使用這種私鑰登陸服務器的時候,就會有提示:
只有輸入正確的密碼才能通過認證。
※這里看上去和使用密碼認證方式登陸OpenSSH有點類似。但實際上是完全不同的。該
Key passphrase密碼是用于管理私鑰,避免私鑰被盜用的;而OpenSSH的密碼認證方式使用的密碼,指的是Linux服務器端的用戶密碼,即PAM信息。也就是說,即使你修改了PAM的密碼,但只要Key passphrase信息正確,你還是可以登陸到服務器上的。(因為使用它解壓出來的私鑰是沒變的)
b)若每次登陸都要輸入Key passphrase,明顯達不到我們簡化登陸步驟的目的。在既要保證安全,又要簡便的情況下,我們可以使用PAGEANT。
PAGEANT的作用很簡單,就是在我們輸入一次私鑰密碼后,把解密后的私鑰保存在PAGEANT中。
再次使用putty登陸的時候,PAGEANT就會自動的把解密后私鑰用于認證,這樣就不用我們多次輸入密碼了。而
當我們退出PAGEANT的時候,會自動刪除私鑰,重新登陸的時候需要再次檢驗。實現“一次驗證,多次使用”的目的。
打開PAGEANT,其會自動放入Windows右下角的任務欄中:
右鍵點擊后,選擇“View Keys”:
在彈出框中,選擇“Add Key”,輸入Putty的私鑰(.PPK),并會提示輸入Key passphrase:
結果:
直接選擇菜單的“Add Key”也可以。
這時候,使用putty再次登陸服務器就不需要Key passphrase啦。
◎其實,即使沒有Key passphrase的私鑰也可以導入PAGEANT中的,這時候就可以不用在Putty的配置文件中指定私鑰的路徑咯。也可以達到一定的安全目的的。
c)若要修改Key passphrase,可以使用puttygen重新Load私鑰,其會咨詢Key passphrase信息:
輸入正確密碼后,即可修改,并保存新私鑰即可。是否存在或修改Key passphrase是不會改變公鑰信息的。
4、保存putty的配置信息
putty的配置信息是保存在Windows注冊表的,需使用下面的命令導出:
regedit /e PuTTY.config.reg "HKEY_CURRENT_USER\Software\SimonTatham\PuTTY"
5、使用DSA密鑰
默認配置下,OpenSSH就同時支持RSA和DSA兩種編碼的密鑰。只要在生成密鑰的時候選擇“DSA”即可。例如:
# ssh-keygen -t dsa
使用上和RSA是沒有區別的,把公鑰信息拷貝到驗證文件中即可使用。
五、公鑰認證的原理
所謂的公鑰認證,實際上是使用一對加密字符串,一個稱為公鑰(public key),任何人都可以看到其內容,用于加密;另一個稱為密鑰(private key),只有擁有者才能看到,用于解密。通過公鑰加密過的密文使用密鑰可以輕松解密,但根據公鑰來猜測密鑰卻十分困難。
ssh 的公鑰認證就是使用了這一特性。服務器和客戶端都各自擁有自己的公鑰和密鑰。為了說明方便,以下將使用這些符號。
Ac 客戶端公鑰
Bc 客戶端密鑰
As 服務器公鑰
Bs 服務器密鑰
在認證之前,客戶端需要通過某種安全的方法將公鑰 Ac 登錄到服務器上。
認證過程分為兩個步驟:
1、會話密鑰(session key)生成
客戶端請求連接服務器,服務器將 As 發送給客戶端。
服務器生成會話ID(session id),設為 p,發送給客戶端。
客戶端生成會話密鑰(session key),設為 q,并計算 r = p xor q。
客戶端將 r 用 As 進行加密,結果發送給服務器。
服務器用 Bs 進行解密,獲得 r。
服務器進行 r xor p 的運算,獲得 q。
至此服務器和客戶端都知道了會話密鑰q,以后的傳輸都將被 q 加密。
2、認證
服務器生成隨機數 x,并用 Ac 加密后生成結果 S(x),發送給客戶端
客戶端使用 Bc 解密 S(x) 得到 x
客戶端計算 q + x 的 md5 值 n(q+x),q為上一步得到的會話密鑰
服務器計算 q + x 的 md5 值 m(q+x)
客戶端將 n(q+x) 發送給服務器
服務器比較 m(q+x) 和 n(q+x),兩者相同則認證成功
六、參考資料
一份非常詳細的putty使用說明:http://docs.google.com/View?docid=ajbgz6fp3pjh_2dwwwwt