Linux 管理員的一個重要任務是保護服務器免受非法攻擊或訪問。 默認狀況下,Linux 系統帶有配置良好的防火牆,好比iptables、Uncomplicated Firewall(UFW),ConfigServer Security Firewall(CSF)等,能夠防止多種攻擊。html
任何鏈接到互聯網的機器都是惡意攻擊的潛在目標。 有一個名爲 Fail2Ban 的工具可用來緩解服務器上的非法訪問。mysql
什麼是 Fail2Ban?linux
Fail2Ban[1] 是一款入侵防護軟件,能夠保護服務器免受暴力攻擊。 它是用 Python 編程語言編寫的。 Fail2Ban 基於auth 日誌文件工做,默認狀況下它會掃描全部 auth 日誌文件,如/var/log/auth.log、/var/log/apache/access.log 等,並禁止帶有惡意標誌的IP,好比密碼失敗太多,尋找漏洞等等標誌。ios
一般,Fail2Ban 用於更新防火牆規則,用於在指定的時間內拒絕 IP 地址。 它也會發送郵件通知。 Fail2Ban 爲各類服務提供了許多過濾器,如 ssh、apache、nginx、squid、named、mysql、nagios 等。nginx
Fail2Ban 可以下降錯誤認證嘗試的速度,可是它不能消除弱認證帶來的風險。 這只是服務器防止暴力攻擊的安全手段之一。git
如何在 Linux 中安裝 Fail2Bangithub
Fail2Ban 已經與大部分 Linux 發行版打包在一塊兒了,因此只需使用你的發行包版的包管理器來安裝它。sql
對於 Debian / Ubuntu,使用 APT-GET 命令[2]或 APT 命令[3]安裝。apache
$ sudo apt install fail2ban
對於 Fedora,使用 DNF 命令[4]安裝。編程
$ sudo dnf install fail2ban
對於 CentOS/RHEL,啓用 EPEL 庫[5]或 RPMForge[6] 庫,使用 YUM 命令[7]安裝。
$ sudo yum install fail2ban
對於 Arch Linux,使用 Pacman 命令[8]安裝。
$ sudo pacman -S fail2ban
對於 openSUSE , 使用 Zypper命令[9]安裝。
$ sudo zypper in fail2ban
如何配置 Fail2Ban
默認狀況下,Fail2Ban 將全部配置文件保存在 /etc/fail2ban/ 目錄中。 主配置文件是 jail.conf,它包含一組預約義的過濾器。 因此,不要編輯該文件,這是不可取的,由於只要有新的更新,配置就會重置爲默認值。
只需在同一目錄下建立一個名爲 jail.local 的新配置文件,並根據您的意願進行修改。
# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
默認狀況下,大多數選項都已經配置的很完美了,若是要啓用對任何特定 IP 的訪問,則能夠將 IP 地址添加到 ignoreip 區域,對於多個 IP 的狀況,用空格隔開 IP 地址。
配置文件中的 DEFAULT 部分包含 Fail2Ban 遵循的基本規則集,您能夠根據本身的意願調整任何參數。
# nano /etc/fail2ban/jail.local [DEFAULT] ignoreip = 127.0.0.1/8 192.168.1.100/24 bantime = 600 findtime = 600 maxretry = 3 destemail = 2daygeek@gmail.com
如何配置服務
Fail2Ban 帶有一組預約義的過濾器,用於各類服務,如 ssh、apache、nginx、squid、named、mysql、nagios 等。 咱們不但願對配置文件進行任何更改,只需在服務區域中添加 enabled = true 這一行就能夠啓用任何服務。 禁用服務時將 true 改成 false 便可。
# SSH servers [sshd] enabled = true port = ssh logpath = %(sshd_log)s backend = %(sshd_backend)s
重啓 Fail2Ban
進行更改後,從新啓動 Fail2Ban 才能生效。
[For SysVinit Systems] # service fail2ban restart [For systemd Systems] # systemctl restart fail2ban.service
驗證 Fail2Ban iptables 規則
你可使用下面的命令來確認是否在防火牆中成功添加了Fail2Ban iptables 規則。
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination f2b-apache-auth tcp -- anywhere anywhere multiport dports http,https f2b-sshd tcp -- anywhere anywhere multiport dports 1234 ACCEPT tcp -- anywhere anywhere tcp dpt:1234 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain f2b-apache-auth (1 references) target prot opt source destination RETURN all -- anywhere anywhere Chain f2b-sshd (1 references) target prot opt source destination RETURN all -- anywhere anywhere
如何測試 Fail2Ban
我作了一些失敗的嘗試來測試這個。 爲了證明這一點,我要驗證 /var/log/fail2ban.log 文件。
2017-11-05 14:43:22,901 fail2ban.server [7141]: INFO Changed logging target to /var/log/fail2ban.log for Fail2ban v0.9.6 2017-11-05 14:43:22,987 fail2ban.database [7141]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3' 2017-11-05 14:43:22,996 fail2ban.database [7141]: WARNING New database created. Version '2' 2017-11-05 14:43:22,998 fail2ban.jail [7141]: INFO Creating new jail 'sshd' 2017-11-05 14:43:23,002 fail2ban.jail [7141]: INFO Jail 'sshd' uses poller {} 2017-11-05 14:43:23,019 fail2ban.jail [7141]: INFO Initiated 'polling' backend 2017-11-05 14:43:23,019 fail2ban.filter [7141]: INFO Set maxRetry = 5 2017-11-05 14:43:23,020 fail2ban.filter [7141]: INFO Set jail log file encoding to UTF-8 2017-11-05 14:43:23,020 fail2ban.filter [7141]: INFO Added logfile = /var/log/auth.log 2017-11-05 14:43:23,021 fail2ban.actions [7141]: INFO Set banTime = 600 2017-11-05 14:43:23,021 fail2ban.filter [7141]: INFO Set findtime = 600 2017-11-05 14:43:23,022 fail2ban.filter [7141]: INFO Set maxlines = 10 2017-11-05 14:43:23,070 fail2ban.server [7141]: INFO Jail sshd is not a JournalFilter instance 2017-11-05 14:43:23,081 fail2ban.jail [7141]: INFO Jail 'sshd' started 2017-11-05 14:43:23,763 fail2ban.filter [7141]: INFO [sshd] Found 103.5.134.167 2017-11-05 14:43:23,763 fail2ban.filter [7141]: INFO [sshd] Found 103.5.134.167 2017-11-05 14:43:23,764 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.170 2017-11-05 14:43:23,764 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.170 2017-11-05 14:43:23,765 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.170 2017-11-05 14:43:23,765 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.170 2017-11-05 15:19:06,192 fail2ban.server [7141]: INFO Stopping all jails 2017-11-05 15:19:06,874 fail2ban.jail [7141]: INFO Jail 'sshd' stopped 2017-11-05 15:19:06,879 fail2ban.server [7141]: INFO Exiting Fail2ban 2017-11-05 15:19:07,123 fail2ban.server [8528]: INFO Changed logging target to /var/log/fail2ban.log for Fail2ban v0.9.6 2017-11-05 15:19:07,123 fail2ban.database [8528]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3' 2017-11-05 15:19:07,126 fail2ban.jail [8528]: INFO Creating new jail 'sshd' 2017-11-05 15:19:07,129 fail2ban.jail [8528]: INFO Jail 'sshd' uses poller {} 2017-11-05 15:19:07,141 fail2ban.jail [8528]: INFO Initiated 'polling' backend 2017-11-05 15:19:07,142 fail2ban.actions [8528]: INFO Set banTime = 60 2017-11-05 15:19:07,142 fail2ban.filter [8528]: INFO Set findtime = 60 2017-11-05 15:19:07,142 fail2ban.filter [8528]: INFO Set jail log file encoding to UTF-8 2017-11-05 15:19:07,143 fail2ban.filter [8528]: INFO Set maxRetry = 3 2017-11-05 15:19:07,144 fail2ban.filter [8528]: INFO Added logfile = /var/log/auth.log 2017-11-05 15:19:07,144 fail2ban.filter [8528]: INFO Set maxlines = 10 2017-11-05 15:19:07,189 fail2ban.server [8528]: INFO Jail sshd is not a JournalFilter instance 2017-11-05 15:19:07,195 fail2ban.jail [8528]: INFO Jail 'sshd' started 2017-11-05 15:20:03,263 fail2ban.filter [8528]: INFO [sshd] Found 103.5.134.167 2017-11-05 15:20:05,267 fail2ban.filter [8528]: INFO [sshd] Found 103.5.134.167 2017-11-05 15:20:12,276 fail2ban.filter [8528]: INFO [sshd] Found 103.5.134.167 2017-11-05 15:20:12,380 fail2ban.actions [8528]: NOTICE [sshd] Ban 103.5.134.167 2017-11-05 15:21:12,659 fail2ban.actions [8528]: NOTICE [sshd] Unban 103.5.134.167
要查看啓用的監獄列表,請運行如下命令。
# fail2ban-client status Status |- Number of jail: 2 `- Jail list: apache-auth, sshd
經過運行如下命令來獲取禁止的 IP 地址。
# fail2ban-client status ssh Status for the jail: ssh |- filter | |- File list: /var/log/auth.log | |- Currently failed: 1 | `- Total failed: 3 `- action |- Currently banned: 1 | `- IP list: 192.168.1.115 `- Total banned: 1
要從 Fail2Ban 中刪除禁止的 IP 地址,請運行如下命令。
# fail2ban-client set ssh unbanip 192.168.1.115
via: https://www.2daygeek.com/how-to-install-setup-configure-fail2ban-on-linux/
做者:Magesh Maruthamuthu[10] 譯者:Flowsnow[11] 校對:wxy[12]
本文由 LCTT[13] 原創編譯,Linux中國[14] 榮譽推出
本文地址:http://www.linuxprobe.com/fail2ban-protect-server.html編輯:逄增寶,審覈員:劉遄