20250908003

WordPress サイトを狙う攻撃の全貌と守り方 — 最終章

著者: 管理者 / 2025-09-08 (更新: 2025-09-08)

前回はコチラ WordPress サイトを狙う攻撃の全貌と守り方 — 防御コマンド編WordPress サイトを狙う攻撃の全貌と守り方 — 防御コマンド編

:::
先生、第2回で .htaccessVirtualHost を固めてから、ログが少し静かになりましたわ。でも……まだ同じIPや怪しいBotがしつこく叩いてきますの。どうすれば完全に夜が静かになりますの?😣
:::
:::
良い気づきです。第3回では「運用の武器」を扱います。つまり、User-Agent フィルタリング・攻撃元IPの特定と遮断・レート制限。これらを組み合わせれば、ログも心も落ち着いてきますよ。
:::


📝 解説 — 1) User-Agent フィルタで雑音を減らす

攻撃リクエストは「空UA」や「curl」「wget」などが多いです。UAで完全防御はできませんが、雑音を削るのに有効です。

# UAが空、典型的なスクレイパーを拒否
SetEnvIfNoCase User-Agent "^$" bad_ua
SetEnvIfNoCase User-Agent "python-requests|curl|wget|libwww-perl|apachebench|Go-http-client|bot|spider|crawler" bad_ua

# 古すぎるChromeを拒否(例: v70〜v90)
SetEnvIfNoCase User-Agent "Chrome/7[0-9]\.|Chrome/8[0-9]\.|Chrome/9[0-9]\." bad_ua

<RequireAll>
    Require all granted
    Require not env bad_ua
</RequireAll>

効果

  • 空UA・curl・wget → 403
  • 古い偽装Chromeを名乗るBot → 403
  • 正常なブラウザや最新環境は通過

user01 Surprised
まあ!UAを見ただけで、半分以上のBotがはじけそうですわ✨ でも、同じIPからずっと来る相手はどうしましょう?
user02 Serious
そこで次は「攻撃元IPの把握」です。IPランキングを出して、しつこい相手を特定しましょう。

📝 解説 — 2) 攻撃元IPを可視化してブロック

アクセスログから攻撃対象URLを叩いているIPを抽出します。

# 攻撃対象URL別のIPランキング
sudo egrep 'xmlrpc\.php|setup-config\.php|/wp-json/wp/v2/users' /var/log/httpd/access_log \
| awk '{print $1}' | sort | uniq -c | sort -nr | head -30

対応策

  • 小規模なら firewalld / iptables で直接ブロック
  • 大規模なら Cloudflare / AWS WAF で国別・ASN別ブロック

例(firewalld):

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.45" reject'
sudo firewall-cmd --reload

user01 Calm
ふむふむ……“しつこい相手”は名指しで退場いただくのですのね。けれど、数が多いと手作業では大変ですわ。
user02 Happy
その通り。だから最後に、自動で防御する「レート制限」を導入します。

📝 解説 — 3) レート制限で自動防御

mod_evasive

Apache 標準モジュールで、一定時間に一定数以上のアクセスがあればブロック。

# /etc/httpd/conf.d/mod_evasive.conf
DOSHashTableSize    3097
DOSPageCount        10
DOSPageInterval     1
DOSSiteCount        50
DOSSiteInterval     1
DOSBlockingPeriod   300
DOSEmailNotify      admin@example.com

fail2ban

ログを監視し、繰り返す攻撃元IPを ban。

# /etc/fail2ban/jail.local
[apache-auth]
enabled  = true
filter   = apache-auth
logpath  = /var/log/httpd/error_log
maxretry = 5
bantime  = 3600
findtime = 600

注意

  • 厳しすぎると誤検知あり

  • 最初は bantime を短めに設定し、ログを見て調整


user01 Happy
まあ!これで「普通の人はすっと通れるけれど、攻撃は沈む」……そんな素敵な環境が整いましたのね✨
user02 Calm
ええ、お嬢様。外側で落とし、内側を静かに保ち、ログで観測しながら微調整。それこそが WordPress サイトを長く安全に運用する秘訣です。

📝 まとめ(第3回の学び)

  • User-Agent フィルタで空UA・古い偽装UA・Botを削減

  • 攻撃元IPを可視化し、FWやWAFで個別遮断

  • mod_evasive / fail2ban によるレート制限で自動防御

  • 結果:「普通の利用者は快適、攻撃は自動で退場」

関連記事 WordPress サイトを狙う攻撃の全貌と守り方 — 入門編WordPress サイトを狙う攻撃の全貌と守り方 — 入門編

WordPress サイトを狙う攻撃の全貌と守り方 — 防御コマンド編WordPress サイトを狙う攻撃の全貌と守り方 — 防御コマンド編