保護 SSH 的三個技巧
SSH(安全 Shell)是一個協(xié)議,它使你能夠創(chuàng)建一個經(jīng)過驗證的私人連接,并使用加密密鑰保護通道,在另一臺機器上啟動一個遠程 Shell。使用這種連接,你可以執(zhí)行遠程命令,啟動安全文件傳輸,轉(zhuǎn)發(fā)套接字、顯示和服務(wù),等等。
在 SSH 出現(xiàn)之前,大多數(shù)遠程管理是通過 telnet 完成的,公平地說,一旦你能建立一個遠程會話,你幾乎可以做任何你需要的事情。這個協(xié)議的問題是,通訊是以純明文的方式進行的,沒有經(jīng)過加密。使用 流量嗅探器 不需要太多努力就可以看到一個會話中的所有數(shù)據(jù)包,包括那些包含用戶名和密碼的數(shù)據(jù)包。
有了 SSH,由于使用了非對稱密鑰,參與通信的設(shè)備之間的會話是加密的。如今,這比以往任何時候都更有意義,因為所有的云服務(wù)器都是由分布在世界各地的人管理的。
三個配置 SSH 的技巧
SSH 協(xié)議最常見的實現(xiàn)是 OpenSSH,它由 OpenBSD 項目開發(fā),可用于大多數(shù) Linux 和類 Unix 操作系統(tǒng)。一旦你安裝了這個軟件包,你就會有一個名為 sshd_config 的文件來控制該服務(wù)的大部分行為。其默認設(shè)置通常是非常保守的,但我傾向于做一些調(diào)整,以優(yōu)化我的 SSH 體驗,并保護我的服務(wù)器不被非法訪問。
1. 改變默認端口
這是一個并非所有管理員都記得的問題。任何有端口掃描器的人都可以發(fā)現(xiàn)一個 SSH 端口,即使你之后把它移到別的端口,所以你很難把自己從危險中移除,但這樣卻會有效的避免了數(shù)百個針對你的服務(wù)器掃描的不成熟腳本。這是一個可以讓你省心,從你的日志中減去大量的噪音的操作。
在寫這篇文章時,我在一個云服務(wù)提供商上設(shè)置了一個 SSH 服務(wù)器,默認端口 TCP 22,每分鐘平均被攻擊次數(shù)為 24 次。在將端口改為一個更高的數(shù)字,即 TCP 45678 后,平均每天有兩個連接并用各種用戶名或密碼進行猜測。
要改變 SSH 的默認端口,在你喜歡的文本編輯器中打開 /etc/ssh/sshd_config,將 Port 的值從 22 改為大于 1024 的某個數(shù)字。這一行可能被注釋了,因為 22 是默認的(所以不需要在配置中明確聲明),所以在保存之前取消注釋。
Port 22122
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
一旦你改變了端口并保存了文件,重新啟動 SSH 服務(wù)器:
$ sudo systemctl restart sshd
2. 不要使用密碼
現(xiàn)在有一個普遍的潮流是停止使用密碼作為認證手段,雙因素認證等方法越來越受歡迎。OpenSSH 可以使用非對稱密鑰進行認證,因此不需要記住復(fù)雜的密碼,更不需要每隔幾個月輪換一次密碼,也不需要擔(dān)心有人在你建立遠程會話時進行“肩后偷窺”。使用 SSH 密鑰可以讓你快速、安全地登錄到你的遠程設(shè)備上。這往往意味著花費在錯誤的用戶名和密碼上的時間更少。登錄令人愉快的簡單。當沒有密鑰時,就沒有入口,甚至沒有提示符。
要使用這個功能,你必須同時配置客戶機(在你面前的計算機)和服務(wù)器(遠程機器)。
在客戶端機器上,你必須生成一個 SSH 密鑰對。這包括一個公鑰和一個私鑰。正如它們的名字所暗示的,一個公開的密鑰是供你分發(fā)給你想登錄的服務(wù)器的,另一個是私人的密鑰,必須不與任何人分享。使用 ssh-keygen 命令可以創(chuàng)建一個新的密鑰對,并使用 -t 選項來指定一個好的、最新的密碼學(xué)庫,如 ed25519:
$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519):
在密鑰創(chuàng)建過程中,你會被提示為文件命名。你可以按回車鍵來接受默認值。如果你將來創(chuàng)建了更多的密鑰,你可以給每個密鑰起一個自定義的名字,但有多個密鑰意味著你要為每次交互指定使用哪個密鑰,所以現(xiàn)在只要接受默認即可。
你還可以給你的密鑰一個口令。這可以確保即使別人設(shè)法獲得你的私鑰(這本身就不應(yīng)該發(fā)生),沒有你的口令,他們也無法將其投入使用。這對某些密鑰來說是一種有用的保護措施,而對其他密鑰來說則不合適(特別是那些用于腳本的密鑰)。按回車鍵讓你的密鑰沒有口令,或者你選擇創(chuàng)建一個口令。
要把你的密鑰復(fù)制到服務(wù)器上,使用 ssh-copy-id 命令。例如,如果我擁有一臺名為 example.com 的服務(wù)器,那么我可以用這個命令把我的公鑰復(fù)制到它上面:
$ ssh-copy-id jgarrido@example.com
這將在服務(wù)器的 .ssh 目錄下創(chuàng)建或修改 authorized_keys 文件,其中包含你的公鑰。
一旦確認 ssh-copy-id 命令完成了它所做的事情,嘗試從你的電腦上登錄,以驗證你可以在沒有密碼的情況下登錄(或者如果你選擇使用你的密鑰的口令,就輸入密鑰口令)。
在沒有使用你的服務(wù)器帳戶的密碼登錄到你的服務(wù)器上后,編輯服務(wù)器的 sshd_config 并將 PasswordAuthentication 設(shè)置為 no。
PasswordAuthentication no
重新啟動 SSH 服務(wù)以加載新的配置:
$ sudo systemctl restart sshd
3. 決定誰可以登錄
大多數(shù)發(fā)行版不允許 root 用戶通過 SSH 登錄,這確保只有非特權(quán)賬戶是活躍的,根據(jù)需要使用 sudo 命令來提升權(quán)限。這就防止了一個明顯的、令人痛苦的目標(root)受到簡單而常見的腳本攻擊。
同樣,OpenSSH 的一個簡單而強大的功能是能夠決定哪些用戶可以登錄到一臺機器。要設(shè)置哪些用戶被授予 SSH 訪問權(quán),在你最喜歡的文本編輯器中打開 sshd_config 文件,并添加這樣一行:
AllowUsers jgarrido jane tux
重新啟動 SSH 服務(wù)以加載新的配置選項。
這只允許三個用戶(jgarrido、jane 和 tux)登錄或在遠程機器上執(zhí)行任何操作。
總結(jié)
你可以使用 OpenSSH 來實現(xiàn)一個強大而穩(wěn)健的 SSH 服務(wù)器。這些只是加固你的系統(tǒng)的三個有用的選項。盡管如此,在 sshd_config 文件中仍有大量的功能和選項可以打開或關(guān)閉,而且有許多很棒的應(yīng)用程序,如 Fail2ban,你可以用來進一步保護你的 SSH 服務(wù)。