溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用fail2ban和FirewallD黑名單保護(hù)你的系統(tǒng)

發(fā)布時間:2021-10-23 14:28:10 來源:億速云 閱讀:154 作者:小新 欄目:系統(tǒng)運(yùn)維

這篇文章給大家分享的是有關(guān)如何使用fail2ban和FirewallD黑名單保護(hù)你的系統(tǒng)的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

為了防止反復(fù)的 ssh 登錄嘗試,我們來看看 fail2ban。而且,如果你不經(jīng)常旅行,基本上停留在一兩個國家,你可以將 FirewallD 配置為只允許從你選擇的國家訪問。

首先,讓我們?yōu)椴皇煜み@些應(yīng)用程序的人員介紹一些術(shù)語,以完成這項(xiàng)工作:

fail2ban:一個守護(hù)進(jìn)程,用于禁止發(fā)生多次認(rèn)證錯誤的主機(jī)。fail2ban 將監(jiān)控 SystemD 日志,以查找對任何已啟用的“監(jiān)獄jail”的失敗的驗(yàn)證嘗試。在達(dá)到指定失敗次數(shù)后,它將添加一個防火墻規(guī)則,在配置的時間內(nèi)阻止該特定 IP 地址。

FirewallD:一個帶有 D-Bus 接口的防火墻守護(hù)進(jìn)程,提供動態(tài)防火墻。除非你另行決定使用傳統(tǒng)的 iptables,否則你已經(jīng)在所有支持的 Fedora 和 CentOS 上安裝了 FirewallD。

假定前提

  • 主機(jī)系統(tǒng)有一個互聯(lián)網(wǎng)連接,并且要么是直接暴露在互聯(lián)網(wǎng)上,要么是通過 DMZ(這兩個都是非常糟糕的想法,除非你知道你在做什么),要么是有一個端口從路由器轉(zhuǎn)發(fā)過來。

  • 雖然大部分的內(nèi)容可能適用于其他系統(tǒng),但本文假設(shè)當(dāng)前系統(tǒng)是 Fedora(31 及以上)或 RHEL/CentOS 8 版本。在 CentOS 上,你必須用 sudo dnf install epel-release 啟用 Fedora EPEL 倉庫。

安裝與配置

Fail2Ban

很有可能已經(jīng)有某個 Firewalld 區(qū)已經(jīng)允許 SSH 訪問,但 sshd 服務(wù)本身默認(rèn)沒有啟用。要手動啟動它,并且不在啟動時永久啟用它:

$ sudo systemctl start sshd

或者在系統(tǒng)啟動時啟用,并同時啟動它:

$ sudo systemctl enable --now sshd

下一步就是安裝、配置、啟用 fail2ban。和往常一樣,安裝可以通過命令行完成:

$ sudo dnf install fail2ban

安裝完畢后,下一步就是配置“監(jiān)獄”(你要以設(shè)置的任何閾值監(jiān)視并禁止的服務(wù))。默認(rèn)情況下,IP 會被禁止 1 小時(這其實(shí)不夠長)。最好的做法是使用 *.local 文件覆蓋系統(tǒng)默認(rèn)值,而不是直接修改 *.config 文件。如果我們查看我的 jail.local,我們可以看到:

# cat /etc/fail2ban/jail.local[DEFAULT] # "bantime" is the number of seconds that a host is banned.bantime  = 1d # A host is banned if it has generated "maxretry" during the last "findtime"findtime  = 1h # "maxretry" is the number of failures before a host get banned.maxretry = 5

換成通俗的語言講,就是在過去一小時內(nèi)嘗試 5 次后,該 IP 將被封禁 1 天。對于多次被封的 IP,也可以選擇增加封禁時間,但這是另一篇文章的主題。

下一步是配置“監(jiān)獄”。在本教程中顯示的是 sshd,但其他服務(wù)的步驟大致相同。在 /etc/fail2ban/jail.d 中創(chuàng)建一個配置文件。這是我的文件:

# cat /etc/fail2ban/jail.d/sshd.local[sshd]enabled = true

就這么簡單! 很多配置已經(jīng)在為 Fedora 構(gòu)建的軟件包中處理了(提示:我是當(dāng)前的維護(hù)者)。接下來啟用并啟動 fail2ban 服務(wù):

$ sudo systemctl enable --now fail2ban

希望沒有立即出錯,如果沒有,請使用下面的命令檢查 fail2ban 的狀態(tài):

$ sudo systemctl status fail2ban

如果它沒有錯誤地啟動,應(yīng)該是這樣的:

$ systemctl status fail2ban● fail2ban.service - Fail2Ban ServiceLoaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled)Active: active (running) since Tue 2020-06-16 07:57:40 CDT; 5s agoDocs: man:fail2ban(1)Process: 11230 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)Main PID: 11235 (f2b/server)Tasks: 5 (limit: 4630)Memory: 12.7MCPU: 109msCGroup: /system.slice/fail2ban.service└─11235 /usr/bin/python3 -s /usr/bin/fail2ban-server -xf startJun 16 07:57:40 localhost.localdomain systemd[1]: Starting Fail2Ban Service…Jun 16 07:57:40 localhost.localdomain systemd[1]: Started Fail2Ban Service.Jun 16 07:57:41 localhost.localdomain fail2ban-server[11235]: Server ready

