什麼是SSH連線
SSH(Secure Shell)是一個常見的網絡協定,主要用於兩個主機之間的溝通、資料交換、控制等,SSH連線提供了Client和Server之間一個安全的通道,本篇文章會示範如何用SSH免密碼登入到遠端主機
SSH 連線的運作原理
最基礎的 SSH 指令如下
ssh {username}@{host}
其中 host 可以是IP(e.g. 244,255,1,25)或是網域名稱(e.g. urbandfish.com)
為了要了解SSH的運作原理,首先我們必須要先認識何謂
1. 非對稱式加密 Asymmetrical Encryption
2. 對稱式加密 Symmetrial Encryption
非對稱式加密 Asymmetrial Encryption
非對稱式加密由一對公鑰(public key)和私鑰(private key)組成,一方用私鑰來加密(encrypt)訊息並傳送,而另一端用公鑰來解密(decrypt),通常private key不應該公開而public key可公開,被private key加密過的內容是無法用相同的private key來解密的。
常見的非對稱式加密演算法如下
1. RSA
2. ECC
3. DSS
4. ECDSA
對稱式加密 Symmetrial Encryption
對稱式加密指的是兩個端點之間可以使用同一個key來加密和解密傳遞的訊息,所以只要任何人擁有這份密鑰(secret key),他們就可以使用相同的密鑰來加密和解密訊息,在過程中,Client和Server之間會使用經過同意的算法來產生共享密鑰(Share Key)。
常見的對稱式加密演算法有以下幾種
1. AES
2. DES
3. Blowfish
4. 3DES
5. CAST128
6. Arcfour
在驗證前Client會知道有哪些演算法是Server支援的。
SSH是如何透過這些技術來建立安全連線的呢?
通常當兩台主機要建立連線時,他會經歷以下步驟
1. 建立連線
首先,Client會透過TCP(Transmission control protocol, port 22)的handshake來建立一組非對稱式(Asymmetric)加密的Key,通常會把secure pairs放在Client端的~/.ssh/id_rsa
和 ~/.ssh/id_rsa.pub
路徑,接著會連同產生的Public Key向Server寄送連線請求,Server收到請求後會將Client傳送過來的Public Key儲存於 ~/.ssh/authorized_keys
,authorized_keys
主要是方便Server得知哪些Public Key是允許啟動驗證程序的,接著Server確認是否支援Client提供的加密protocol算法,如果支援,那稍後Client就可以根據相應的算法來產生對稱式密鑰並建立安全連線。
2. 驗證資料可正確送達並被解讀
在兩個端點正式交換訊息之前,他們會透過Protocol Diffie-Hellman密鑰交換算法(Asymmetric算法)來建立安全通道,Diffie-hellman密鑰交換算法可以讓兩個沒有共享密鑰的端點之間共享資訊,過程中沒有任何一方能夠在過程中控制密鑰,雙方各自生成公鑰和私鑰,並交換彼此的公鑰,利用非對稱式加密的方式生成一份用於加密的共享密鑰(Symmetric),可保證只有雙方才能獲取這份共享密鑰,有了安全通道和共享密鑰,現在Client和Server已經可以彼此互相傳送訊息並使用共享密鑰來做加密和解密了
3. 權限驗證
總共有數種方法可以讓Server驗證Client,分別是
1. Client登入輸入密碼
2. 使用Client產生的公鑰進行驗證
3. OTP驗證 -> 可參考此文章
輸入密碼仍然會有被暴力破解的風險,所以下面我們會教學如何使用第二種方式來驗證。
如何使用SSH免密碼登入遠端主機?
第一步:建立Key pairs
ssh-keygen -t rsa
這個指令會詢問你Key的命名,預設是 id_rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/harryuwang/.ssh/id_rsa): test_rsa
Enter new passphrase (empty for no passphrase):
Enter new passphrase (empty for no passphrase):
是問你要不要設定密碼,通常我們直接按Enter
略過就可
輸入好之後你就可以在你當前的路徑找到 test_rsa
和test_rsa.pub
,其中test_rsa
是private key,test_rsa.pub
是public key
第二步:將public key的內容貼到遠端主機的~/.ssh/authorized_keys
中
1. 你可以把它上傳到共享資料夾在下載到遠端主機上
2. 你可以使用ssh-copy-id來將檔案複製過去,但前提是你要有使用者密碼
ssh-copy-id -i ./test_rsa.pub username@host
-i
: 指定打算傳哪一個私鑰
第三步:使用private key來登入遠端主機
ssh -i test_rsa username@host
這樣就可以順利ssh免用密碼登入遠端主機囉🤣
假如你不想要每次都規定要使用哪一個私鑰的話你可以把資訊加進路徑 ~/.ssh/config
Host Yourhost
HostName {hostname_ip}
User {username}
IdentitiesOnly yes
PreferredAuthentications publickey
IdentityFile ~/.ssh/{your_private_key}
存擋之後你就可以直接透過以下方式直接無密碼登入!
ssh username@host
參考連結
Understanding the SSH Encryption and Connection Process
What is asymmetric cryptography