用 CrowdSec 保護你的 PHP 網站不受機器人攻擊
PHP 是 Web 上廣泛使用的一種編程語言,據估計有近 80% 的網站使用它。我在 CrowdSec 的團隊決定,我們需要為伺服器管理員提供一個 PHP 門衛,以幫助抵禦那些可能試圖與 PHP 文件互動的機器人和不良分子。
CrowdSec 門衛可以在應用棧的各個層面上進行設置:Web 伺服器、防火牆、CDN 等等。本文關注的是另外一個層次:直接在應用層面設置補救措施。
由於各種原因,直接在應用程序中進行補救是有幫助的:
- 它為潛在的安全威脅提供了業務邏輯上的答案。
- 它提供了關於如何應對安全問題的自由。
雖然 CrowdSec 已經發布了一個 WordPress 門衛,但這個 PHP 庫被設計成可以包含在任何 PHP 應用中(例如 Drupal)。該門衛有助於阻止攻擊者,用驗證碼挑戰他們,讓人類通過,同時阻止機器人。
先決條件
本教程假定你在 Linux 伺服器上運行 Drupal,並使用 Apache 作為 Web 伺服器。
第一步是在你的伺服器上 安裝 CrowdSec。你可以用 官方安裝腳本 來完成。如果你使用的是 Fedora、CentOS 或類似系統,請下載 RPM 版本:
$ curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.rpm.sh
在 Debian 和基於 Debian 的系統上,下載 DEB 版本:
$ curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh
這些腳本很簡單,所以仔細閱讀你下載的腳本,以驗證它是否導入了 GPG 密鑰並配置了一個新的存儲庫。當你清楚了它的作用後,就執行它,然後安裝。
$ sudo dnf install crowdsec || sudo apt install crowdsec
CrowdSec 會自己檢測到所有現有的服務,所以不需要進一步的配置就可以立即得到一個能發揮功能的設置。
測試初始設置
現在你已經安裝了 CrowdSec,啟動一個 Web 應用漏洞掃描器,比如 Nikto,看看它的表現如何:
$ ./nikto.pl -h http://<ip_or_domain>
![nikto scan](/data/attachment/album/202201/24/094255nafol1dxld1ympck.png "nikto scan")
該 IP 地址已被檢測到觸發了各種場景,最後一個是 crowdsecurity/http-crawl-non_statics
:
![detected scan](/data/attachment/album/202201/24/094255xyuknyupyheyizpi.png "detected scan")
然而,CrowdSec 只檢測問題,需要一個門衛來應用補救措施。這就是 PHP 門衛發揮作用的地方。
用 PHP 門衛進行補救
現在你可以檢測到惡意行為了,你需要在網站層面上阻止 IP。在這個時候,沒有用於 Drupal 的門衛可用。然而,你可以直接使用 PHP 門衛。
它是如何工作的?PHP 門衛(和其他門衛一樣)對 CrowdSec 的 API 進行調用,並檢查是否應該禁止進入的 IP,向他們發送驗證碼,或者允許他們通過。
Web 伺服器是 Apache,所以你可以使用 Apache 的安裝腳本:
$ git clone https://github.com/crowdsecurity/cs-php-bouncer.git
$ cd cs-php-bouncer/
$ ./install.sh --apache
![apache install script](/data/attachment/album/202201/24/094255kuaksumsiudyazan.png "apache install script")
門衛的配置是用來保護整個網站。可以通過調整 Apache 的配置保護網站的一個特定部分。
嘗試訪問網站
PHP 門衛已經安裝並配置好。由於之前的網路漏洞掃描行動,你被禁止了,你可以嘗試訪問該網站看看:
![site access attempt](/data/attachment/album/202201/24/094256g9ckfxflf4r44txp.png "site access attempt")
門衛成功阻止了你的流量。如果你在以前的 Web 漏洞掃描後沒有被禁止,你可以用增加一個手動決策:
$ cscli decisions add -i <your_ip>
對於其餘的測試,刪除當前的決策:
$ cscli decisions delete -i <your_ip>
更進一步
我封鎖了試圖破壞 PHP 網站的 IP。這很好,但那些試圖掃描、爬取或 DDoS 的 IP 怎麼辦?這些類型的檢測可能會導致誤報,那麼為什麼不返回一個驗證碼挑戰來檢查它是否是一個真正的用戶(而不是一個機器人),而不是封鎖 IP?
檢測爬蟲和掃描器
我不喜歡爬蟲和壞的用戶代理,在 Hub 上有各種方案可以用來發現它們。
確保用 cscli』 下載了 Hub 上的
base-http-scenarios` 集合:
$ cscli collections list | grep base-http-scenarios
crowdsecurity/base-http-scenarios ✔️ enabled /etc/crowdsec/collections/base-http-scenarios.yaml
如果沒有找到,請安裝它,並重新載入 CrowdSec:
$ sudo cscli collections install crowdsecurity/base-http-scenarios
$ sudo systemctl reload crowdsec
用驗證碼補救
由於檢測 DDoS、爬蟲或惡意的用戶代理可能會導致誤報,我更傾向於對任何觸發這些情況的 IP 地址返回一個驗證碼,以避免阻止真正的用戶。
為了實現這一點,請修改 profiles.yaml
文件。
在 /etc/crowdsec/profiles.yaml
中的配置文件的開頭添加這個 YAML 塊:
# /etc/crowdsec/profiles.yaml
name: crawler_captcha_remediation
filter: Alert.Remediation == true && Alert.GetScenario() in ["crowdsecurity/http-crawl-non_statics", "crowdsecurity/http-bad-user-agent"]
decisions:
- type: captcha
duration: 4h
on_success: break
有了這個配置文件,任何觸發 crowdsecurity/http-crawl-non_statics
或 crowdsecurity/http-bad-user-agent
場景的 IP 地址都會被強制執行一個驗證碼(持續 4 小時)。
接下來,重新載入 CrowdSec:
$ sudo systemctl reload crowdsec
嘗試自定義的補救措施
重新啟動 Web 漏洞掃描器會觸發很多場景,所以你最終會再次被禁止。相反,你可以直接製作一個觸發 bad-user-agent
場景的攻擊(已知的壞用戶代理列表在 這裡)。請注意,你必須激活該規則兩次才能被禁止。
$ curl --silent -I -H "User-Agent: Cocolyzebot" http://example.com > /dev/null
$ curl -I -H "User-Agent: Cocolyzebot" http://example.com
HTTP/1.1 200 OK
Date: Tue, 05 Oct 2021 09:35:43 GMT
Server: Apache/2.4.41 (Ubuntu)
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-cache, must-revalidate
X-Content-Type-options: nosniff
Content-Language: en
X-Frame-Options: SAMEORIGIN
X-Generator: Drupal 7 (http://drupal.org)
Content-Type: text/html; charset=utf-8
當然,你可以看到,你的行為會被抓住。
$ sudo cscli decisions list
![detected scan](/data/attachment/album/202201/24/094256nzi5vwjfvwhoweeh.png "detected scan")
如果你試圖訪問該網站,不會被簡單地被阻止,而是會收到一個驗證碼:
![CAPTCHA prompt](/data/attachment/album/202201/24/094256hsllv4yd24s44oyt.png "CAPTCHA prompt")
一旦你解決了這個驗證碼,你就可以重新訪問網站了。
接下來,再次解禁自己:
$ cscli decisions delete -i <your_ip>
啟動漏洞掃描器:
$ ./nikto.pl -h http://example.com
與上次不同的是,你現在可以看到,你已經觸發了幾個決策:
![scan detected](/data/attachment/album/202201/24/094257gu8q62l6y27xy206.png "scan detected")
當試圖訪問網站時,禁止決策具有優先權:
![site access attempt](/data/attachment/album/202201/24/094257jseuvc5ungnueag9.png "site access attempt")
總結
這是一個幫助阻止攻擊者進入 PHP 網站和應用程序的快速方法。本文只包含一個例子。補救措施可以很容易地擴展,以適應額外的需求。要了解更多關於安裝和使用 CrowdSec 代理的信息,查看這個方法指南 來開始。
要下載 PHP 門衛,請到 CrowdSec Hub 或 GitHub。
via: https://opensource.com/article/22/1/php-website-bouncer-crowdsec
作者:Philippe Humeau 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive