ssh原理及應用

1. SSH是什么

簡單說,SSH是一種網絡協議,用于計算機之間的遠程加密登錄。

SSH 為 Secure Shell的縮寫扣甲,由 IETF 的網絡小組(Network Working Group)所制定,SSH 為建立在應用層基礎上的安全協議齿椅。SSH 是目前較可靠琉挖,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題媒咳。SSH最初是UNIX系統(tǒng)上的一個程序粹排,后來又迅速擴展到其他操作平臺。SSH安裝容易涩澡、使用簡單顽耳,而且比較常見,一般的Unix系統(tǒng)妙同、Linux系統(tǒng)射富、FreeBSD系統(tǒng)都附帶有支持SSH的應用程序包。Windows如果需要使用SSH粥帚,可以安裝PuTTY或者Cygwin胰耗。

2. SSH原理

非對稱加密技術

SSH 服務基于非對稱加密(public-key cryptography,也稱公開密鑰加密)技術實現數據加密傳輸芒涡。該技術會生成一對數學相關的密鑰柴灯,其中一個用于對數據進行加密,而且只能用于加密费尽,而另一個只能用于解密赠群。使用加密密鑰加密后的數據,只能用對應的解密密鑰才能解密旱幼。而且查描,只知道其中一個密鑰,無法計算出另一個。因此冬三,如果公開了一對密鑰中的一個匀油,并不會危害到另一個的秘密性質。通常把公開的密鑰稱為公鑰(public key)勾笆,而不公開的密鑰稱為私鑰(private key)敌蚜。

一般來說,非對稱加密的應用場景有兩個:

  • 公鑰是用來解密的匠襟。比如A給B發(fā)送消息钝侠,B使用A的公鑰驗證A發(fā)布的數據或文件的完整性、準確性酸舍,以防止數據篡改。相應的密鑰稱為數字簽名(數字證書)里初。
  • 公鑰是用來加密的啃勉。比如A給B發(fā)送消息,A使用B的公鑰給消息加密双妨,以防被劫持后泄漏淮阐。SSH服務基于該場景實現。

與對稱密鑰加密相比刁品,非對稱加密的優(yōu)點在于不存在共享的通用密鑰泣特。由于解密用的私鑰無需發(fā)送給任何用戶,所以可以避免密鑰被劫持或篡改挑随。而加密用的公鑰即便被劫持或篡改状您,如果沒有與其匹配的私鑰,也無法解密數據兜挨。所以膏孟,截獲的公鑰是沒有任何用處的。

當前拌汇,SSH主要采用 RSA 算法(協議 V2 默認算法)和 DSA 算法(協議 V1 僅支持該算法)來實現非對稱加密技術柒桑。

3. SSH連接交互過程

SSH連接交互過程

SSH連接時,整個交互過程如上圖噪舀。魁淳,主要可以分為三個階段

服務端準備階段

服務端在每次啟動 SSH 服務時,都會自動檢查 /etc/ssh/ 目錄下相關密鑰文件的有效性与倡。如果相關文件檢查發(fā)現異常界逛,則會導致服務啟動失敗,并拋出相應錯誤信息蒸走。 如果文件相關不存在仇奶,則會自動重新創(chuàng)建。

默認創(chuàng)建的相關文件及用途說明如下:

ll /etc/ssh/

-rw-------. 1 root root 125811 Aug 13  2015 moduli          → 用于 DH-GEX 算法
-rw-r--r--. 1 root root   2047 Aug 13  2015 ssh_config          → SSH 客戶端配置文件
-rw-------. 1 root root   3879 Aug 13  2015 sshd_config         → SSH 服務配置文件
-rw-------. 1 root root    672 May 20 14:22 ssh_host_dsa_key        → DSA 算法私鑰
-rw-r--r--. 1 root root    590 May 20 14:22 ssh_host_dsa_key.pub    → DSA 算法公鑰
-rw-------. 1 root root    963 May 20 14:22 ssh_host_key            → SSH V1 版RSA 算法私鑰
-rw-r--r--. 1 root root    627 May 20 14:22 ssh_host_key.pub        → SSH V1 版 RSA 算法公鑰
-rw-------. 1 root root   1675 May 20 14:22 ssh_host_rsa_key        → SSH V2 版 RSA 算法私鑰
-rw-r--r--. 1 root root    382 May 20 14:22 ssh_host_rsa_key.pub    → SSH V2 版 RSA 算法公鑰

