世界を動かす技術を、日本語で。

小さなツールを多数使ってボットを積極的に排除する

概要

個人運営サイト大手ボットの大量アクセス によりリソース逼迫 Zabbix 等のモニタリングで異常検知と影響分析 nginx・Fail2Ban によるアクセス制限と自動BANの実施 ログ解析ツール (lnav, goaccess)で攻撃元やパターンを特定 人的アクセス重視 の姿勢と今後の防御体制強化

サイト運営者の苦悩とボットによる被害

  • 小規模な個人サイト に突然の大量アクセス発生
  • 通常は歓迎する来訪者 だが、今回は 悪質なボット によるデータスクレイピング
  • Archive.org のような善良なクローラーは歓迎姿勢
  • Amazon, Facebook, OpenAI など大手企業のボットが自己都合でアクセス
  • AI学習や広告配信 など企業目的の大量データ取得
  • 人的な読者 を大切にしたいという運営方針

異常検知と初動対応

  • Zabbix によるサーバリソース監視で異常を早期発見
  • ディスク使用量急増CPU・メモリアラート の多発
  • Giteaインスタンス のデータ肥大化とリソース圧迫
  • 一時的なサービス停止 やZFS拡張で応急対応
  • 従来のクリーンアップだけでは不十分 と判明

ログ解析による原因特定

  • lnav でnginxアクセスログをSQLライクに解析
    • ユニークIP数リファラーUser-Agent で傾向把握
  • goaccess で過去ログも含めて詳細分析
    • リクエスト数・頻度・ターゲットURL の可視化
  • Amazonbot, OpenAI, Applebot, Facebook など明示的なボット
  • User-Agent偽装 や連続アクセスも多数確認
  • 人的アクセス阻害 につながる深刻な被害

nginxによる即時対策

  • User-Agentによるフィルタリング で悪質ボットを403拒否
    • mapディレクティブでブラックリスト化
  • リクエストレート制限 で過剰アクセスを抑制
    • limit_req_zone/limit_req設定
  • 設定例
    • if ($badagent) { return 403; }
    • limit_req zone=krei burst=20 nodelay;
  • 403対応でも完全解決せず :リクエスト自体の処理負荷は残る

Fail2Banによる自動BANの導入

  • nginxログの403判定 でFail2BanによるIP自動BAN
  • 24時間BAN で再発防止
  • 設定例
    • [nginx-forbidden] enabled = true port = http,https logpath = /var/log/nginx/access.log bantime = 86400
  • 正規表現で403アクセスを検出 し即BAN
  • 数百件規模のBANリスト が生成されるほどの被害規模

まとめと今後の展望

  • 個人運営サイト でも 大手ボットの影響 は甚大
  • 人的な読者 を守るためには 多層防御自動化 の両立が必須
  • ログ監視・アクセス制御・自動BAN の組み合わせが有効
  • AI・大手企業のスクレイピング問題 は今後も継続的な課題
  • 自分のインターネット空間を守る意識技術的対応力 の重要性

Hackerたちの意見

AIクローラーボットが正直にUser-Agentヘッダーを記入してくれるのはいいけど、そんなにトラフィックがあったのには驚いた。99%のウェブサイトはそんなに頻繁に更新されないから、こんなにトラフィックがあるのはおかしいよね、開発ブログなんてなおさら。

彼らはrobots.txtも尊重してくれます。ただ、ブロックされた後に、住宅用IPからブラウザのユーザーエージェントでクローリングを始めるという報告も見たことがあります。でも、最初から誰かが自分のクローラーをOpenAIやAmazon、Facebookなどとして偽っている可能性もあります。

tirrenoのクリエイターです。私たちのプラットフォームは主にライブでログインしているユーザー向けに設計されていますが、ボットの検出やブロックにも効果的です。IPアドレスの最後のオクテットをアスタリスクに置き換えることで匿名化して、同じサブネットを一つのアカウントにまとめています。これにより、特定の条件(例えば、過剰な500や404エラー、ブルートフォースログイン試行、データセンターIPからのトラフィックなど)に基づいて自動的にブラックリストを生成するためのルールエンジンを使うことができます。最後に、tirrenoのブラックリストAPIをアプリケーションロジックに統合して、不要なトラフィックをエラーページにリダイレクトできます。ボーナスとして、アクティビティを監視し、正当なユーザーをブロックしないようにブラックリストを微調整するためのダッシュボードもあります。

