在造訪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.deb3. 設定要保護的服務#
複製Anubis設定檔,針對要保護的服務新增對應的設定檔。
例如我要用SearXNG,複製
default.env到/etc/anubis/
sudo cp /etc/anubis/default.env /etc/anubis/searxng.env- 複製bot policies,以服務為名稱取名。bot policies裡面可以更詳細的設定攔截的規則,例如針對特定國家IP的應對措施。這裡就維持預設。
sudo cp /usr/share/doc/anubis/botPolicies.yaml /etc/anubis/searxng.botPolicies.yaml- 在
/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 - 用Systemd啟動Anubis服務,小老鼠後面加上剛剛撰寫的設定檔名稱
sudo systemctl enable --now anubis@searxng.service- 驗證Anubis服務是否上線
curl http://localhost:8240/metrics- Anubis的服務log使用這個查看
sudo journalctl -u anubis@服務名稱4. 將Anubis與Nginx串接#
我是透過
https://子網域來存取服務的。例如我定義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;
} - 將實際要導向的服務改為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;
} - 另外應該允許Anubis給瀏覽器放置cookie,通過後短期不用再驗證。編輯
/etc/anubis/的.env設定檔,加入子網域
COOKIE_DOMAIN=子網域- 重新載入Nginx服務
sudo nginx -t
sudo systemctl reload nginx- 用瀏覽器打開目標網址,應該會看到Anubis出現了。


