SSH(Secure Shell)預設需使用SSH伺服器端的帳號密碼來登入該台伺服器,只不過若每次都需要重新輸入帳號密碼,實在是一件很麻煩的事情。除了帳號密碼的權限驗證方式外,SSH另外提供了金鑰的權限驗證方式,讓SSH伺服器端能夠使用信任的客戶端自行產生獨特的金鑰號碼,來登入SSH伺服器,這樣一來SSH伺服器端就不需要提供給客戶端任何的帳號密碼了。



將SSH金鑰加入SSH伺服器

首先,SSH客戶端必須要擁有獨特的SSH金鑰,Linux系統產生SSH金鑰的方法可以參考這篇文章的作法。客戶端有了SSH的金鑰後,便可將SSH的公開金鑰(.pub檔案)交給SSH伺服器來儲存使用。

如何將SSH的公開金鑰交給SSH伺服器?

將SSH的公開金鑰交給SSH伺服器最簡單的作法就是使用ssh-copy-id指令,直接將公鑰複製給連線的SSH伺服器。指令用法和ssh指令差不多,如下:

ssh-copy-id username@hostname

username是遠端裝置的登入帳號,hostname是遠端裝置的網路位址(網址或是IP)。

例如:

ssh-copy-id magiclen@192.168.56.103

接著再輸入遠端裝置的帳號登入密碼,完成登入後,便可以將公鑰傳送給遠端的SSH伺服器來儲存。

之後再使用ssh指令登入該裝置的帳號的話,就不必再帳號登入輸入密碼了!

ssh-pub-key

SSH客戶端的公鑰預設會存在SSH伺服器端該帳號底下家目錄中的.ssh目錄裡的authorized_keys檔案,使用純文字格式來儲存,每一行文字就是代表著一組SSH客戶端的公鑰。也就是說,就算SSH客戶端不使用ssh-copy-id指令先使用帳號密碼登入SSH伺服器提供公鑰,SSH伺服器端也可以直接修改這個檔案,手動將SSH客戶端的公鑰添加進去,這樣一來SSH伺服器端就完全不用提供任何帳號的密碼給SSH客戶端登入了,安全性也會相對提升!

停用SSH伺服器的帳號密碼驗證

用了金鑰驗證後,就可以把SSH的帳號密碼驗證給關閉掉,使其只允許金鑰驗證,避免暴力破解密碼的攻擊。

要開啟或是關閉SSH伺服器的帳號密碼驗證,可以修改/etc/ssh/sshd_config檔案,將PasswordAuthentication改為no(如果要開關金鑰驗證,要修改PubkeyAuthentication)。

ssh-pub-key

修改完成後,再使用以下指令重啟SSH,就可以套用設定了。

sudo systemctl restart ssh