同じダッシュボードを通じて、公開されているIPレンジに基づいてボットをブロックする作業も進めています。何か提案があれば大歓迎です。

IPアドレスの最後のオクテットをアスタリスクに置き換えることで匿名化して、同じサブネットを一つのアカウントにまとめています だから、ユーザーとしては、「データセンターIP」に基づく誤検知でブロックされるのは我慢しなきゃいけないし(要するに、情報漏洩しているラストマイル接続からナイーブにブラウジングしていないものはほとんど)、もし運良くブロックされていないものを見つけられたとしても(87個の信号機をクリックするのに成功したとしても)、全く関係ない隣接アドレスと一緒に lumped されて、個人情報を非同意で処理しているユーザー監視システムを作っていないという良心を満たすことになるんだよね。お客さんが本当にお金を失っていることが見えるフィードバックプロセスをちゃんと用意してほしい。

CGNATに移行してるISPにどう対処してる?IPが実際には何百人ものユーザーを表す可能性があるんだけど。

これらのボットのせいで、サーバーのログをオフにしました。彼らは本当にしつこくて、すべてのフォームを埋め尽くしたり、サイトをクリックしないとアクセスできないAPIにまでアクセスしてきます。AnthropicやOpenAI、Facebookは今でもスクレイピングを続けています。

サイトをクリックして回らないとアクセスできないAPIにまでアクセスする どうやって?

ウェブサイトをクリックするためだけに使えるAPIにアクセスしているクローラーについて、情報を共有してもらえますか?それと、UIの一部か何かで、人間だけが押すべきもので、他にそのAPIにアクセスする方法はないってことですか?今はAIエージェントが存在するから、もし彼らが人間のパターンを真似ていたら、実際のユーザーとボットを見分けるのはほぼ不可能です。

著者が「もう気にしない」と言っているのは分かるけど、禁止されたIPの中にGoogleやripe.net、semrushがあったのを見たよ。これらの中で、Googleを禁止するのは絶対におかしいし、他のも多分禁止しないだろうな。他の人に見てもらいたい、話してもらいたいなら、公開サイトを持つ意味がないよね。モーテルの看板の明かりを消しておいて、人を呼び込むのは良い方法じゃないよ。

Semrushは長い間、様々なレベルの無能さでひどい行動をしていたから、少なくとも8年前から私のrobots.txtファイルに特別なメモがあって、最終的には法務部に注意を向けさせることができた。私や私の潜在的なユーザーにとって、'SEO'企業が実際の訪問者を妨げるのを許すことに何の価値も感じない。Semrushの競合他社も同じくらいひどかった。現在のAI関連のナンセンスも非常に質が悪い。少なくとも一つの有名なケースでは、法務部やPR部門に法的な通知を送らなければならず、技術的な対策も講じて、ある程度の品位を取り戻さなければならなかった。

ボットのリクエストがかなりの帯域幅、メモリ、CPU、ディスクスペースを消費してるからだよね。イントロでも言ってるけど、単に失礼だし、そんな風にハーベスターにトラフィックを提供する理由なんてないよ。GoogleもAIスクレイパーを運営してるから、それが見たものかもしれないね?

Googleのスクレイパーを装った悪質な奴もいるよね。昔のGoogleは、リスペクトを持ってスクレイピングしてたけど、もし彼がGooglebotがあろうがなかろうが必要なトラフィックを得ているなら、気にする理由なんてないよね。

この10年間、Googleを使うのが許されないって人々に教育してこなかったの? 特にこんなことが起こるときに? GoogleはAIを使って、俺のような独立したウェブサイトを検閲してるんだ。https://news.ycombinator.com/item?id=44124820 もう責任問題に達してるって感じがするよ!

あまり良心的じゃないクローラーは、大手の真似をしてるだけに見える。ユーザーエージェントが本物じゃないといけないって思ってる人が多い気がする。俺のお気に入りの方法は、robots.txtに餌情報を入れて、gzipボムで自動的にその後のリクエストをブロックすること。Caddyでの設定はすごく簡単で、最悪の offenders を捕まえるのに役立つよ。ボットの行動を擁護するわけじゃないけど、数匹のボットが盲目的にサイトをダウンさせるなら、意図的に悪質な奴が好き放題できるよね。

