0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Webサーバーのボット対策入門

Posted at

はじめに

Webサーバーを運用していると、いわゆる「ボット」からの大量のアクセスに悩まされることがあります。この記事では、効果的なボット対策の基本的な方法を、実践的な例を交えて説明します。

ボットによる問題とは?

ボットによるアクセスには以下のような問題があります:

  • サーバーリソースの消費
  • レスポンス時間の低下
  • 不正アクセスの試行
  • コンテンツのスクレイピング

基本的な対策方法

1. Nginxでのレート制限

最も基本的な対策は、一定時間内のアクセス数を制限することです。

# IPアドレスごとのレート制限
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

server {
    location / {
        # バースト的なアクセスを20リクエストまで許可
        limit_req zone=ip_limit burst=20 nodelay;
    }
}

この設定により:

  • 1秒あたり10リクエストまでを許可
  • 一時的な超過は20リクエストまで許容
  • それ以上は429エラーを返す

2. 不要なアクセスのブロック

明らかに不要なアクセスは、初期段階でブロックします。

# WordPressを使用していない場合のwp-adminブロック
location ~* wp-admin {
    return 403;
}

# 特定のUser-Agentをブロック
if ($http_user_agent ~* (crawler|scraper|bot)) {
    return 403;
}

3. fail2banによる動的ブロック

異常なアクセスを検出して、一定時間IPをブロックします。

  1. インストール
sudo apt-get install fail2ban
  1. 基本設定(/etc/fail2ban/jail.local)
[nginx-botsearch]
enabled  = true
port     = http,https
filter   = nginx-botsearch
logpath  = /var/log/nginx/access.log
maxretry = 5
findtime = 60
bantime  = 3600  # 1時間ブロック

4. 簡単なボット検出(Node.js/Express)

const rateLimit = require('express-rate-limit');

// レート制限の設定
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分
  max: 100 // IPあたりの最大リクエスト数
});

app.use(limiter);

// 簡単なボット検出
function isBot(req) {
  const userAgent = req.headers['user-agent'] || '';
  
  // 明らかなボットパターン
  if (/bot|crawler|spider/i.test(userAgent)) {
    return true;
  }
  
  // 異常な速度でのアクセス
  // (実装例:直近5秒間のアクセス回数をチェック)
  const recentAccesses = getRecentAccesses(req.ip);
  if (recentAccesses > 10) {
    return true;
  }
  
  return false;
}

app.use((req, res, next) => {
  if (isBot(req)) {
    return res.status(429).send('Too Many Requests');
  }
  next();
});

対策のポイント

  1. 段階的な実装

    • まずは基本的なレート制限から始める
    • 効果を見ながら徐々に調整する
  2. 正常なアクセスを妨げない

    • 制限値は控えめに設定
    • 正常なユーザーの利用パターンを把握
  3. ログの監視

    • アクセスログを定期的にチェック
    • 異常なパターンを見つけたら対応

トラブルシューティング

よくある問題と解決方法:

  1. 正常なユーザーがブロックされる

    • レート制限の値を緩める
    • ホワイトリストの設定を検討
  2. 制限が効かない

    • プロキシ設定の確認
    • X-Forwarded-Forの設定確認
  3. サーバー負荷が高い

    • キャッシュの活用
    • 静的コンテンツのCDN利用

まとめ

ボット対策は完璧な解決策はありませんが、基本的な対策を組み合わせることで、多くの問題に対処できます。サーバーの状況に応じて、適切な設定値を見つけることが重要です。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?