歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐干貨哦~
介紹
對於SSH服務的常見的攻擊就是暴力破解攻擊——遠程攻擊者通過不同的密碼來無限次地進行登錄嘗試。當然SSH可以設置使用非密碼驗證驗證方式來對抗這種攻擊,例如公鑰驗證或者雙重驗證。將不同的驗證方法的優劣處先放在一邊,如果我們必須使用密碼驗證方式怎么辦?你是如何保護你的 SSH 服務器免遭暴力破解攻擊的呢?
幸運的是,有一種工具可以緩解這種攻擊這個工具是fail2ban。這可以配置為允許使用SSH進行合法登錄,但在經過一定次數后無法正確驗證后攻擊將禁用IP地址。我們將在Debian上安裝和配置該軟件。沒有服務器的同學可以在這里購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝后在購買服務器。
第一步 - 安裝fail2ban
Debian在其默認存儲庫中包含fail2ban。我們可以使用以下命令下載並安裝它:
sudo apt-get update
sudo apt-get install fail2ban
這不僅會安裝fail2ban,還會自動設置啟動服務。
第二步 - 配置fail2ban
fail2ban配置保存在/etc/fail2ban
目錄中。默認禁止規則的配置文件稱為jail.conf
。
由於fail2ban在程序有新版本時更新其配置文件的方式,因此我們不應編輯默認配置文件。
相反,我們應該將其復制到新位置進行編輯:
cd /etc/fail2ban
sudo cp jail.conf jail.local
sudo nano jail.local
在這里,我們可以更改默認配置中設置。
默認配置
開始的部分[DEFAULT]
是配置默認值,可以在配置中稍后的更具體的上下文中覆蓋這些默認值。已經給出的大多數設置都是默認選項的選擇。
禁止默認值
我們可以通過修改一些參數來配置fail2ban實現禁止的方式。以下是一些更重要的內容:
-
ignoreip:此參數采用應從fail2ban規則中排除的IP地址列表。此處列出的IP地址或塊不會受到限制,因此請而具體地選擇它們。
-
IP地址和范圍由空格分隔。
-
您應該將您的家庭或工作IP地址添加到列表的末尾,以便在登錄時遇到問題不會被阻止。
-
這看起來像:“ignoreip = 127.0.0.1/8
YOUR_IP_ADDRESS
”
-
-
bantime:這列出了如果客戶端無法正確驗證禁令將持續的時間。
- 客戶端默認值為10分鍾。
-
maxretry:此參數指定禁止實施前允許的嘗試次數。
定義禁令操作
當需要禁令時,fail2ban可以以不同的方式進行。它通過查看以下參數來決定必要的操作:
-
banaction:此設置指定在需要禁令時將使用的配置文件。
-
此參數的值指的是
/etc/fail2ban/action.d
目錄中的文件,該文件將處理實際的禁止過程。 -
默認值使用
iptables
在身份驗證失敗時禁止所有端口上的IP。我們稍后會討論具體的禁止規則。
-
-
action:此參數指定其上方列出的操作快捷方式之一。它基本上調用一個
banaction
腳本(如上所述),然后為變量分配適當的信息並將它們傳遞給腳本。- 默認操作是
action_
調用腳本並將名稱,端口,協議和鏈傳遞給腳本。它不會像其他一些操作那樣發送電子郵件地址或日志行。
- 默認操作是
配置電子郵件警報
如果您希望將fail2ban配置為在禁止IP后通過電子郵件發送給您,您也可以在默認部分配置它。
如果已在計算機上配置了郵件服務器,則可以配置fail2ban以將電子郵件發送到外部郵件。
有兩個相關參數:
-
destemail:此選項設置在禁止的情況下將通知的電子郵件地址。
-
默認值
root@localhost
將郵件傳遞到當前計算機的root帳戶。 -
如果您配置了郵件服務器,請將其更改為外部郵件地址。
-
-
mta:這指定將用於傳遞郵件的郵件代理。
-
如果您的郵件服務器配置了sendmail,請保留默認選項(sendmail)。
-
如果您沒有配置郵件服務器,但希望將本地郵件傳遞到用戶帳戶,則可以將“sendmail”更改為“mail”。
-
如果您希望配置電子郵件,則必須如上所述編輯action
參數。將操作更改為“actionmw”或“actionmwl”,以將電子郵件信息傳遞給禁止腳本。
如果您已配置本地郵件傳遞,則可以通過輸入以下內容來檢查郵件:
sudo nano /var/mail/mail
配置特定於應用程序的Jails
在文件的下方,你應該看到標記為這樣的部分:
[application_name]
您應該能夠破譯大多數參數。
filter
參數指定/etc/fail2ban/filter.d
目錄中的文件。這告訴fail2ban如何解析程序的日志文件以查看失敗的身份驗證。
如果fail2ban解析失敗。logpath
變量保存服務日志文件的路徑,
您可以在此處覆蓋任何其他默認參數。例如,對於SSH,maxretry
選項與Debian安裝中的dault選項不同。
第三步 - 配置iptables
我們實際上不會對iptables進行太多配置,但我們將查看實現其行為的配置文件。這將有助於我們了解fail2ban如何實施其禁止政策。
在banaction參數下打開我們的jail配置中指定的文件:
sudo nano /etc/fail2ban/action.d/iptables-multiport.conf
在這里,我們可以看到當fail2ban調用禁止IP時實際發生了什么。它使用iptables防火牆軟件來實現規則。
當fail2ban開始時,它會調用以下行:
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN # questionable usefulness
iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
這會初始化環境以通過過濾鏈傳遞流量。iptables軟件基於“漏斗”或“鏈”控制流量。這些渠道中的每一個都對所有流量應用規則,以確定它是否可接受。
第一行iptables -N fail2ban-<name>
創建一個名為“fail2ban-”的新鏈,其中包含以下服務的名稱。這將保留禁止某些IP地址的規則。
下一行,iptables -A fail2ban-<name> -j RETURN
為我們剛剛創建的鏈添加一條規則,告訴iptables將控制權返回給調用此鏈的鏈。
最后一行,iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
將規則添加到INPUT鏈,該鏈立即將控制傳遞給我們的新fail2ban鏈。
因此,當前的流程是輸入流量由我們的INPUT鏈處理。此時,它會將規則傳遞控制權發送到fail2ban鏈。該鏈中的第一個規則將控制權傳遞回稱為INPUT鏈的鏈。
所以,在這一點上,控制只是來回傳遞,實際上沒有發生任何事情。但是,我們已經設置了一個控制流程,可以容納其他規則。當我們需要禁止IP地址時,我們可以向fail2ban鏈添加另一個規則,將其傳遞回INPUT鏈。
我們可以看到用於拆除fail2ban規則的補充操作,當服務停止時,這里:
actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
iptables -F fail2ban-<name>
iptables -X fail2ban-<name>
這基本上只是顛倒了我們剛建立的所有規則。
禁用客戶端時,將實施此規則:
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
這告訴iptables丟棄來自該IP地址的任何數據包,這有效地禁止他們甚至再次嘗試進行身份驗證。
當bantime過去后,這條規則改變了禁令:
actionunban = iptables -D fail2ban-<name> -s <ip> -j DROP
如果您想查看實施了哪些規則以及當前禁止的IP地址,可以通過輸入以下內容來檢查當前的iptables規則:
sudo iptables -L
如果任何客戶被禁止,他們將處於底層鏈。
第四步 - 重啟fail2ban
對配置進行任何更改后,需要重新啟動fail2ban以實施新規則。您可以通過輸入以下命令來執行此操作:
sudo service fail2ban restart
要測試新規則,您可以創建另一個VPS實例,並在該計算機上有足夠的時間錯誤地進行身份驗證,以觸發禁止規則。之后,您的SSH不會返回任何提示。
如果查看您配置的主機上的iptable規則,您將看到一條新規則:
sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- anywhere anywhere multiport dports ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-ssh (1 references)
target prot opt source destination
DROP all -- xxx-xxxxxxxx.dyn.xxxxxxxxx.net anywhere
RETURN all -- anywhere anywhere
您可以從底部看到新規則。
結論
您現在應該通過fail2ban使服務器成獲得額外的安全性。雖然這是一個很好的開始,但更完整的解決方案是完全禁用密碼身份驗證並僅允許基於密鑰的身份驗證。更多Linux教程請前往騰訊雲+社區學習更多知識。
參考文獻:《How To Protect SSH with fail2ban on Debian 7》
問答
相關閱讀
此文已由作者授權騰訊雲+社區發布,原文鏈接:https://cloud.tencent.com/developer/article/1178537?fromSource=waitui
歡迎大家前往騰訊雲+社區或關注雲加社區微信公眾號(QcloudCommunity),第一時間獲取更多海量技術實踐干貨哦~
海量技術實踐經驗,盡在雲加社區! https://cloud.tencent.com/developer?fromSource=waitui