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