非對稱加密協商

當服務器SSH服務啟動,客戶端也安裝了SSH后该溯,就可以進行連接了岛抄。

    1. 客戶端向服務端發(fā)送連接請求。
      客戶端連接服務器有兩種方式:1. 密碼登錄狈茉。2. 密鑰登錄夫椭。
      客戶端通過SSH工具連接服務端。相關信息通過明文發(fā)送氯庆,發(fā)送的請求包括IP地址和用戶名蹭秋,服務器識別對應的客戶端公鑰(保存在$HOME/.ssh/authorized_keys中),找到該公鑰后堤撵,服務器通過公鑰加密一段隨機字符串仁讨,并使用共享密鑰加密后發(fā)送給客戶端。如果未找到公鑰实昨,則需要輸入密碼洞豁。
    1. 服務端返回公鑰信息
      根據客戶端所使用的服務協議版本及算法設置,返回相應公鑰信息荒给。比如丈挟,默認情況下,客戶端通過 SSH V2 版協議志电,基于 RSA 算法建立連接曙咽,則服務端將 ssh_host_rsa_key.pub 文件中的內容返回客戶端。相關信息通過明文發(fā)送挑辆。
    1. 客戶端對服務端公鑰信息進行比對和確認
      客戶端接收到服務端公鑰信息后例朱,會進行如下比對,并讓用戶對相關信息進行確認之拨。
      • 如果是首次連接服務端茉继,客戶端會收到類似如下信息,讓用戶確認公鑰指紋的有效性:
      The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established.
      RSA key fingerprint is c2:49:d9:43:74:d5:ed:bc:28:9b:d2:7b:63:94:cf:bc.
      Are you sure you want to continue connecting (yes/no)?
      
      • 如果用戶輸入 no 蚀乔,則連接中斷并報錯(Host key verification failed)烁竭。
      • 如果用戶輸入 yes,則會將相應的公鑰信息吉挣,保存到當前用戶家目錄下 .ssh 目錄內的 known_hosts 文件中派撕。 比如:cat ~/.ssh/known_hosts
      # IP 明文顯示:  
      192.168.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3sdlboGEgY9buZpkPuygPw0NxAvmxYd0mc3fo2MgP+JqgFC9/9ZXOgDXKJrjE2HKBieJZSPKGncIh+zLxTvmykeJQBXv7i1GiUjW+H3VY69Ge3AdGfCd+XF+Cvi1e+j18zhHnjSzvIBoNpT5cBWWNbw7mNHCwTb0sHAVUkWR4Ck/LM5/rQ09A+m6BLfZJL8CRNGxKTbyINi6o812S+Cy64WqDs1nTpIXp2Bkcpjclb36bFSs9Z/tWNuJl7A//7HNtxMgFGBnE07Ykvvy8s06DUmkyFy8GcXGBpnfdg9utLodfQLFQnKflCQZ110BpQaCWlWPjU9dc4w3XLJ/XQOP4w==
      
      # IP 加密處理:
      3efXAZ4sNHcUcHamBy4gDriblc8=|8idBhLq9aLl2sfh4KswMsk4sPFI= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwS4DE3hok8RCkxYlTxsexNrNa62e05UGSkoP7ie26DDWjG1Aoc74cCsE4is9p7lEfFUYYlAzeYhPqE/yGf5YxRZUOU2IeFI4cEqo8YZr7edVYpgAq2f2J0zMwk1syenD12lmUPkYA4mMB6it3jxXR5k+H0HZh9YA7mRXkiTjlkAMWirBcnUvtKYRv9LRIr3ikUiPy2gfZO291Ae9zuTsWwEtHQxIpiBgk3vwF2gCUFlX9y//IsMjdQq5prk7x3BjXhUorqgJO1gt1VHW8Xxx9Oe50YF1hi9DuE6VXwyh4xfHTmauRQybwsYafdA3HxrA2od6x9l19D9EH7xHAjDa5w==
      
      • 如果服務端因重裝系統(tǒng)等因素導致公鑰指紋出現變化,則會直接導致連接失敳腔辍(報錯Host key verification failed)终吼,則需要刪除已保存的條目后再重新連接。
      • 如果之前已經成功連接氯哮,而且公鑰指紋對比一致际跪,則會繼續(xù)下一步操作。
    1. 客戶端生成臨時密鑰對
      服務端公鑰校驗及確認后,客戶端會生成一對臨時密鑰用于客戶端加密姆打。該密鑰對不會存儲到文件良姆,而是記錄在內存中。每次連接都會重新生成臨時密鑰對幔戏。
    1. 客戶端發(fā)送公鑰信息
      客戶端向服務端玛追,發(fā)送前述生成的臨時密鑰對中的公鑰信息。相關信息通過明文發(fā)送闲延。

