每天似乎都有一個安全漏洞的新聞報道,說我們的資料會因此而存在風險。儘管 SSH 是一種遠端連線系統的安全方式,但你仍然可以使它更安全。本文將向你展示如何做到這一點。
此時雙因子驗證(2FA)就有用武之地了。即使你禁用密碼並只允許使用公鑰和私鑰進行 SSH 連線,但如果未經授權的使用者偷竊了你的金鑰,他仍然可以藉此存取系統。
使用雙因子驗證,你不能僅僅使用 SSH 金鑰連線到伺服器,你還需要提供手機上的驗證器應用程式隨機生成的數位。
本文展示的方法是基於時間的一次性密碼(TOTP)演算法。Google Authenticator 用作伺服器應用程式。預設情況下,Google Authenticator 在 Fedora 中是可用的。
至於手機,你可以使用與 TOTP 相容的任何可以雙路驗證的應用程式。Andorid 或 iOS 有許多可以與 TOTP 和 Google Authenticator 配合使用的免費應用程式。本文與 FreeOTP 為例。
首先,在你的伺服器上安裝 Google Authenticator。 $ sudo dnf install -y google-authenticator
執行應用程式:
$ google-authenticator
該應用程式提供了一系列問題。下面的片段展示了如何進行合理的安全設定:
Do you want authentication tokens to be time-based (y/n) yDo you want me to update your "/home/user/.google_authenticator" file (y/n)? y
這個應用程式為你提供一個金鑰、驗證碼和恢復碼。把它們放在安全的地方。如果你丟失了手機,恢復碼是存取伺服器的唯一方式。
在你的手機上安裝驗證器應用程式(FreeOTP)。如果你有一台安卓手機,那麼你可以在 Google Play 中找到它,也可以在蘋果 iPhone 的 iTunes 商店中找到它。
Google Authenticator 會在螢幕上顯示一個二維條碼。開啟手機上的 FreeOTP 應用程式,選擇新增新賬戶,在應用程式頂部選擇二維條碼形狀工具,然後掃描二維條碼即可。設定完成後,在每次遠端連線伺服器時,你必須提供驗證器應用程式生成的亂數。
應用程式會向你詢問更多的問題。下面範例展示了如何設定合理的安全設定。
Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) yBy default, tokens are good for 30 seconds. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens).Do you want to do so? (y/n) nIf the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s.Do you want to enable rate-limiting (y/n) y
現在,你必須設定 SSH 來利用新的雙路驗證。
在完成此步驟之前,確保你已使用公鑰建立了一個可用的 SSH 連線,因為我們將禁用密碼連線。如果出現問題或錯誤,一個已經建立的連線將允許你修復問題。
在你的伺服器上,使用 sudo 編輯 /etc/pam.d/sshd
檔案。
$ sudo vi /etc/pam.d/ssh
注釋掉 auth substack password-auth
這一行:
#auth substack password-auth
將以下行新增到檔案底部:
auth sufficient pam_google_authenticator.so
儲存並關閉檔案。然後編輯 /etc/ssh/sshd_config
檔案:
$ sudo vi /etc/ssh/sshd_config
找到 ChallengeResponseAuthentication
這一行並將其更改為 yes
:
ChallengeResponseAuthentication yes
找到 PasswordAuthentication
這一行並將其更改為 no
:
PasswordAuthentication no
將以下行新增到檔案底部:
AuthenticationMethods publickey,password publickey,keyboard-interactive
儲存並關閉檔案,然後重新啟動 SSH:
$ sudo systemctl restart sshd
當你嘗試連線到伺服器時,系統會提示你輸入驗證碼:
[user@client ~]$ ssh [email protected] code:
驗證碼由你手機上的驗證器應用程式隨機生成。由於這個數位每隔幾秒就會發生變化,因此你需要在它變化之前輸入它。
如果你不輸入驗證碼,你將無法存取系統,你會收到一個許可權被拒絕的錯誤:
[user@client ~]$ ssh [email protected] code:Verification code:Verification code:Permission denied (keyboard-interactive).[user@client ~]$
通過新增這種簡單的雙路驗證,現在未經授權的使用者存取你的伺服器將變得更加困難。