FreeBSD 11 新功能 - blacklistd

在最近發布的 FreeBSD 11.0-Release 多了一個新功能 - blacklistd,這個功能最早是設計在 NetBSD 7 中,用來阻擋暴力破解 (Brute-force) 或者阻斷服務 (Denial of Service) 等攻擊。blacklistd 提供了一個界面讓服務 daemon 遭遇攻擊時能夠發出通知,當攻擊次數達到某個自訂的門檻之後,blacklistd 能夠搭配防火牆來阻斷惡意攻擊。

什麼是 blacklistd?

組成

blacklistd 包含了幾個部分

  • blacklistd: daemon,用來接收通知 (notification) 與執行指令
  • blacklistd.conf: blacklistd 的設定檔
  • libblacklist API: 用來與 blacklistd 進行連線以及發送通知
  • blacklistctl: 用來查詢 blacklistd 資料庫的工具
  • blacklistd-helper: 支援各種防火牆的 wrapper

流程

blacklistd 啟動時會讀取 /etc/blacklistd.conf,這份設定檔包含了通知的比對條件,例如所使用的 Address/Port/Protocol 甚至是程序的 owner 等等,以及其管理規則,例如幾次攻擊之後進行阻擋、阻擋的時間多久等等,詳盡的規則將在後面補充。那讀取了規則之後,要怎麼偵測是否被攻擊呢?這部分就得要由各個服務自行實作,例如 sshd 在發生 authentication failure 的時候,就要向 blacklistd 送出通知,當然這時候在 blacklistd.conf 也會有針對 sshd 服務的設定,當 authentication failure 發生一定次數之後,該位址就會被阻擋。

比較

其實 blacklistd 的功能相當類似於常用的動態防火牆規則管理工具,例如 [sshguard][]、[fail2ban][] 與 [denyhosts][] 等。上述工具都是透過 log parsing 來找出攻擊的來源並且加以阻擋,例如掃描 /var/log/auth.log,找出誰在短時間內反覆登入失敗,再對防火牆下指令進行阻擋,他們之間的差異大都只在於支援的服務種類 (支援哪些服務的 Log) 以及支援的防火牆類型。既然已經有這麼多現有的工具,何苦還要重來一次,發展另一套工具呢?我覺得比較合理的解釋有幾個;首先,許多種攻擊的行為在連線時服務本身就能夠察覺,不需要再透過分析 Log 來發現,但目前缺乏一個統一的介面讓各個服務能夠阻斷惡意攻擊。除此之外,Log 分析其實也有一些缺點,除了浪費 CPU 資源之外,還有可能遭受像 [Regex DoS][redos] 或者 [Log injection][log_inject] 這類的攻擊。更別說有些服務其實是相對安靜的,例如像 telnetd 就不會記錄登入失敗的訊息,另外還有常常被用來放大攻擊的 ntpd 或者 dns,這些服務就比較難透過 Log 的分析來阻斷攻擊,這部分 blacklistd 就有發揮的空間了,如果未來 blacklistd 被各個平台廣泛採納,或許大部分的服務都會將 blacklistd 作為標準的實作項目。
[sshguard]: http://www.sshguard.net “SSHGuard”
[fail2ban]: http://www.fail2ban.org “Fail2Ban”
[denyhosts]: http://denyhosts.sourceforge.net/ “DenyHosts”
[redos]: https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS “ReDoS”
[log_inject]: https://owasp.org/index.php/Log_Injection “Log Injection”

如何使用 blacklistd?

編輯設定檔

啟動服務

blacklistd 的啟動方式與其他的服務沒有差別,先在 /etc/rc.conf 中加入 blacklistd_enable="YES",接著啟動服務。

$ sudo sysrc blacklistd_enable="YES"
$ sudo service blacklistd start

查詢資料庫

待續…
[blacklistd_slide]: http://www.nycbug.org/event/10358/blacklistd.pdf
[blacklistd_video]: https://www.youtube.com/watch?v=fuuf8G28mjs