2026年7月26日
2026年7月26日
WordPressのSOC連携:セキュリティ監視チームに送るログと対応手順の決め方
SOC(Security Operations Center)は、ログを常時監視して攻撃の兆候を見つけ、分析と対応の指示を行うチームや体制のことです。社内に置く場合も、外部の監視サービスに委託する場合もあります。WordPress サイトを SOC の監視対象にするとき、WordPress 側に「SOC 連携」という標準機能や設定画面はありません。連携の実体は、次の2つです。
- SOC が使うログ収集基盤(SIEM など)に、WordPress とサーバーのログを送ること
- アラートが出たときに、誰が何をするかを取り決めておくこと
この記事では、この2つを WordPress の運用担当者の立場で準備する手順を説明します。コードと設定は2026年10月時点の WordPress 6.x・PHP 8.x・rsyslog(Ubuntu / Debian 系)で確認できる仕様に基づいています。
連携の前に SOC と決めること
ログを送り始める前に、次の項目を SOC(または委託先)と文書で取り決めます。ここが曖昧なままだと、アラートが出ても誰も動けません。
| 項目 | 決める内容の例 |
|---|---|
| 監視対象 | ドメイン、サーバー(本番・ステージング)、CDN や WAF の有無 |
| 送るログ | Web サーバーのアクセスログ、PHP エラーログ、WordPress の操作ログ、OS の認証ログ |
| 送り方 | syslog 転送、SOC が指定するエージェント、API など。暗号化の有無 |
| アラートの条件 | どの事象を検知したら通知するか(後述の例を参照) |
| 連絡先と時間帯 | 一次連絡先、夜間・休日の連絡先、連絡手段、応答までの目安 |
| SOC に許す操作 | IP の遮断、WAF ルールの追加、サイトの一時停止を SOC が行ってよいか、サイト側の承認が必要か |
| 保存期間 | ログを SOC 側で何日保存するか、削除の方法 |
| 個人情報の扱い | IP アドレスやユーザー名を含むログを渡すため、委託契約や取り扱いの範囲を確認する |
WordPress まわりで集めるログ
| ログ | 場所の例 | 分かること |
|---|---|---|
| Web サーバーのアクセスログ | /var/log/nginx/access.log、/var/log/apache2/access.log |
wp-login.php や xmlrpc.php への大量アクセス、wp-content/uploads/ 内の .php へのアクセスなど |
| PHP のエラーログ | PHP-FPM や error_log の設定先 |
攻撃による異常な入力でのエラー、改ざん後のエラー |
| WordPress の操作ログ | 下記の mu-plugin や監査ログプラグインの出力 | ログインの成功・失敗、ユーザー追加、権限変更、プラグインの有効化 |
| OS の認証ログ | /var/log/auth.log(Debian / Ubuntu) |
SSH ログイン、sudo の実行 |
| WAF・セキュリティプラグインのログ | 各製品の出力先 | 遮断した攻撃の内容 |
WordPress 本体は、ログインやユーザー操作の履歴をファイルに残しません。操作ログが必要な場合は、監査ログ用のプラグインを使うか、フックを使って自分で書き出します。プラグインで記録する方法は WordPressのセキュリティ監査ログを設定する方法 を参照してください。ここでは、SOC に転送しやすいように syslog へ1行の JSON で書き出す方法を紹介します。
手順1: WordPress の操作を syslog に書き出す
次のファイルを wp-content/mu-plugins/soc-event-logger.php として置きます(mu-plugins ディレクトリが無ければ作ります)。mu-plugin は管理画面から無効化できないため、監視用のコードに向いています。
<?php
/**
* Plugin Name: SOC Event Logger
* Description: ログイン・ユーザー・プラグインの操作を syslog に JSON で書き出す。
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
function soc_log_event( $event, array $data = array() ) {
$record = array_merge(
array(
'app' => 'wordpress',
'site' => home_url(),
'event' => $event,
'ip' => isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : '',
'time' => gmdate( 'c' ),
),
$data
);
openlog( 'wordpress', LOG_PID, LOG_AUTH );
syslog( LOG_NOTICE, wp_json_encode( $record ) );
closelog();
}
add_action( 'wp_login', function ( $user_login, $user ) {
soc_log_event( 'login_success', array( 'user' => $user_login, 'user_id' => $user->ID ) );
}, 10, 2 );
add_action( 'wp_login_failed', function ( $username ) {
soc_log_event( 'login_failed', array( 'user' => $username ) );
} );
add_action( 'user_register', function ( $user_id ) {
soc_log_event( 'user_created', array( 'user_id' => $user_id ) );
} );
add_action( 'set_user_role', function ( $user_id, $role, $old_roles ) {
soc_log_event( 'role_changed', array( 'user_id' => $user_id, 'role' => $role, 'old_roles' => $old_roles ) );
}, 10, 3 );
add_action( 'activated_plugin', function ( $plugin ) {
soc_log_event( 'plugin_activated', array( 'plugin' => $plugin ) );
} );
add_action( 'deactivated_plugin', function ( $plugin ) {
soc_log_event( 'plugin_deactivated', array( 'plugin' => $plugin ) );
} );
使っているフックは、いずれも WordPress 本体のアクションです。
| フック | 発生するとき |
|---|---|
wp_login |
ログインに成功したとき |
wp_login_failed |
ログインに失敗したとき(存在しないユーザー名も含む) |
user_register |
ユーザーが追加されたとき |
set_user_role |
ユーザーの権限グループが変更されたとき |
activated_plugin / deactivated_plugin |
プラグインが有効化・無効化されたとき |
ファシリティを LOG_AUTH、識別子を wordpress にしているので、Debian / Ubuntu の標準設定では /var/log/auth.log に記録されます。確認するには、わざと間違ったパスワードでログインしてから次を実行します。
sudo grep 'wordpress' /var/log/auth.log | tail -n 5
CDN やリバースプロキシの後ろにあるサイトでは、REMOTE_ADDR がプロキシの IP になります。その場合は、プロキシが付ける X-Forwarded-For などを信頼できる経路からのものだけ使うよう、サーバー側で実際のクライアント IP を復元する設定(Nginx の real_ip モジュール、Apache の mod_remoteip)を先に行ってください。ヘッダーを無条件に信用すると、攻撃者が IP を偽装できます。
手順2: rsyslog で SOC の収集サーバーへ転送する
SOC が専用のエージェントを指定している場合はその手順に従います。syslog での受け取りに対応している場合は、rsyslog の転送設定を追加します。/etc/rsyslog.d/60-soc.conf の例です。siem.example.com と 514 は SOC から指定された宛先に置き換えます。
# Web サーバーのアクセスログをファイルから読み込む
module(load="imfile")
input(type="imfile" File="/var/log/nginx/access.log" Tag="nginx-access:")
# WordPress の操作ログとアクセスログを TCP で転送する(送れない間はディスクに溜める)
if $programname == 'wordpress' or $programname == 'nginx-access' then {
action(type="omfwd" target="siem.example.com" port="514" protocol="tcp"
queue.type="LinkedList" queue.filename="soc_fwd"
queue.saveOnShutdown="on" action.resumeRetryCount="-1")
}
Apache の場合は File を /var/log/apache2/access.log にします。設定の文法を確認してから再起動します。
sudo rsyslogd -N1
sudo systemctl restart rsyslog
logger -t wordpress '{"event":"soc_test"}'
最後の logger はテスト用のメッセージです。SOC 側でこのメッセージが届いたことを確認してもらいます。
上の例は平文の TCP です。インターネット越しに送る場合は、rsyslog の TLS 設定や VPN など、SOC が指定する暗号化の方法を使ってください。rsyslog の転送設定の詳細は rsyslogでログをリモートサーバーに転送する方法 で説明しています。SIEM 側の取り込みについては WordPressのSIEM連携方法 も参照してください。
手順3: ファイル改ざんの点検結果も送る
WP-CLI の verify-checksums は、WordPress 本体と WordPress.org 配布のプラグインのファイルを公式のチェックサムと照合します。cron で定期実行し、結果を syslog に流しておくと、改ざんの兆候も SOC が見られます。
# crontab -e(WordPress のファイル所有者で実行。毎日 3:00)
0 3 * * * cd /var/www/html && wp core verify-checksums 2>&1 | logger -t wordpress-integrity
10 3 * * * cd /var/www/html && wp plugin verify-checksums --all 2>&1 | logger -t wordpress-integrity
この識別子(wordpress-integrity)も転送したい場合は、手順2の条件に or $programname == 'wordpress-integrity' を加えます。WordPress.org 以外で配布されている有料プラグインなどは照合できないため、警告として出ます。
手順4: アラートの条件を決める
SOC と相談して、検知したら通知する条件を決めます。WordPress でよく使われる例です。
| 条件 | 見るログ | 疑われること |
|---|---|---|
短時間に大量の login_failed |
操作ログ、アクセスログ | パスワードの総当たり攻撃 |
普段使わない国や IP からの login_success |
操作ログ | アカウントの乗っ取り |
予定にない user_created や管理者への role_changed |
操作ログ | 侵入後の管理者アカウント作成 |
予定にない plugin_activated |
操作ログ | 不正なプラグインの設置 |
wp-content/uploads/ 内の .php へのアクセス |
アクセスログ | バックドアの呼び出し |
verify-checksums の不一致 |
改ざん点検の結果 | 本体・プラグインのファイル改ざん |
更新作業や担当者の追加など、予定された作業でもアラートが出ます。作業の予定を SOC に事前連絡する手順も決めておくと、誤検知の確認が早く済みます。
手順5: アラートを受けた後の手順を用意する
SOC から連絡を受けたときに、サイト側で行う作業を手順書にしておきます。例として、不審なログインの連絡を受けた場合です。
- 連絡の内容(日時、IP、ユーザー名)と、操作ログ・アクセスログを照合して事実を確認する。
- 管理者ユーザーの一覧を確認し、見覚えのないユーザーがいないか調べる。
- 対象ユーザーのパスワードを変更し、ログイン中のセッションを破棄する。
- 調査のため、ログとファイルを変更前の状態で保存する。
- 侵入の可能性が高い場合は、初動対応の手順に移る。
手順2と3で使う WP-CLI のコマンドです。
# 管理者の一覧
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered
# 対象ユーザーのセッションをすべて破棄(ユーザー名は実際のものに置き換える)
wp user session destroy example_user --all
侵入が疑われる場合の隔離・証拠保全・復旧の順番は、サーバーがハッキングされた時の初動対応手順 にまとめています。
注意点
- サーバーの時刻がずれていると、SOC 側で複数のログを突き合わせられません。
timedatectlで NTP 同期が有効になっているか確認してください。 - ログには IP アドレスやユーザー名など、個人に関わる情報が含まれます。送る範囲と保存期間を取り決め、プライバシーポリシーとの整合も確認してください。
- アクセスログは量が多くなります。SOC 側の料金や容量の上限がログ量で決まる場合は、送る範囲を相談してください。
- ログを送るだけでは攻撃は止まりません。総当たり攻撃の自動遮断などは、サーバー側でも併用します(WordPressのFail2Banでブルートフォースを防ぐ方法)。
まとめ
- WordPress に SOC 連携の標準機能は無く、連携とは「ログを SOC に送ること」と「アラート後の役割分担を決めること」。
- 送るログは、アクセスログ・PHP エラーログ・WordPress の操作ログ・OS の認証ログが基本。WordPress の操作ログはフック(
wp_login_failedなど)で syslog に書き出せる。 - 転送は SOC が指定する方法に合わせ、syslog の場合は rsyslog の
omfwdと暗号化を使う。 - アラート条件と、連絡を受けた後のサイト側の手順を文書にしておく。
関連記事: