歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~小程序
對於SSH服務的常見的攻擊就是暴力破解攻擊——遠程攻擊者經過不一樣的密碼來無限次地進行登陸嘗試。固然SSH能夠設置使用非密碼驗證驗證方式來對抗這種攻擊,例如公鑰驗證或者雙重驗證。將不一樣的驗證方法的優劣處先放在一邊,若是咱們必須使用密碼驗證方式怎麼辦?你是如何保護你的 SSH 服務器免遭暴力破解攻擊的呢?bash
幸運的是,有一種工具能夠緩解這種攻擊這個工具是fail2ban。這能夠配置爲容許使用SSH進行合法登陸,但在通過必定次數後沒法正確驗證後攻擊將禁用IP地址。咱們將在Debian上安裝和配置該軟件。沒有服務器的同窗能夠在這裏購買,不過我我的更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後在購買服務器。服務器
Debian在其默認存儲庫中包含fail2ban。咱們可使用如下命令下載並安裝它:微信
sudo apt-get update
sudo apt-get install fail2ban
複製代碼
這不只會安裝fail2ban,還會自動設置啓動服務。app
fail2ban配置保存在/etc/fail2ban
目錄中。默認禁止規則的配置文件稱爲jail.conf
。ssh
因爲fail2ban在程序有新版本時更新其配置文件的方式,所以咱們不該編輯默認配置文件。tcp
相反,咱們應該將其複製到新位置進行編輯:工具
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:這列出了若是客戶端沒法正確驗證禁令將持續的時間。
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
複製代碼
在文件的下方,你應該看到標記爲這樣的部分:
[application_name]
複製代碼
您應該可以破譯大多數參數。
filter
參數指定/etc/fail2ban/filter.d
目錄中的文件。這告訴fail2ban如何解析程序的日誌文件以查看失敗的身份驗證。
若是fail2ban解析失敗。logpath
變量保存服務日誌文件的路徑,
您能夠在此處覆蓋任何其餘默認參數。例如,對於SSH,maxretry
選項與Debian安裝中的dault選項不一樣。
咱們實際上不會對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以實施新規則。您能夠經過輸入如下命令來執行此操做:
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