快轉到主要內容

Linux伺服器部署Anubis擋AI爬蟲機器人,替代Cloudflare防火牆的輕量選擇

· 民國115年丙午年
·
切換繁體/簡體
分類 Linux系統 Self-hosting自架
標籤 Google Amazon Web Services
目錄

在造訪Linux相關網站的時候,你有看過這個獸耳娘嗎?她就是Anubis!

Anubis是一款針對爬蟲機器人所設計的輕量Web防火牆,在伺服器加上bot challenge,能夠防止伺服器被AI爬蟲機器人爬到掛,也能防止,保護伺服器服務。

原理是在伺服器的回應加入SHA-256數學計算,要求客戶端,通常是瀏覽器,進行工作量證明(Proof-of-Work),自動驗證使用者是否為機器人再放行。因為一般爬蟲無法處理這種耗算力的請求,就會導致他們被Anubis攔截下來,達到保護伺服器的目的。

你甚至可以用Anubis設置蜜罐節點(dataset poisoning),讓爬蟲機器人陷入死循環無法爬到真正的資料。

自從2022年LLM爆紅之後,許多公司為了取得程式碼訓練資料,開始大規模的爬取開源專案的伺服器,無視robots.txt亂爬,幾乎形成了DDoS攻擊的態勢。於是Anubis便在加拿大誕生了。

Anubis的吉祥物是一隻獸耳蘿莉,她的形象來自於埃及神話中的阿努比斯神,秤量你靈魂的罪惡,決定是否能前進。

現在很多FOSS專案都會使用Anubis這個服務擋爬蟲機器人,譬如託管在Gitlab的FreeDesktop專案。Debian和Arch Linux官網也有使用Anubis。因為Anubis是開源而且是可自架的,運作不依賴第三方伺服器。

伺服器管理員可以根據自身需要自訂Anubis顯示的回應。畢竟…不是每個人都喜歡獸耳蘿嘛,會讓訪客以為進到了什麼動漫宅網站。我覺得Anubis舊版的吉祥物更可愛的說。但是Anubis開發者規定這隻吉祥物不可替換,得購買商業版BotStopper解鎖!

Anubis可以部分替代Cloudflare或Google reCAPTCHA。雖然Anubis規模跟Cloudflare差距甚大(畢竟後者有一整群龐大伺服器在協同工作),但對於一般的爬蟲已經足夠應付。

對一般使用者來說,部署Anubis也能防止自己託管的服務被攻擊。例如我想要阻擋他人惡意濫用我在VPS部署的代理搜尋引擎SearXNG,就可以用Anubis擋掉。

不過使用Anubis帶來的問題就是,會讓一些特殊環境的瀏覽器無法輕鬆存取你的服務。譬如你有用到自動化的瀏覽器程式,可能反被Anubis擋下來。

1. Anubis架構
#

根據官方文件,Anubis應該是位於反向代理與伺服器服務中間執行的。它支援Nginx、Apache、Caddy、Traefik這些主流的反向代理伺服器。

例如使用Nginx,Anubis就會在中間介入,驗證才放行。

也就是:

Anubis當中介反向代理伺服器:瀏覽器 → nginx HTTPS → Anubis → 實際後端服務

或者:

Anubis當nginx auth_request sidecar:瀏覽器 → nginx → 問Anubis要不要放行 → 實際後端服務

2. 在Linux伺服器安裝Anubis
#

Anubis是使用MIT授權釋出的自由軟體。無需付費即可使用。自架十分簡單。RAM佔用不到128MB。另外Anubis背後的公司Techaro也提供客製化圖示的商業版「BotStopper」。

參考Anubis官方文件,多個Linux發行版已經收錄了Anubis套件。

如果要確保Anubis自動更新的話,也可以選擇用Docker部署再用WatchTower。

對非滾動發行版的Ubuntu來說,建議從Github下載取得新版.deb檔安裝

sudo apt install ./anubis_*_amd64.deb

3. 設定要保護的服務
#

  1. 複製Anubis設定檔,針對要保護的服務新增對應的設定檔。

  2. 例如我要用SearXNG,複製default.env/etc/anubis/

sudo cp /etc/anubis/default.env /etc/anubis/searxng.env
  1. 複製bot policies,以服務為名稱取名。bot policies裡面可以更詳細的設定攔截的規則,例如針對特定國家IP的應對措施。這裡就維持預設。
sudo cp /usr/share/doc/anubis/botPolicies.yaml /etc/anubis/searxng.botPolicies.yaml
  1. /etc/anubis/的.env設定檔,編輯TARGET填寫服務的IP,因為我的SearXNG跑在反向代理後面所以是監聽伺服器本機的8080通訊埠。DIFFICULTY設定驗證難度,數字越大越久,預設的4在大多數裝置應該都能十秒內解出來。額外設定OVERLAY_FOLDER的話就能自訂要顯示的圖片與CSS。
BIND=:8239
DIFFICULTY=4 
METRICS_BIND=:9090 
SERVE_ROBOTS_TXT=0 
TARGET=http://localhost:8080                     
  1. 用Systemd啟動Anubis服務,小老鼠後面加上剛剛撰寫的設定檔名稱
sudo systemctl enable --now anubis@searxng.service
  1. 驗證Anubis服務是否上線
curl http://localhost:8240/metrics
  1. Anubis的服務log使用這個查看
sudo journalctl -u anubis@服務名稱

4. 將Anubis與Nginx串接
#

  1. 我是透過https://子網域來存取服務的。

  2. 例如我定義SearXNG的設定檔位於/etc/nginx/sites-available/searxng,原本是這樣

server {
    server_name 子網域;
    client_max_body_size 0;

    location / {
        proxy_pass http://localhost:8089; # Docker通訊埠
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Http-Version $server_protocol;
    }     
  1. 將實際要導向的服務改為Anubis通訊埠。應該與/etc/anubis/*.env寫的一樣,預設應該是8239
server {
    server_name 子網域;
    client_max_body_size 0;

    location / {
        proxy_pass http://localhost:8239; # Anubis
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Http-Version $server_protocol;
    }    
  1. 另外應該允許Anubis給瀏覽器放置cookie,通過後短期不用再驗證。編輯/etc/anubis/的.env設定檔,加入子網域
COOKIE_DOMAIN=子網域
  1. 重新載入Nginx服務
sudo nginx -t

sudo systemctl reload nginx
  1. 用瀏覽器打開目標網址,應該會看到Anubis出現了。

相關文章


感謝您的閱讀。我寫作是為了誠實表達想法,而不是追逐社群互動與流量。我很樂意傾聽你在仔細閱讀我文章之後的心得。若有內容勘誤 or 技術問題 or 回饋想法,歡迎透過本站「關於」頁面的Email與我聯絡。