后續(xù)數據交互過程

后續(xù)登錄校驗及正常的數據傳輸痊剖,都會通過雙向加密方式進行。相關交互說明如下:

  • 如果服務端需要發(fā)送數據給客戶端:
    • 服務端使用所持有的客戶端公鑰垒玲,對需要傳輸的數據進行加密陆馁,再發(fā)送給客戶端。
    • 客戶端收到信息后侍匙,使用所持有的自身私鑰解密后獲取數據氮惯。
  • 反之,如果客戶端需要發(fā)送數據給服務端想暗,也是類似的流程:
    • 客戶端使用所持有的服務端公鑰,對需要傳輸的數據進行加密帘不,再發(fā)送給服務端说莫。
    • 服務端收到信息后,使用所持有的自身私鑰解密后獲取數據寞焙。

3. SSH相關文件

從這個連接過程中储狭,可以看出,主要使用到兩個文件夾下的內容:

  • ~/.ssh/
    這里主要是客戶端連接信息和密鑰存儲的敵方捣郊。這個文件夾下的內容可以使用命令ssh-keygen生成辽狈,執(zhí)行這個命令后,會生成兩個文件呛牲,id_rsaid_rsa.pub刮萌。第一個是私鑰文件,第二個是公鑰文件娘扩。但是這都是針對當前登錄用戶的着茸。也就是說,只對當前用戶有效琐旁。
  • /etc/ssh/
    這個主要是ssh配置和服務器密鑰存儲的地方涮阔。由SSH服務啟動時生成。

在連接中的兩個過程:

  • 客戶端存儲服務器的公鑰到本地
    也就是上面的第二步灰殴。服務器返回回來的公鑰是/etc/ssh下的敬特,比如
    服務器下的/etc/ssh

    ssh_host_ecdsa_key.pub

之所以有多組密鑰,是因為使用了不同的加密算法。
客戶端接收到之后伟阔,會存儲在~/.ssh/known_hosts文件里辣之,查看這個文件,可以看到有一行與服務器ssh_host_ecdsa_key.pub內容一致减俏。

客戶端knows_hosts信息

  • 客戶端將公鑰存儲到服務器中
    在請求連接過程中召烂,如果使用密鑰的方式登錄,那么就需要先把客戶端的公鑰存儲到服務器中娃承。
    首先需要通過ssh-keygen生成當前賬戶的私鑰奏夫。然后將公鑰傳送到遠程主機host上面:
    $ ssh-copy-id user@host
    其實,它是將客戶端的~/.ssh/id_rsa.pub文件內容追加到服務器文件~/.ssh/authorized_keys中历筝。

所以酗昼,~/.ssh/authorized_keys里表示本機可以被哪些機器訪問
~/.ssh/known_hosts里表示本機訪問過哪些機器

4. SSH相關配置

SSH配置文件有兩個,一個是ssh_config,一個是sshd_config梳猪。前者是客戶端配置麻削,后者是服務器配置。也就是說春弥,如果本機是作為客戶端呛哟,那么就修改第一個配置,如果本機是作為服務器匿沛,那么就修改第二個配置扫责,

