Linux 管理員的一個重要任務是保護服務器免受非法攻擊或訪問。 默認情況下,Linux 系統帶有配置良好的防火墻,比如iptables、Uncomplicated Firewall(UFW),ConfigServer Security Firewall(CSF)等,可以防止多種攻擊。
任何連接到互聯網的機器都是惡意攻擊的潛在目標。 有一個名為 Fail2Ban 的工具可用來緩解服務器上的非法訪問。
1、什么是 Fail2Ban ?
Fail2Ban 是一款入侵防御軟件,可以保護服務器免受暴力攻擊。 它是用 Python 編程語言編寫的。 Fail2Ban 基于auth 日志文件工作,默認情況下它會掃描所有 auth 日志文件,如 /var/log/auth.log、/var/log/apache/access.log 等,并禁止帶有惡意標志的IP,比如密碼失敗太多,尋找漏洞等等標志。
通常,Fail2Ban 用于更新防火墻規則,用于在觸發安全策略條件的情況下與在指定的時間內拒絕 IP 地址。 它也會發送郵件通知。 Fail2Ban 為各種服務提供了許多過濾器,如 ssh、apache、nginx、squid、named、mysql、nagios 等。
Fail2Ban 能夠降低錯誤認證嘗試的速度,但是它不能消除弱認證帶來的風險。 這只是服務器防止暴力攻擊的安全手段之一。
2、如何在 Linux 上安裝 Fail2Ban
Fail2Ban 已經與大部分 Linux 發行版打包在一起了,所以只需使用你的發行包版的包管理器來安裝它。
對于 Debian / Ubuntu,使用 APT-GET 命令或 APT 命令安裝。
sudo apt install fail2ban
對于 Fedora,使用 DNF 命令安裝。
sudo dnf install fail2ban
對于 CentOS/RHEL,啟用 EPEL 庫或 RPMForge 庫,使用 YUM 命令安裝。
對于 Arch Linux,使用 Pacman 命令安裝。
sudo pacman -S fail2ban
對于 openSUSE , 使用 Zypper命令安裝。
sudo zypper in fail2ban
3、如何配置 Fail2Ban ?
默認情況下,Fail2Ban 將所有配置文件保存在 /etc/fail2ban/
目錄中。 主配置文件是 jail.conf
,它包含一組預定義的過濾器。 所以,不要編輯該文件,這是不可取的,因為只要有新的更新,配置就會重置為默認值。
只需在同一目錄下創建一個名為 jail.local
的新配置文件,并根據您的意愿進行修改。
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
此時在使用 CenotOS 7.x 操作時出現一些錯誤,比如當你啟動后你會看到加載不到 httpd 服務的 error 日志等錯誤。你可以將 jail.local 中沒有必要的配置給刪除,因為文件中配置了一些我們不需要的服務。現在我們只以 sshd 服務舉例所以只需要保留 [DEFAUL]部分和 sshd 服務部分。再次重啟還會發現在 /var/log/message
日志文件中出現 Jul 14 10:32:37 root84 systemd: start request repeated too quickly for fail2ban.service
錯誤。可以使用以下命令進行排查問題,在啟動 fail2ban 時打印出詳細日志信息:
[root@root84 fail2ban]# /usr/bin/fail2ban-client -v -v start
從輸出的信息中你可以看到他依然在加載 /etc/fail2ban/jail.conf
配置文件中的內容并使用配置項,最后所發生的 ERROR 依然是表示加載不到 httpd 服務的 error 日志文件。所以我們將 /etc/fail2ban/jail.conf
備份并刪除,只使用 /etc/fail2ban/jail.local
中的配置。注意:這里所描述的錯誤是因為我在 /etc/fail2ban/jail.local
文件中將 [DEFAUL] 部分中的 enable 設置為 true 狀態,開啟了所有服務的 jail
,在配置文件中的此配置項附近有描述信息:
[DEFAUL]
...
# "enabled" enables the jails.
# By default all jails are disabled, and it should stay this way.
# Enable only relevant to your setup jails in your .local or jail.d/*.conf
#
# true: jail will be enabled and log files will get monitored for changes
# false: jail is not enabled
enabled = false
...
默認情況下,大多數選項都已經配置的很完美了,如果要啟用對任何特定 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
-
ignoreip
:本部分允許我們列出 IP 地址列表,Fail2Ban 不會禁止與列表中的地址匹配的主機 -
bantime
:主機被禁止的秒數 -
findtime
:如果在最近 findtime 秒期間已經發生了 maxretry 次重試,則主機會被禁止 -
maxretry
:是主機被禁止之前的失敗次數
4、如何配置服務?
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
-
enabled
: 確定服務是打開還是關閉。 -
port
:指明特定的服務。 如果使用默認端口,則服務名稱可以放在這里。 如果使用非傳統端口,則應該是端口號。 -
logpath
:提供服務日志的位置 -
backend
:指定用于獲取文件修改的后端。
5、重啟 Fail2Ban
[For SysVinit Systems]
# service fail2ban restart
[For systemd Systems]
# systemctl restart fail2ban.service
6、驗證 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
CentOS 7.X
[root@root84 fail2ban]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
f2b-sshd-ddos tcp -- anywhere anywhere multiport dports ssh
f2b-sshd tcp -- anywhere anywhere multiport dports ssh
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
INPUT_direct all -- anywhere anywhere
INPUT_ZONES_SOURCE all -- anywhere anywhere
INPUT_ZONES all -- anywhere anywhere
DROP all -- anywhere anywhere ctstate INVALID
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
7、如何測試 Fail2Ban ?
使用 sshd 為例:使用一臺服務器(表示為A)鏈接設置好并開啟 Fail2Ban 的服務器(表示為B),在多次鏈接失敗之后 B服務器 的 Fail2Ban 將動態更改防火墻規則禁止 A服務器 訪問。
Last login: Sun Jul 14 22:17:16 on ttys001
jinxiaozhang@YDdeMacBook-Pro:~$ ssh root@192.168.0.84
root@192.168.0.84's password:
Permission denied, please try again.
root@192.168.0.84's password:
asdfPermission denied, please try again.
root@192.168.0.84's password:
root@192.168.0.84: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
jinxiaozhang@YDdeMacBook-Pro:~$ ssh root@192.168.0.84
root@192.168.0.84's password:
Permission denied, please try again.
root@192.168.0.84's password:
asdf
^C
jinxiaozhang@YDdeMacBook-Pro:~$
jinxiaozhang@YDdeMacBook-Pro:~$ telnet 192.168.0.84 22
Trying 192.168.0.84...
telnet: connect to address 192.168.0.84: Connection refused
telnet: Unable to connect to remote host
jinxiaozhang@YDdeMacBook-Pro:~$
查看 Fail2Ban 的日志
2019-07-14 10:55:12,096 fail2ban.filter [3835]: INFO [sshd] Found 192.168.0.212
2019-07-14 10:55:13,998 fail2ban.filter [3835]: INFO [sshd] Found 192.168.0.212
2019-07-14 10:55:17,802 fail2ban.filter [3835]: INFO [sshd] Found 192.168.0.212
2019-07-14 10:55:22,652 fail2ban.filter [3835]: INFO [sshd] Found 192.168.0.212
2019-07-14 10:55:24,926 fail2ban.filter [3835]: INFO [sshd] Found 192.168.0.212
2019-07-14 10:55:25,150 fail2ban.actions [3835]: NOTICE [sshd] Ban 192.168.0.212
當經過我們設置的 bantime
配置項的秒數之后將開啟 B服務器對 A服務器 ssh 的訪問。
8、Fail2Ban 的一些使用操作
查看啟用的監獄列表,請運行以下命令。
fail2ban-client status
通過運行以下命令來獲取禁止的 IP 地址。
fail2ban-client status ssh
要從 Fail2Ban 中刪除禁止的 IP 地址,請運行以下命令。
fail2ban-client set ssh unbanip 192.168.0.254
摘抄于 linux.cn 并使用 CentOS 7.X 通過實際測試,添加其他內容。