增加 SSH 登入安全性(二)

延續上篇,除了調整 sshd_config 設定以提高安全性外,還有個常用的工具 fail2ban

本文介紹的 fail2ban 是 v0.9.7,請注意不同版本的設定方式可能會稍有不同。

fail2ban 會分析你的 log 檔,藉由登入失敗記錄來防止暴力破解。

安裝

我的 server 是 CentOS 7,因此使用 yum 安裝:

# 安裝前先看一下相關訊息
yum info fail2ban

yum install fail2ban

設定

裝好後,可依需求調整相關設定檔:

fail2ban.(conf|local)

位置在 /etc/fail2ban/fail2ban.conf,檔案內的註解寫得很詳細,大部分情況不需要修改,需要修改時新增一支 fail2ban.local,會 override 預設的設定,就不多說明了。

jail.(conf|local)

位置在 /etc/fail2ban/jail.conf,fail2ban 會依據這支檔案的設定來決定如何封鎖,和 fail2ban.conf 類似,要修改時新增一支 jail.local 來 override 預設值。

我的設定如下(新增一支 jail.local):

# /etc/fail2ban/jail.local
[sshd]
enabled  = true
port     = ssh
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
# logpath  = /var/log/secure
backend  = systemd
maxretry = 5
findtime = 600 ; 10 minutes
bantime  = 1200 ; 20 minutes

注意註解起來的 logpath 那一行,因為我的 server 使用 systemd,因此我設定使用 backend = systemd,原因可以參考這裡

其餘各項設定代表的意思:

  • ignoreip:白名單
  • action:要執行的動作
  • filter:使用的 filter(在 /etc/fail2ban/filter.d/ 底下)
  • maxretry:在 findtime 內最多可以嘗試的次數
  • findtime:多少時間內檢查 retry 次數(秒)
  • bantime:封鎖時間(秒)

filter.d/

定義過濾條件,此目錄下已有多種內建的過濾條件,例如 apache、sshd、postfix 等等。

action.d/

定義動作內容,例如 sendmail(寄信通知)、iptables(阻擋來源 ip)等等。

我們上面使用 iptables 阻擋,但它預設使用 REJECT,可以改為 DROP。一樣新增 .local 檔來 override :

# /etc/fail2ban/action.d/iptables-common.local
[Init]
blocktype = DROP

啟動

# 啟動服務
systemctl start fail2ban.service # 或 service fail2ban start

# 重新啟動服務(如果有修改設定)
systemctl restart fail2ban.service

# 設定開機啟動
systemctl enable fail2ban.service # 或 chkconfig fail2ban on

測試

啟動後,使用 fail2ban-client ping,會看到回應 pong,代表 fail2ban 有正常運作。

再來,使用 fail2ban-client status 應該會看到類似這樣的訊息:

╭─[email protected] ~
╰─$ sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

代表 sshd 這個服務已經受到 fail2ban 的保護。進一步看 sshd 的狀態,則使用指令 fail2ban-client status sshd,會有更詳細的訊息。

而 fail2ban 的 log 預設會記錄在 /var/log/fail2ban.log 這個路徑,可以從這個檔案看到目前 fail2ban 檢測到哪些可疑 ip。

如果想測試是否真的會被 ban,可以用 tail -f /var/log/fail2ban.log,或是 journalctl -f -u sshd 觀察 log 變化,再用另外一台電腦嘗試用錯誤密碼登入。

查看/解禁被封鎖的 IP

查看

由於我們上面使用 iptables 封鎖,因此我們可以直接列出 iptables 資訊來查看被封鎖的 IP:

sudo iptables --list -n
# 假設是 192.168.1.2 被 ban
Chain f2b-SSH (1 references)
target     prot opt source               destination
REJECT     all  --  192.168.1.2          0.0.0.0/0            reject-with icmp-port-unreachable
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

也可以使用 fail2ban-client 來查看被封鎖的 IP 位置:

sudo fail2ban-client status sshd
╭─[email protected] ~
╰─$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     5
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     2
   `- Banned IP list:   192.168.1.2

解鎖

想要解鎖某個 IP 的話,可以使用 iptables 指令,也可以使用 fail2ban-client:

# iptables
sudo iptables -D f2b-SSH -s 192.168.1.2 -j REJECT

# fail2ban-client
sudo fail2ban-client set sshd unbanip 192.168.1.2

fail2ban 相關指令

# 查看 fail2ban 狀態
fail2ban-client status

# 查看特定服務狀態
fail2ban-client status sshd

# 以 filter 規則測試既有 log 檔
# syntax: fail2ban-regex [log file] [filter_rule file]
fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf

參考資料

最後更新時間: