從這個討論中﹐我發現似乎很多人對 ssh 的連線原理還不很清楚﹐
我這裡不妨就自己已知的一些概念和大家說說﹐
不保證完全正確﹐但希能有住大家的理解﹐更歡迎指出不正確之處。
ssh 之所以大行其道﹐而且被認為‘目前不可破解’的原因﹐
必須透過了解 ssh 在加密 key 之應用才能領會。
這裡﹐我們不需要再討論加密演算法了﹐相信大家對演算法一定很有信心的﹐
同時我們也知道作為加密的 key 長度越長﹐破解難度就越高﹐
所以大家應該知道要破解 1024-bit RSA/DSA 加密需要多長時間﹖
我猜目前沒有哪台機器能在 60分鐘 內破解 768-bit 的 RSA 加密吧﹖
如果這個 key 再加上另外其他 keys 一起使用呢﹖就更難了~~
好了﹐當我們對演算法有足夠信心之後﹐
再讓我們分別看看 ssh 連線所使用到的 keys 有哪些 ﹕
* Host_Key﹕1024-bit RSA 或 DSA 非對稱加密
可以用 ssh-keygen 在任何時候產生一對 key ﹐
分別為 /etc/ssh/ssh_host_key.pub 和 /etc/ssh/ssh_host_key ﹔
其中的 public Host_Key 給對方加密使用﹐己方使用 private key 解密。
* Server_Key﹕768-bit RSA 非對稱加密
不存在硬碟上﹐每次在 sshd 啟動的時候隨機產生(關閉 sshd 則消失)﹐
並且每 60分鐘(預設)會更換一次﹔
其中的 public Server_Key 給對方加密使用﹐己方使用 private key 解密。
* Session_Key﹕256-bit Blowfish 或 IDEA 單向加密
在得到對方的 public Host_Key 和 public Server_Key 之後﹐
隨機產生﹐並連同得到的 Host_Key 和 Server_Key 一起加密﹐
以作為後面所有連續的加密之需。
Okay ﹐當我們認識了上面三把 key 之後﹐再讓我們看看 ssh 的連線過程﹕
1) ssh client 連到 server 端 tcp port 22(預設)﹐並提出連線請求﹔
2) server 端回應 Host_Key 和 Server_Key 給 client ﹔
3) client 端會對 Host_Key 進行驗證﹐以確定出現在 known_hosts 中,
否則﹐會提示您是否接受 (按 yes 三鍵為接受)﹔
4) 通過驗證之後﹐client 隨機產生 Session_Key﹐
並分別與收到的兩把 keys 作加密(先 Host_Key 再 Server_Key)﹐
然後用來處理後面的每一個連線。
5) 進入身份驗證階段﹐通常有如下數種方式﹕
* Rhost
* Rhost & RSA
* RSA
* Password
6) 驗證成功後﹐正式進行 ssh 連線﹐直至結束。
許多朋友﹐通常卡在 authentication 這關﹐
或許會誤會 ssh 只用來加密 authentication 而已﹐
事實上是錯誤的理解。下面讓我們再看看 sshd 在驗證的時候的流程﹕
1) 檢查 tcpwrapper 設定(hosts.allow / hosts.deny)﹐
如果成功則進入下一步﹐失敗則拒絕。
2) 進行 Host_Key 驗證﹐如果成功(或接受)﹐則進入下一步﹔
3) 嘗試 Rhost 驗證﹐如果成功﹐則通過驗證﹐否則進入下一步﹔
4) 嘗試 Rhost & RSA 驗證﹐如果成功﹐則通過驗證﹐否則進入下一步﹔
5) 嘗試 RSA 驗證( ssh v2 取消了﹖這個我不確定﹐參考 *** howto 要留意。)
如果成功﹐則通過驗證﹐否則進入下一步﹔
6) 最後嘗試 password 驗證﹐如果成功﹐通過驗證﹐否則拒絕連線。
我這裡不妨就自己已知的一些概念和大家說說﹐
不保證完全正確﹐但希能有住大家的理解﹐更歡迎指出不正確之處。
ssh 之所以大行其道﹐而且被認為‘目前不可破解’的原因﹐
必須透過了解 ssh 在加密 key 之應用才能領會。
這裡﹐我們不需要再討論加密演算法了﹐相信大家對演算法一定很有信心的﹐
同時我們也知道作為加密的 key 長度越長﹐破解難度就越高﹐
所以大家應該知道要破解 1024-bit RSA/DSA 加密需要多長時間﹖
我猜目前沒有哪台機器能在 60分鐘 內破解 768-bit 的 RSA 加密吧﹖
如果這個 key 再加上另外其他 keys 一起使用呢﹖就更難了~~
好了﹐當我們對演算法有足夠信心之後﹐
再讓我們分別看看 ssh 連線所使用到的 keys 有哪些 ﹕
* Host_Key﹕1024-bit RSA 或 DSA 非對稱加密
可以用 ssh-keygen 在任何時候產生一對 key ﹐
分別為 /etc/ssh/ssh_host_key.pub 和 /etc/ssh/ssh_host_key ﹔
其中的 public Host_Key 給對方加密使用﹐己方使用 private key 解密。
* Server_Key﹕768-bit RSA 非對稱加密
不存在硬碟上﹐每次在 sshd 啟動的時候隨機產生(關閉 sshd 則消失)﹐
並且每 60分鐘(預設)會更換一次﹔
其中的 public Server_Key 給對方加密使用﹐己方使用 private key 解密。
* Session_Key﹕256-bit Blowfish 或 IDEA 單向加密
在得到對方的 public Host_Key 和 public Server_Key 之後﹐
隨機產生﹐並連同得到的 Host_Key 和 Server_Key 一起加密﹐
以作為後面所有連續的加密之需。
Okay ﹐當我們認識了上面三把 key 之後﹐再讓我們看看 ssh 的連線過程﹕
1) ssh client 連到 server 端 tcp port 22(預設)﹐並提出連線請求﹔
2) server 端回應 Host_Key 和 Server_Key 給 client ﹔
3) client 端會對 Host_Key 進行驗證﹐以確定出現在 known_hosts 中,
否則﹐會提示您是否接受 (按 yes 三鍵為接受)﹔
4) 通過驗證之後﹐client 隨機產生 Session_Key﹐
並分別與收到的兩把 keys 作加密(先 Host_Key 再 Server_Key)﹐
然後用來處理後面的每一個連線。
5) 進入身份驗證階段﹐通常有如下數種方式﹕
* Rhost
* Rhost & RSA
* RSA
* Password
6) 驗證成功後﹐正式進行 ssh 連線﹐直至結束。
許多朋友﹐通常卡在 authentication 這關﹐
或許會誤會 ssh 只用來加密 authentication 而已﹐
事實上是錯誤的理解。下面讓我們再看看 sshd 在驗證的時候的流程﹕
1) 檢查 tcpwrapper 設定(hosts.allow / hosts.deny)﹐
如果成功則進入下一步﹐失敗則拒絕。
2) 進行 Host_Key 驗證﹐如果成功(或接受)﹐則進入下一步﹔
3) 嘗試 Rhost 驗證﹐如果成功﹐則通過驗證﹐否則進入下一步﹔
4) 嘗試 Rhost & RSA 驗證﹐如果成功﹐則通過驗證﹐否則進入下一步﹔
5) 嘗試 RSA 驗證( ssh v2 取消了﹖這個我不確定﹐參考 *** howto 要留意。)
如果成功﹐則通過驗證﹐否則進入下一步﹔
6) 最後嘗試 password 驗證﹐如果成功﹐通過驗證﹐否則拒絕連線。
转载于:https://blog.51cto.com/jasonyong/196469