はじめに
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をブロックします。
- インストール
sudo apt-get install fail2ban
- 基本設定(/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();
});
対策のポイント
-
段階的な実装
- まずは基本的なレート制限から始める
- 効果を見ながら徐々に調整する
-
正常なアクセスを妨げない
- 制限値は控えめに設定
- 正常なユーザーの利用パターンを把握
-
ログの監視
- アクセスログを定期的にチェック
- 異常なパターンを見つけたら対応
トラブルシューティング
よくある問題と解決方法:
-
正常なユーザーがブロックされる
- レート制限の値を緩める
- ホワイトリストの設定を検討
-
制限が効かない
- プロキシ設定の確認
- X-Forwarded-Forの設定確認
-
サーバー負荷が高い
- キャッシュの活用
- 静的コンテンツのCDN利用
まとめ
ボット対策は完璧な解決策はありませんが、基本的な対策を組み合わせることで、多くの問題に対処できます。サーバーの状況に応じて、適切な設定値を見つけることが重要です。