あなたの最後のコメント、すごく的を射てると思う。もしかしたら、ブログを書いてる人たちとは世代が違うのかもしれないけど、そんなにリソースの使用量にこだわる理由が全然わからない。LEDライトを消し忘れたことでおじいちゃんおばあちゃんがパニックになるのを見てるみたいだし、ガソリン代を5セント節約するために15マイルも運転するのを見るのも同じ感じ。1秒間に20リクエストなんて、ほんとに…何もないよね。もしそれを動的に生成してるとしても(本当に…なんで?キャッシュを使ってそれを直す方がよっぽど時間の無駄が少なかったと思うけど)、需要はそんなにないよ。今の時代、「ボットなんてクソくらえ」みたいな投稿が人気だけど、これは全然新しいことじゃない。もっと生産的な方法がたくさんあって、あなたの時間を無駄にしない方法があるよ。

このrobots.txtについて、もう少し詳しく教えてもらえますか?ほとんどのAIはrobots.txtに関することを完全に無視すると思ってたので、もしかしたら従おうとしているものに当たっているのかもしれないですね。ここにいる他の人たちのようにそのアイデアに反対しているわけではなく、良い行為者を傷つけずに実装する方法に興味があります。

自分のニッチな分野で一番大きなウィキを運営してるんだけど、開発チームの他のメンバーを説得してgzipボムを防御策として使わせるのが難しいんだ。彼らはそれが危険なリスクだと思ってて(EU脳)、追求する価値がないって言ってる。みんな、実際の公開サイトでこれ使ってるの?

90年代に、俺はバカな子供だったけど、ISPから電話がかかってきて、自分のシステムがボットネットに参加してるって言われたんだ。接続を切るから、直すまで待ってるって。住宅プロキシとして使われるのを許容しているISPのASN全体を再度ブロックする時期かもしれないね。これでこの問題が終わるかも。

住宅プロキシはISPから提供されてるんじゃなくて、世界中のユーザー(知ってるか知らないかは別として)が、アクセスや小銭のために怪しいソフトウェアをインストールしてるんだ。昔、hnで結構いい記事があったよ。

ネットワーク上のデバイスがマルウェア感染を示すポートリストへのアウトバウンド接続を試みるとアラートが出るように、いくつかのファイアウォールルールを設定しました。マルウェアがターゲットを頻繁に変えるので、ポートリストは定期的に更新する必要があります。小さなことですが、もう一つの防御層です。

ボットがrobots.txtファイルを全く尊重しなくなったのがムカつく。これを作った奴らは完全にクソだよ。もしお前がその一人なら、さようなら。

チャットボットや検索エンジン、価格比較ツールを使っている人には「gfy」と言ってもいいかもね。彼らがスクレイパーを経済的に促進してるんだから。

「ページノッキング」みたいなものがあるのか気になってます。特定の順番でページを開くとアクセスが許可されるとか。例えば、特定の非公開のURLから始めないと、すべて404になるみたいな。

どんなデザインにしても、これはユーザーに優しくないと思います。ブックマークを保存したり、友達にリンクを送ったりしたら、404が出ちゃうから。

それだと、認可されたユーザーがどうやってアクセスできるの?彼らは、一般の人がSERPからプロジェクトを見つけて、アカウントを作ったり認証したりせずにブラウジングできるようにしたいって言ってるんだけど。

AIや検索のための中央集権的なインデックスに対して、プッシュ/サブミット方式に移行すべきでしょうか?スクレイピングなしで、もしあなたに読んでほしいなら、送ります。

うちのサーバーはただ静かに動いてるだけで、最近fail2banのステータスをチェックしてなかったんだ。

sudo fail2ban-client status | sed -n '/Jail list:/{s/^.*://; s/,//g; p}' | xargs -n1 sudo fail2ban-client status | awk '/jail:/{i=$5}; /Total failed:/{jail[i]=$5}; END{for(i in jail) printf("%s: %s\n", i, jail[i])}' | column

sshd-ddos: 0 postfix: 583 dovecot: 9690 postfix-sasl: 4227 nginx-botsearch: 1421 nginx-http-auth: 0 postfix-botnet: 5425 sshd: 202157 うわ、220,000個もバンされたIPがあるのか…

「DotBot/1.2」っていうボットがいて、今日の時点で過去2週間で220,000回以上リクエストしてるんだ。ランダムにファイル名やフォルダをウェブサーバーからリクエストしてくる。好奇心からバンしてないんだけど、どこまで深く掘るのか見てみたいんだよね。