WPScanを使った自動脆弱性チェックの方法を実践的に解説。中小企業のWeb担当者でも簡単に導入できる手順とセキュリティ強化のコツをご紹介します。
こんな悩みはありませんか?
「WordPressサイトのセキュリティが心配だけど、毎回手動でプラグインの脆弱性をチェックするのは大変」
「プラグインの更新情報はチェックしているつもりだけど、脆弱性情報まで把握できていない」
「セキュリティ専門知識がないので、何をどうチェックすればいいか分からない」
神奈川のWeb制作会社Fivenine Designとして20年以上WordPressサイトを手がけてきた経験から言えるのは、こうした悩みを抱える中小企業のWeb担当者は本当に多いということです。特に複数のWordPressサイトを管理している場合、手動でのセキュリティチェックは現実的ではありません。
今回は、オープンソースのセキュリティスキャナー「WPScan」を使って、WordPressプラグインの脆弱性を自動的にチェックする方法を実践的にご紹介します。この記事を読んで実践すれば、毎日のセキュリティチェックが自動化され、脆弱性を見逃すリスクが大幅に削減されます。
WordPressサイトが狙われる理由と脆弱性の現状
なぜWordPressサイトがターゲットになるのか
WordPressは全世界のWebサイトの約40%で使用されているCMSです。この普及率の高さが、サイバー攻撃者にとって魅力的なターゲットとなる理由の一つです。
あるクライアント企業では、月に約200回のブルートフォース攻撃を受けていました。さらに深刻なのは、プラグインの脆弱性を狙った攻撃です。WordPressコア自体は比較的セキュリティが強化されているものの、プラグインの脆弱性は発見と修正のタイムラグが生じやすく、その間に攻撃を受けるリスクがあります。
脆弱性情報の管理が困難な理由
手動での脆弱性チェックには限界があります。特に中小企業では専任のセキュリティ担当者を置くことが難しく、Web担当者が他の業務と並行してセキュリティ管理を行うケースが多いのが現状です。
WPScanとは?基本概要と導入メリット
WPScanの特徴
WPScanは、WordPress専用のセキュリティスキャナーです。以下の特徴があります:
- 無料で利用可能:オープンソースツール
- 包括的なスキャン:WordPress本体、テーマ、プラグインの脆弱性を検出
- 定期実行可能:cronやタスクスケジューラと組み合わせて自動化
- 詳細なレポート:脆弱性の深刻度と対処法を提示
実際の導入効果
弊社でWPScanを導入したクライアントでは、以下のような成果を得ています:
WPScanの基本的な使い方
インストール手順
WPScanのインストールは複数の方法がありますが、最も簡単なのはDockerを使用する方法です。
# Docker版のインストール(推奨)
docker pull wpscanteam/wpscan
# 基本的なスキャン実行
docker run --rm wpscanteam/wpscan --url https://example.com
API Tokenの取得と設定
より詳細な脆弱性情報を取得するために、WPScan APIトークンの取得をお勧めします:
- WPScan公式サイトでアカウント作成
- 無料プランでも1日25回のAPI呼び出しが可能
- APIトークンを取得
# APIトークンを使用したスキャン
wpscan --url https://example.com --api-token YOUR_API_TOKEN
基本的なスキャンオプション
# プラグインの脆弱性チェック
wpscan --url https://example.com --enumerate p --plugins-detection aggressive
# テーマの脆弱性チェック
wpscan --url https://example.com --enumerate t
# ユーザー列挙(セキュリティ確認用)
wpscan --url https://example.com --enumerate u
# 包括的なスキャン
wpscan --url https://example.com --enumerate p,t,u,tt,cb,dbe --plugins-detection aggressive --api-token YOUR_API_TOKEN
自動スキャンの設定方法
cronを使用した定期実行設定
Linuxサーバーでの自動実行設定:
# cronジョブの編集
crontab -e
# 毎日午前2時に実行(例)
0 2 * * * /usr/local/bin/docker run --rm wpscanteam/wpscan --url https://example.com --api-token YOUR_API_TOKEN --output /var/log/wpscan/scan_$(date +\%Y\%m\%d).txt
Windows Task Schedulerでの設定
Windows環境での設定手順:
- タスクスケジューラを起動
- 「基本タスクの作成」を選択
- トリガーを「毎日」に設定
- アクションで以下のバッチファイルを実行
@echo off
set LOGFILE=C:\wpscan\logs\scan_%date:~0,4%%date:~5,2%%date:~8,2%.txt
docker run --rm wpscanteam/wpscan --url https://example.com --api-token YOUR_API_TOKEN --output %LOGFILE%
結果の通知設定
脆弱性が発見された場合の自動通知設定:
#!/bin/bash
# wpscan_notify.sh
URL="https://example.com"
API_TOKEN="YOUR_API_TOKEN"
LOGFILE="/var/log/wpscan/scan_$(date +%Y%m%d).log"
EMAIL="[email protected]"
# スキャン実行
docker run --rm wpscanteam/wpscan --url $URL --api-token $API_TOKEN --format json > $LOGFILE
# 脆弱性チェック
if grep -q "vulnerabilities" $LOGFILE; then
# 脆弱性が発見された場合はメール送信
echo "脆弱性が発見されました。詳細は添付ファイルをご確認ください。" | mail -s "WordPress脆弱性アラート" -A $LOGFILE $EMAIL
fi
脆弱性が見つかった時の対処法
脆弱性レポートの読み方
WPScanの出力結果から重要な情報を読み取る方法:
{
"vulnerabilities": [
{
"title": "Plugin XYZ <= 1.2.3 - Cross-Site Scripting (XSS)",
"fixed_in": "1.2.4",
"references": {
"cve": ["2024-12345"],
"url": ["https://example.com/advisory"]
}
}
]
}
対処優先度の判断基準
Critical(緊急)
- 即座に対応が必要
- 認証バイパス、リモートコード実行など
- 24時間以内に修正
High(高)
- 1週間以内の対応を推奨
- SQLインジェクション、権限昇格など
Medium(中)
- 2週間以内の対応
- XSS、CSRF など
Low(低)
- 次回メンテナンス時に対応
- 情報漏洩(軽微)など
具体的な対処手順
flowchart TD
A[脆弱性発見] --> B{深刻度確認}
B -->|Critical/High| C[即座にバックアップ]
B -->|Medium/Low| D[対応計画立案]
C --> E[プラグイン更新]
E --> F{更新版で修正済み?}
F -->|Yes| G[動作確認]
F -->|No| H[プラグイン無効化]
H --> I[代替手段検討]
G --> J[監視継続]
D --> E
I --> Jよくある失敗パターンと対処法
失敗パターン1:スキャン結果の過信
「WPScanで問題なしと表示されたから安心」と思い込むのは危険です。
実際の失敗例: あるクライアントで、WPScanでは検出されない新しいゼロデイ脆弱性により、サイトが改ざんされた事例がありました。スキャンツールは既知の脆弱性しか検出できないという限界を理解しておく必要があります。
対処法:
- WPScanは基本チェックとして活用
- WAF(Web Application Firewall)の併用
- 定期的なファイル整合性チェック
- アクセスログの監視
失敗パターン2:APIトークンなしでの運用
無料版WPScanをAPIトークンなしで使用すると、脆弱性の詳細情報が取得できません。
問題点:
- 脆弱性の深刻度が分からない
- 修正方法の情報が不足
- 最新の脆弱性情報が取得できない
対処法:
# APIトークンありとなしの比較
# APIトークンなし(基本情報のみ)
wpscan --url https://example.com
# APIトークンあり(詳細情報取得)
wpscan --url https://example.com --api-token YOUR_TOKEN
失敗パターン3:本番環境での不適切なスキャン
やってはいけない設定例:
# 危険:アグレッシブスキャンを本番環境で実行
wpscan --url https://production-site.com --plugins-detection aggressive --threads 50
問題点:
- サーバー負荷の増大
- 一時的なサービス停止
- WAFによるIP制限
推奨設定:
# 安全:適度な負荷でのスキャン
wpscan --url https://production-site.com --plugins-detection passive --threads 5 --throttle 1000
失敗パターン4:結果の放置
定期実行は設定したものの、結果を確認せずに放置してしまうパターンです。
対処法としての監視スクリプト例:
#!/bin/bash
# monitoring.sh
# 前回スキャンから脆弱性数の変化をチェック
PREV_COUNT=$(grep -c "vulnerabilities" /var/log/wpscan/prev_scan.log 2>/dev/null || echo 0)
CURR_COUNT=$(grep -c "vulnerabilities" /var/log/wpscan/current_scan.log 2>/dev/null || echo 0)
if [ $CURR_COUNT -gt $PREV_COUNT ]; then
echo "新しい脆弱性が検出されました: $((CURR_COUNT - PREV_COUNT))件" | mail -s "緊急:新規脆弱性検出" [email protected]
fi
WPScanデモ環境での実践練習
安全な練習環境の構築
実際のサイトでいきなりWPScanを使用する前に、テスト環境で練習することをお勧めします。
VulnHub環境の活用:
# 練習用の脆弱なWordPress環境(VirtualBox等で実行)
# WPScanの開発チームが提供する練習環境
wpscan --url http://localhost:8080 --enumerate p,t,u --api-token YOUR_TOKEN
Docker Composeでの練習環境:
# docker-compose.yml
version: '3.8'
services:
wordpress:
image: wordpress:5.8-apache # 意図的に古いバージョンを使用
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db_data:/var/lib/mysql
volumes:
wordpress_data:
db_data:
段階的な学習プロセス
プロフェッショナル向け応用設定
複数サイトの一括管理
#!/bin/bash
# multi_site_scan.sh
# サイトリスト
SITES=(
"https://site1.example.com"
"https://site2.example.com"
"https://site3.example.com"
)
API_TOKEN="YOUR_API_TOKEN"
DATE=$(date +%Y%m%d)
for site in "${SITES[@]}"; do
echo "Scanning $site..."
DOMAIN=$(echo $site | sed 's/https:\/\///g' | sed 's/\///g')
LOGFILE="/var/log/wpscan/${DOMAIN}_${DATE}.json"
docker run --rm wpscanteam/wpscan \
--url "$site" \
--api-token "$API_TOKEN" \
--enumerate p,t,u \
--plugins-detection mixed \
--format json \
--output "$LOGFILE"
# 結果の簡易分析
VULN_COUNT=$(jq '.[] | select(has("vulnerabilities")) | .vulnerabilities | length' "$LOGFILE" 2>/dev/null | awk '{sum+=$1} END{print sum+0}')
echo "$site: $VULN_COUNT vulnerabilities found"
done
結果の可視化とレポート生成
# report_generator.py
import json
import matplotlib.pyplot as plt
from datetime import datetime
def generate_vulnerability_report(scan_results):
"""
WPScanの結果からグラフィカルなレポートを生成
"""
sites = []
vuln_counts = []
for result_file in scan_results:
with open(result_file, 'r') as f:
data = json.load(f)
site_name = data.get('target_url', 'Unknown')
vuln_count = len(data.get('vulnerabilities', []))
sites.append(site_name.replace('https://', '').replace('http://', ''))
vuln_counts.append(vuln_count)
# グラフ生成
plt.figure(figsize=(12, 6))
plt.bar(sites, vuln_counts, color=['red' if x > 5 else 'yellow' if x > 0 else 'green' for x in vuln_counts])
plt.xlabel('Websites')
plt.ylabel('Vulnerability Count')
plt.title(f'WordPress Security Scan Results - {datetime.now().strftime("%Y-%m-%d")}')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('/var/log/wpscan/vulnerability_report.png', dpi=300, bbox_inches='tight')
return '/var/log/wpscan/vulnerability_report.png'
セキュリティ診断サービスとの連携
WPScanの限界と補完の必要性
WPScanは優秀なツールですが、以下の限界があります:
| 項目 | WPScan | プロフェッショナル診断 |
|---|---|---|
| 既知脆弱性 | ||
| ゼロデイ脆弱性 | ||
| 設定ミス検出 | ||
| 手動ペネトレーション | ||
| 法的責任 |
Fivenine Designのセキュリティ診断サービス
弊社では、WPScanによる自動診断と組み合わせた包括的なセキュリティ診断サービスを提供しています:
サービス内容:
- WPScanによる定期自動診断の設定・運用
- 手動ペネトレーションテスト
- セキュリティ設定の最適化
- インシデント対応サポート
- 24時間365日の監視サービス
実際の成果事例: ある製造業のクライアントでは、弊社のセキュリティ診断により、WPScanでは検出できなかった設定ミスを発見し、潜在的なデータ漏洩リスクを回避できました。
まとめと次のステップ
WPScanの導入により、WordPress サイトのセキュリティ管理は大幅に効率化できます。手動でのチェック作業から解放され、より戦略的なセキュリティ対策に時間を投資できるようになります。
導入効果の総括
今すぐ始められる具体的なアクション
- 今週中に実施:テスト環境でWPScanを試用
- 来週までに完了:WPScan APIトークンの取得
- 今月中に設定:本番環境での自動スキャン設定
- 継続的に実施:結果レビューと改善
プロフェッショナルサポートが必要な場合
WPScanの導入や運用で困ったことがあれば、お気軽にFivenine Designまでご相談ください。神奈川を拠点に20年以上の実績を持つ弊社が、あなたのWordPressサイトのセキュリティ強化をしっかりとサポートします。
こんな場合はプロにお任せください:
- 複数サイトの一括管理システムが必要
- より高度なセキュリティ診断が必要
- インシデント発生時の緊急対応が必要
- セキュリティポリシーの策定支援が必要