一般來說,和密鑰登錄的配置有關的有以下幾個逃呼,如果密鑰配置好后無法登錄鳖孤,嘗試配置以下三項。

RSAAuthentication yes
PubkeyAuthentication yes # 如果為yes抡笼,則無法使用密碼登錄
AuthorizedKeysFile .ssh/authorized_keys

其他

passwordAuthentication  no  #  只能通過私鑰訪問

4. SSH安全

中間人攻擊

傳統(tǒng)的網絡服務程序苏揣,如FTP、Pop和Telnet在傳輸機制和實現原理上是沒有考慮安全機制的推姻,其本質上都是不安全的平匈。因為它們在網絡上用明文傳送數據、用戶帳號和用戶口令拾碌,別有用心的人通過竊聽等網絡攻擊手段非常容易地就可以截獲這些數據吐葱、用戶帳號和用戶口令。而且校翔,這些網絡服務程序的簡單安全驗證方式也有其弱點弟跑,那就是很容易受到"中間人"(man-in-the-middle)這種攻擊方式的攻擊。

所謂"中間人"的攻擊方式防症,就是"中間人"冒充真正的服務器接收你的傳給服務器的數據孟辑,然后再冒充你把數據傳給真正的服務器哎甲。服務器和你之間的數據傳送被"中間人"一轉手做了手腳之后,就會出現很嚴重的問題饲嗽。中間人能夠攻擊炭玫,主要原因在于他能認識截取的信息,也能發(fā)出讓接受者認識的信息貌虾。

使用SSH吞加,你可以把所有傳輸的數據進行加密,這樣"中間人"這種攻擊方式就不可能實現了尽狠,而且也能夠防止DNS欺騙和IP欺騙衔憨。使用SSH熔脂,還有一個額外的好處就是傳輸的數據是經過壓縮的正驻,所以可以加快傳輸的速度车份。SSH有很多功能占遥,它既可以代替Telnet,又可以為FTP腿宰、Pop稠肘、甚至為PPP提供一個安全的"通道"常潮。

最初的SSH是由芬蘭的一家公司開發(fā)的斥黑。但是因為受版權和加密算法的限制揖盘,現在很多人都轉而使用OpenSSH。OpenSSH是SSH的替代軟件包锌奴,而且是免費的扣讼,可以預計將來會有越來越多的人使用它而不是SSH。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末缨叫,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子荔燎,更是在濱河造成了極大的恐慌耻姥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件有咨,死亡現場離奇詭異琐簇,居然都是意外死亡,警方通過查閱死者的電腦和手機座享,發(fā)現死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門婉商,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渣叛,你說我怎么就攤上這事丈秩。” “怎么了淳衙?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵蘑秽,是天一觀的道長饺著。 經常有香客問我,道長肠牲,這世上最難降的妖魔是什么幼衰? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮缀雳,結果婚禮上渡嚣,老公的妹妹穿的比我還像新娘。我一直安慰自己肥印,他們只是感情好识椰,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竖独,像睡著了一般裤唠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莹痢,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天种蘸,我揣著相機與錄音,去河邊找鬼竞膳。 笑死航瞭,一個胖子當著我的面吹牛,可吹牛的內容都是我干的坦辟。 我是一名探鬼主播刊侯,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锉走!你這毒婦竟也來了滨彻?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挪蹭,失蹤者是張志新(化名)和其女友劉穎亭饵,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體梁厉,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡辜羊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了词顾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片八秃。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肉盹,靈堂內的尸體忽然破棺而出昔驱,到底是詐尸還是另有隱情,我是刑警寧澤垮媒,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布舍悯,位于F島的核電站航棱,受9級特大地震影響,放射性物質發(fā)生泄漏萌衬。R本人自食惡果不足惜饮醇,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秕豫。 院中可真熱鬧朴艰,春花似錦、人聲如沸混移。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歌径。三九已至毁嗦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間回铛,已是汗流浹背狗准。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茵肃,地道東北人腔长。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像验残,于是被迫代替她去往敵國和親捞附。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容