# [學習筆記] SSH 配置主機文件的格式 ## :question: SSH是什麼呢? :::success * SSH 為 Secure Shell 的縮寫,當我們想要進入遠端伺服器,通常會下 ssh username@remote_host,連接成功就可以直接讓遠端伺服器執行我們在本機上下的指令。 * 安全是 SSH 的賣點,它讓我們在與遠端電腦(遠端伺服器)連線時,能夠先將訊息加密過後再傳送,並且確保只有「被認可的人」才能夠解密訊息。因此,就算是在一個不安全的網絡裡面,SSH 都能夠確保連線不被竊聽。 ::: <br> ## :key: SSH 的 Client-Server Model 1. SSH 使用 *client-server 模型*,也就是說要建立一個 SSH 連線,遠端的機器必須跑一個 SSH daemon,而本地機器則要有一個 SSH client 程序。 2. SSH daemon 會預設聽從 TCP port 22 進來的連線,並在認證後提供相對應的環境給使用者。SSH client 則負責使用 SSH protocol 來傳送認證訊息與連線細節給遠端機器。 3. SSH 最常見的使用情況就是開頭提到的遠端連線,不過它同時也支援 tunneling 或是也可以使用 SFTP (SSH File Transfer) 或 SCP (Secure Copy) 來進行檔案傳輸。 4. 許多作業系統,包含 macOS, Linux, OpenBSD, FreeBSD 都支援 SSH。 (你是不是也看不懂,沒關係,我們至少看得懂第四點) <br> ## :mag_right: SSH 與 Public Key Crytography (PK crypto) SSH 使用 public-key cryptography 來為資料流加密。 在一個 public-key 結構中,每一個使用者都有兩把鑰匙:公鑰(public key)與私鑰(secret key)。 * **私鑰**拿來做電子簽名與解密(任何你收到的加密文件)。 * **公鑰**用來讓別人確認你的簽名的正確性(證明人家收到的,有你的簽名的東西真的是你傳的),還有讓別人將東西加密成只有你自己能(使用私鑰)解密的檔案。 假設今天小明想要使用 SSH 傳一個訊息給小美,他們已經互相擁有對方的公鑰了,並且擁有各自的私鑰,此時會有五個步驟: 1. 小明用自己的私鑰將訊息簽名。 2. 小明用小美的公鑰將訊息加密。(此時,被加密的訊息連小明也無法還原—只有小美的私鑰可以!) 3. 小明將訊息傳給小美。 4. 小美將訊息用自己的私鑰解密。 5. 小美用小明的公鑰來確認這個訊息是用小明的私鑰簽名的。 <br> :::danger :hand: 如何驗證未知的公鑰。 上面的例子聽起來萬無一失,但是假設今天小明與小美還沒有交換公鑰,他們就必須要先連線傳送公鑰給對方。如果壞人小王在小明要把公鑰傳給小美時調包,換成小王自己的公鑰,這時與小美建立「安全連線」的人,就會是小王而不是小明了 😱 SSH 能夠提供的保護只在確保公鑰的擁有者同時擁有相對應的私鑰,但是不能保證擁有這個公私鑰組合的人是不是壞人。 這就是著名的「在中間的人攻擊」(man-in-the-middle-attack)。這個弱點可以用認證系統(authentication),像是 PKI (Public Key Infrastructure) 來抵擋。 文章來源:https://codecharms.me/posts/security-ssh (更詳細看這裡) ::: <br> ## :hammer_and_pick: SSH vs SSL SSH 與 SSL 名字實在是太像了,而且做的事情也挺像,都是為了確保兩端連線安全而產生,但他們其實還是不一樣的概念,這邊就來稍微介紹一下 SSL。 先澄清一下,SSL (Secure Sockets Layer),實際上已經被 TLS (Transport Layer Security) 取代了(TLS 1.0 有時也被視為 SSL 3.1)。 維基百科上甚至已經直接將兩者合併在 TLS 的條目下了。為何 SSL 不再繼續被使用了呢?因為它是很早就出現的一套網路連線防護機制,在駭客們努力不懈的堅持之下,SSL 已經差不多被破解完了,所以基本上非常透氣,防禦力趨近於零。 不過慣性使然,許多人仍然使用 SSL 來稱呼這套機制。 SSL/TLS 其實大家都不陌生,HTTPS (HyperText Transfer Protocol Secure) (還有在網址前面那個 🔒 的圖案)是建立網站與訪客之間的安全連線的協定,取代了 HTTP 的不安全連線。 :::success :heavy_exclamation_mark: 順帶一提,如果你還沒,請養成好習慣在進入任何網站時先**確保網址的開頭是 https 而不是 http**。 SSL/TLS 是 HTTPS 的幕後功臣。它們讓瀏覽器(客戶端)連上網站(伺服器端)的時候,先進行一個握手的儀式,並且使用 CA (Certificate Authority) 來進行身分確認。 有 CA 的參與也是 SSL/TLS 與 SSH 最大的差異。另外一個差異是 SSL/TLS 是被使用在資料傳輸,而 SSH 是用來執行指令(通常就是用來登入遠端電腦)。 說到 TLS,TLS 1.3 即將出世了。目前看到除了安全性升級之外,也將原本 asymmetric encryption 常常被詬病的低效率問題開刀,將客戶端與與伺服器端建立安全連線之前的身份確認程序簡化到一個來回(握一次手就好了),大大提升速度。 ::: <br> ### :small_blue_diamond: 1. 進入 .ssh 並清單 ![](https://hackmd.io/_uploads/r1si9E78n.png) <br> ### :small_blue_diamond: 2. chmod 777 打開所有權限 ![](https://hackmd.io/_uploads/Hkl_ZjNQ8n.png) <br> ### :small_blue_diamond: 3. 編輯 config 檔案 :::info **切換模式:** * 按下 esc:進普通模式,可以刪除、複製、貼上,但不能輸入文字 * 按下 i :進輸入模式,可以輸入文字 <br> **跳出編輯器:(先切換到普通模式)** * 結束: 「 :q 」 * 存檔後結束: 「 :wq 」 ::: 1. vi config 後,按 i 開始編輯 2. 編輯結束按 esc 後, shift + 「 : 」 3. 打上wq! <br> ### :small_blue_diamond: 4. 查看 .ssh/config 內文更改 ![](https://hackmd.io/_uploads/HkBLhEm83.png) ###### 網址來源: `「w 」為編輯,「q 」為離開,「!」為強制` ###### 網址來源: `https://yakimhsu.com/project/project_w1_CommandLine.html`