如果是剛剛啟動的,fail2ban 不太可能顯示任何有意思的信息,但要檢查 fail2ban 的狀態(tài),并確?!氨O(jiān)獄”被啟用,請輸入:

$ sudo fail2ban-client statusStatus|- Number of jail:      1`- Jail list:   sshd

sshd “監(jiān)獄”的上級狀態(tài)也會顯示出來。如果啟用了多個“監(jiān)獄”,它們會在這里顯示出來。

要查看一個“監(jiān)獄”的詳細(xì)狀態(tài),只需在前面的命令中添加“監(jiān)獄”名稱。下面是我的系統(tǒng)的輸出,它已經(jīng)運(yùn)行了一段時間。我已經(jīng)從輸出中刪除了被禁止的 IP:

$ sudo fail2ban-client status sshdStatus for the jail: sshd|- Filter|  |- Currently failed: 8|  |- Total failed:     4399|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd`- Actions   |- Currently banned: 101   |- Total banned:     684   `- Banned IP list:   ...

監(jiān)控 fail2ban 日志文件是否有入侵嘗試,可以通過“尾隨”日志來實(shí)現(xiàn):

$ sudo tail -f /var/log/fail2ban.log

tail 是一個很好的命令行工具,默認(rèn)情況下,它可以顯示一個文件的最后 10 行。添加 -f 告訴它尾隨文件,這是個觀察一個仍在被寫入的文件的很好方式。

由于輸出的內(nèi)容中有真實(shí)的 IP,所以這里不會提供樣本,但它的可讀性很高。INFO 行通常是登錄的嘗試。如果從一個特定的 IP 地址進(jìn)行了足夠多的嘗試,你會看到一個 NOTICE 行顯示一個 IP 地址被禁止。在達(dá)到禁止時間后,你會看到一個 NOTICE 解禁行。

注意幾個警告行。最常見的情況是,當(dāng)添加了一個禁止后,fail2ban 發(fā)現(xiàn)該 IP  地址已經(jīng)在其禁止數(shù)據(jù)庫中,這意味著禁止可能無法正常工作。如果是最近安裝的 fail2ban 包,它應(yīng)該被設(shè)置為 FirewallD  的富規(guī)則。這個包在 fail2ban-0.11.1-6 版本時從 ipset 方式切換到了富規(guī)則方式,所以如果你的 fail2ban  安裝時間較早,它可能還在嘗試使用 ipset 方式,這種方式使用的是傳統(tǒng)的 iptables,不是很可靠。

FirewallD 配置
被動還是主動?

有兩種策略可以分開或一起使用:被動地將單個 IP 地址或主動地根據(jù)來源國將子網(wǎng)永久列入黑名單。

對于被動方式,一旦 fail2ban 運(yùn)行了一段時間,最好再運(yùn)行 sudo fail2ban-client status sshd 來看看有哪些壞蛋。很可能會有很多被禁止的 IP 地址。選擇一個,然后試著對它運(yùn)行 whois。在輸出結(jié)果中可能會有很多有趣的信息,但是對于這個方法來說,只有來源國是重要的。為了保持簡單,讓我們過濾掉除了國家以外的所有信息。

在這個例子中,我們將使用一些著名的域名:

$ whois google.com | grep -i countryRegistrant Country: USAdmin Country: USTech Country: US
$ whois rpmfusion.org | grep -i countryRegistrant Country: FR
$ whois aliexpress.com | grep -i countryRegistrant Country: CN

使用 grep -i 的原因是為了使 grep 不區(qū)分大小寫,而大多數(shù)條目都使用的是 “Country”,而有些條目則是全小寫的 “country”,所以這種方法無論如何都能匹配。

現(xiàn)在知道了嘗試入侵的來源國,問題是,“是否有來自這個國家的人有合法的理由連接到這臺計(jì)算機(jī)?”如果答案是否定的,那么封鎖整個國家應(yīng)該是可以接受的。

從功能上看,主動式方法它與被動式方法沒有太大區(qū)別,然而,來自有些國家的入侵企圖是非常普遍的。如果你的系統(tǒng)既不放在這些國家里,也沒有任何源自這些國家的客戶,那么為什么不現(xiàn)在就把它們加入黑名單而是等待呢?(LCTT  譯注:我的經(jīng)驗(yàn)是,動輒以國家的范疇而列入黑名單有些過于武斷。建議可以將該 IP 所屬的 WHOIS  網(wǎng)段放入到黑名單,因?yàn)檫@些網(wǎng)段往往具有相同的使用性質(zhì),如都用于用戶接入或 IDC 托管,其安全狀況也大致相同,因此,如果有來自該網(wǎng)段的某個 IP  的惡意嘗試,可以預(yù)期該網(wǎng)段內(nèi)的其它 IP 也可能被利用來做這樣的嘗試。)

黑名單腳本和配置

那么如何做到這一點(diǎn)呢?用 FirewallD ipset。我開發(fā)了下面的腳本來盡可能地自動化這個過程:

#!/bin/bash# Based on the below article# https://www.linode.com/community/questions/11143/top-tip-firewalld-and-ipset-country-blacklist # Source the blacklisted countries from the configuration file. /etc/blacklist-by-country # Create a temporary working directoryipdeny_tmp_dir=$(mktemp -d -t blacklist-XXXXXXXXXX)pushd $ipdeny_tmp_dir # Download the latest network addresses by country filecurl -LO http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gztar xf all-zones.tar.gz # For updates, remove the ipset blacklist and recreateif firewall-cmd -q --zone=drop --query-source=ipset:blacklist; then    firewall-cmd -q --permanent --delete-ipset=blacklistfi # Create the ipset blacklist which accepts both IP addresses and networksfirewall-cmd -q --permanent --new-ipset=blacklist --type=hash:net \    --option=family=inet --option=hashsize=4096 --option=maxelem=200000 \    --set-description="An ipset list of networks or ips to be dropped." # Add the address ranges by country per ipdeny.com to the blacklistfor country in $countries; do    firewall-cmd -q --permanent --ipset=blacklist \        --add-entries-from-file=./$country.zone && \        echo "Added $country to blacklist ipset."done # Block individual IPs if the configuration file exists and is not emptyif [ -s "/etc/blacklist-by-ip" ]; then    echo "Adding IPs blacklists."    firewall-cmd -q --permanent --ipset=blacklist \        --add-entries-from-file=/etc/blacklist-by-ip && \        echo "Added IPs to blacklist ipset."fi # Add the blacklist ipset to the drop zone if not already setupif firewall-cmd -q --zone=drop --query-source=ipset:blacklist; then    echo "Blacklist already in firewalld drop zone."else    echo "Adding ipset blacklist to firewalld drop zone."    firewall-cmd --permanent --zone=drop --add-source=ipset:blacklistfi firewall-cmd -q --reload popdrm -rf $ipdeny_tmp_dir

這個應(yīng)該安裝到 /usr/local/sbin,不要忘了讓它可執(zhí)行!

$ sudo chmod +x /usr/local/sbin/firewalld-blacklist

然后創(chuàng)建一個配置文件 /etc/blacklist-by-country

# Which countries should be blocked?# Use the two letter designation separated by a space.countries=""

而另一個配置文件 /etc/blacklist-by-ip,每行只有一個 IP,沒有任何額外的格式化。

在這個例子中,從 ipdeny 的區(qū)文件中隨機(jī)選擇了 10 個國家:

# ls | shuf -n 10 | sed "s/\.zone//g" | tr '\n' ' 'nl ee ie pk is sv na om gp bn

現(xiàn)在只要在配置文件中加入至少一個國家,就可以運(yùn)行了!

$ sudo firewalld-blacklist  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed100   142  100   142    0     0   1014      0 --:--:-- --:--:-- --:--:--  1014100  662k  100  662k    0     0   989k      0 --:--:-- --:--:-- --:--:--  989kAdded nl to blacklist ipset.Added ee to blacklist ipset.Added ie to blacklist ipset.Added pk to blacklist ipset.Added is to blacklist ipset.Added sv to blacklist ipset.Added na to blacklist ipset.Added om to blacklist ipset.Added gp to blacklist ipset.Added bn to blacklist ipset.Adding ipset blacklist to firewalld drop zone.success

要驗(yàn)證 FirewallD 黑名單是否成功,請檢查 drop 區(qū)和 blacklist ipset。

$ sudo firewall-cmd --info-zone=dropdrop (active)  target: DROP  icmp-block-inversion: no  interfaces:  sources: ipset:blacklist  services:  ports:  protocols:  masquerade: no  forward-ports:  source-ports:  icmp-blocks:  rich rules: $ sudo firewall-cmd --info-ipset=blacklist | lessblacklist  type: hash:net  options: family=inet hashsize=4096 maxelem=200000  entries:

第二條命令將輸出所有的子網(wǎng),這些子網(wǎng)是基于被封殺的國家而添加的,可能會相當(dāng)長。

那么現(xiàn)在我該怎么做?

雖然在開始的時候,監(jiān)控的頻率會比較高,但隨著時間的推移,入侵嘗試的次數(shù)應(yīng)該會隨著黑名單的增加而減少。那么目標(biāo)應(yīng)該是維護(hù)而不是主動監(jiān)控。

為此,我創(chuàng)建了一個 SystemD 服務(wù)文件和定時器,這樣每月都會刷新由 ipdeny 維護(hù)的每個國家的子網(wǎng)。事實(shí)上,這里討論的所有內(nèi)容都可以從我的 pagure.io 項(xiàng)目中下載。

是不是很高興你看完了整篇文章?現(xiàn)在只要把服務(wù)文件和定時器下載到 /etc/systemd/system/,并啟用定時器就行了:

$ sudo systemctl daemon-reload$ sudo systemctl enable --now firewalld-blacklist.timer

感謝各位的閱讀!關(guān)于“如何使用fail2ban和FirewallD黑名單保護(hù)你的系統(tǒng)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI