security

網路安全(3) - SSH

今天來講個所有CS的都必須要會的協議 ssh 就是計算機跟計算機溝通的一種安全協議

看完這趴你就會知道第一趴的密碼學投資報酬率極高 正所謂 一樣米養百樣人 一個密碼學就足以撐起眾多網路協議

SSH基本用法

不能再更簡單了

>ssh username@hostname

如果你現在的username跟你要登錄的username一樣 可以省略

>ssh hostname

ssh的default port是22

指令下完之後 你會看到返回下面的東西

Alt text

第二行後面那一串 就是你ssh過去的那個主機的公鑰的hash(因為公鑰 太長了 所以提供公鑰的hash讓你比對) 這個意思就是說 誒你連過去的這個人 我認為他是github 那他的公鑰是不是長這樣 因為這個不像https有個第三方公正的機關可以去問 所以你要自己確認後 再輸入yes 不要每次看都不看就直接yes 可能的後果請看趴萬的中間人攻擊

github的公鑰hash就在這GitHub’s SSH key fingerprints 以後第一次ssh的時候請認真一點 確認之後再yes

只要你yes之後 這個hostname的公鑰就會存在你電腦裡的known_host 之後你再ssh他就不會再問你了

輸入使用者密碼 你(client)會再產生一個隨機字串 把這兩個東西用他的公鑰加密 丟給host

到他那邊後他用他的私鑰解密 確認密碼是你之後 再用私鑰解密你剛剛那個隨機字串 這個字串就用來當作對稱加密的鑰匙 然後可以開始說悄悄話

所以ssh非常安全 有沒有開始覺得這種安全協議都是大同小異

SSH其他好處

既然我已經有紀錄可信任的hostname 下次我連線的時候我就去看這個傢伙是不是我信任的名單內 我對hostname的信任搞定

但另外一個方向 要怎麼讓這個host知道你真的是你呢 你還是得每次都輸入密碼 好麻煩唷怎麼辦

我們就往另一個方向做一樣的事 你在你電腦上生一個私鑰公鑰組合 把你的公鑰存在那個主機上 這樣以後你ssh他之後 他生一個隨機字串R給你 你就用你私鑰加密後給他 他用你公鑰解密看看是不是R 是的話就允許通行 所以之後不再需要輸入密碼

融會貫通時間

這個通了之後 很多以前工作上遇到的小問題也都知其然也知其所以然了

比如說某些git repo在push或fetch的時候要輸入密碼 某些不用 以前一直沒去想為什麼 現在就知道當初clone的時候用的是ssh的話以後就不用輸入密碼了

第二個是最近的case 當我開發的時候想用兩台不同電腦 我需不需要在遠端主機(ex. github)放兩組不同公鑰呢 通透了之後就知道其實是不用 server只認私鑰不認MAC address如果你兩台電腦間的傳輸是保證安全的話 你甚至可以直接scp你的私鑰給另一台電腦 遠端主機只放一組公鑰即可

搞定 相信以後遇到設定ssh的東西都能神擋殺神佛擋殺佛