検索キーワードを入力
カテゴリーを選択

WordPressでログイン履歴の監視機能を実装してセキュリティ強化する方法や対策を徹底解説(プラグインなし)

投稿日:2025年03月09日(日)
WordPressでログイン履歴の監視機能を実装してセキュリティ強化する方法や対策を徹底解説(プラグインなし)|UMENOKI|すぐに仕事で使えるIT技術情報メディア

みなさんこんにちは!エンジニアの高澤です!

今回はWordPressでログイン履歴の監視機能を実装してセキュリティ強化する方法を解説していきたいと思います。

WordPressは使いやすさと柔軟性から、多くのウェブサイトで利用されていますが、同時にセキュリティリスクも伴います。特に、ログイン情報の漏洩や不正アクセスは深刻な問題となり得ます。

そういったところで、ログイン履歴の監視は重要なセキュリティ対策の一つです。今回は、プラグインを使用せずにWordPressのログイン履歴の監視機能の実装方法を解説し、そのメリットや追加で対策すべき実装なども合わせて解説したいと思います。

ログイン履歴の監視によって、不正アクセスの早期発見や不正ユーザーの排除が可能になり、ご自身のWordPressサイトを守る大きな一歩となることと思います。

当記事の内容は、ブログやコーポレートサイト、メディア運営などにおいてセキュリティ強化するためのログイン履歴の監視機能を実践的に自作できる内容となっておりますので、よろしければぜひお仕事などでご活用いただければと思います。

ログイン履歴の監視とは

ログイン履歴の監視とは、WordPressの管理画面へのログイン情報を記録し、どのユーザーがいつ、どこからアクセスしたのかを確認できる仕組みのことを言います。

一般的には、ログイン成功・失敗の記録、ログイン試行のIPアドレス、使用デバイスやブラウザの情報などをログとして保存し、管理画面上で閲覧できるようにすることが一般的です。

この監視機能を導入することで、不正アクセスの兆候を早期に発見し、アカウントの乗っ取りや不正ログインを未然に防ぐことができます。

また、管理者が複数人いる場合、どのユーザーがいつログインしたのかを把握しやすくなり、チーム運営の透明性向上にも貢献します。

このように、ログイン履歴の監視はWordPressサイトのセキュリティを強化する重要な手段の一つと言えるでしょう。(WordPressに限りませんが)

ログイン履歴の監視のメリット

ログイン履歴の監視を行うことのメリットは、WordPressサイトのセキュリティが大幅に向上することです。

まず、不審なログインを即座に察知できるため、不正アクセスの対策がしやすくなります。例えば、海外の見慣れないIPアドレスからログインが試みられた場合、すぐにパスワードを変更したり、特定のIPアドレスをブロックするなどの対策を講じることができます。

また、ログイン履歴を監視することで、運営チームのアカウント管理が容易になります。

複数の管理者がいるサイトでは、誰がいつログインし、どのような操作を行ったのかを確認できるため、不正な変更や誤った操作が発生した際の原因特定がスムーズに行えます。

さらに、セキュリティの監査記録としても活用できるため、サイトの安全性を維持するための重要な情報源となります。

ログイン履歴の監視が必要な理由

WordPressのログイン履歴を監視することは、サイトのセキュリティ対策として欠かせない要素と言えます。

その理由の一つとして、不正ログインのリスクが年々増加していることが挙げられます。

特に、総当たり攻撃(ブルートフォースアタック)やリスト型攻撃などの手法を用いて、不正ログインを試みる攻撃者が存在しているため、サイト運営者は自衛策を講じる必要があります。

また、企業やチームで管理しているWordPressサイトでは、複数のユーザーが管理画面にアクセスするため、不正な操作や設定変更が行われる可能性もあります。

ログイン履歴を記録しておけば、万が一不正な変更が行われた場合でも、誰がいつログインしていたかを追跡でき、問題解決が容易になります。

さらに、セキュリティインシデントの早期発見にも役立ちます。

通常とは異なる時間帯や場所からのログインがあった場合、それが正規の管理者によるものかどうかを確認し、不審な動きがあれば適切な対策を取ることができます。

こうした理由から、WordPressのログイン履歴の監視は、サイトの安全性を維持するために必要不可欠な取り組みと言えるでしょう。

ログイン履歴の監視機能の実装方法

それでは、ログイン履歴の監視機能の実装方法について解説いたします。

まずは実装してしまいましょう。以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// ログイン成功時に履歴を保存
function record_login_attempt($user_login, $user) {
    if (!is_a($user, 'WP_User')) {
        return;
    }

    $ip_address = $_SERVER['REMOTE_ADDR'];
    $user_agent = $_SERVER['HTTP_USER_AGENT']; // 使用デバイス・ブラウザ情報
    $time = current_time('mysql');

    $logins = get_option('custom_login_logs', []);
    if (!is_array($logins)) {
        $logins = [];
    }

    // 新しいログを追加
    $logins[] = [
        'user' => $user_login,
        'ip' => $ip_address,
        'user_agent' => $user_agent,
        'time' => $time
    ];

    // 最大300件まで保存
    if (count($logins) > 300) {
        array_shift($logins);
    }

    update_option('custom_login_logs', $logins);
}
add_action('wp_login', 'record_login_attempt', 10, 2);

// 管理画面にログイン履歴表示ページを追加
function add_login_history_submenu() {
    add_submenu_page(
        'tools.php', // 親メニュー(ツール)
        'ログイン履歴', // ページタイトル
        'ログイン履歴', // メニュータイトル
        'manage_options', // 権限
        'custom-login-history', // スラッグ
        'display_login_history' // コールバック関数
    );
}
add_action('admin_menu', 'add_login_history_submenu');

// 管理画面のログイン履歴ページの内容
function display_login_history() {
    if (!current_user_can('manage_options')) {
        return;
    }

    $logins = get_option('custom_login_logs', []);

    echo '<div class="wrap">';
    echo '<h1 style="margin-bottom:14px;">ログイン履歴</h1>';
    echo '<p>直近の最大300件の情報が表示されます。</p>';
    echo '<table class="widefat fixed" cellspacing="0">';
    echo '<thead><tr><th>ユーザー名</th><th>IPアドレス</th><th>使用デバイス/ブラウザ</th><th>ログイン時刻</th></tr></thead>';
    echo '<tbody>';

    if (!empty($logins)) {
        foreach (array_reverse($logins) as $log) {
            echo '<tr>';
            echo '<td>' . esc_html($log['user']) . '</td>';
            echo '<td>' . esc_html($log['ip']) . '</td>';
            echo '<td>' . esc_html($log['user_agent']) . '</td>'; // デバイス/ブラウザ情報を表示
            echo '<td>' . esc_html($log['time']) . '</td>';
            echo '</tr>';
        }
    } else {
        echo '<tr><td colspan="4">ログイン履歴はありません。</td></tr>';
    }

    echo '</tbody></table></div>';
}

ペーストが完了したら、試しにログインして動作を確認してみましょう。

まだログアウトしていない方はログアウトしてから再度ログインしてください。

管理画面を確認すると、下図のようにWordPress管理画面左メニュー「ツール」に「ログイン履歴」が追加されているのを確認できます。

「ログイン履歴」をクリックしていただくと、下図のように今回実装したログイン履歴ページを確認できます。

項目として、「ユーザー名」「IPアドレス」「使用デバイス/ブラウザ」「ログイン時刻」の4つが表示されていることと思います。

今後ログインされるたびに新しい順に最大300件表示される仕様となっております。

仕様に関してはソースコードをカスタマイズしていただければ簡単に変更できるので、ご自身のWebサイト運用に合わせてカスタマイズしていただければと思います。

これでログイン履歴の監視機能の実装は完了です。お疲れ様でした!

ログイン履歴機能と合わせてセキュリティをより強化する機能の実装方法

ここまでで、ログイン履歴の監視機能の実装は完了していることと思います。

ただ、このままだと不正にログインされた後に管理画面から投稿ページを編集されたり、テーマファイルエディターを編集されたりしてサイトを改ざんされてしまう可能性があるかもしれません。

そのため、筆者のおすすめの追加のカスタマイズのレシピをご紹介できればと思います。

内容としては以下になります。

  • 特定のユーザー以外ファイルエディターを編集不可にする
  • 特定のユーザー以外投稿・固定ページ一覧管理画面にパスワード入力画面を表示させる
  • ログイン試行回数を制限する

それぞれ解説いたします。

いずれも必ず必須というわけではないので、ご自身のサイトの状況や運営方針に合わせてご自由にカスタマイズしていただければと思います。

特定のユーザー以外ファイルエディターを編集不可にする

特定のユーザー以外ファイルエディターを編集不可にする実装方法について解説いたします。

どういう実装かというと、具体的にはテーマを構成するPHPファイルなどを編集するための「テーマファイルエディター」とプラグインを構成するPHPファイルなどを編集するための「プラグインファイルエディター」を編集不可とする実装になります。

ここでの実装をする前のデフォルトの状態だと、下図のようにWordPress管理画面左メニュー「外観」に「テーマファイルエディター」がメニュー項目としてあるかと思います。

「テーマファイルエディター」をクリックすると、下図のように編集するためのファイルエディターが表示されます。

プラグインでも同様で、下図のようにWordPress管理画面左メニュー「プラグイン」に「プラグインファイルエディター」がメニュー項目としてあるかと思います。

「プラグインファイルエディター」をクリックすると、下図のように編集するためのファイルエディターが表示されます。

ご確認いただけましたらお分かりかと思いますが、ファイルエディターを編集できてしまうと、簡単にWebサイトのソースコードを編集できてしまい改ざんすることができてしまいます。

そのため、特定のユーザー以外ファイルエディターを編集不可にする実装をおこなうことによって、いざ不正ログインされた後もより厳重にセキュリティを強化したい場合に非常に有効かと思います。

ただし、チームでサイト運用している場合はどのユーザーを編集許可するのかなどを決めなければならないため、ご自身のサイト運営上の都合を加味して実装していただくことをおすすめします。

それでは、実装する場合は以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
function restrict_file_editors() {
    // 現在のユーザーが特定のユーザーでない場合、エディタ機能を無効にする
    if (!current_user_can('administrator') || wp_get_current_user()->user_login !== '特定のユーザー名(例:admin)') {
        define('DISALLOW_FILE_EDIT', true);
    }
}
add_action('admin_init', 'restrict_file_editors');

ペーストが完了したら、上記コードにある「特定のユーザー名(例:admin)」の部分を、許可したいユーザー名に変更してください。

変更が完了したら、特定のユーザー以外ファイルエディターを編集不可になっていることと思います。

試しに許可した以外のアカウントでWordPressへログインしていただき、管理画面を確認してみてください。

すると、まずテーマファイルエディターでは下図のようにメニュー項目として表示されていないことが確認できるかと思います。

また、テーマファイルエディターのURLでアクセスしても編集できないようになっていることと思います。

プラグインファイルエディターでも同様です。下図のようにメニュー項目として表示されていないことが確認できるかと思います。

そして、プラグインファイルエディターのURLでアクセスしても編集できないようになっていることと思います。

これで特定のユーザー以外ファイルエディターを編集不可にする実装は完了です。お疲れ様でした!

特定のユーザー以外投稿・固定ページ一覧管理画面にパスワード入力画面を表示させる

次は、特定のユーザー以外投稿・固定ページ一覧管理画面にパスワード入力画面を表示させる実装方法について解説いたします。

ここでの実装は、不正ログインされた後にも容易に投稿・固定ページを編集できなくさせるための実装になります。

内容としては、特定のユーザー以外は投稿・固定ページ一覧管理画面にアクセスした時に一回一回パスワードの入力を必須にさせる、という内容になります。

ただこの実装の注意点として、普通に運用するユーザーからしたら煩わしくなってしまう可能性があり、またパスワードの共有なども必要になるため、本当に必要であれば実装していただくことをおすすめいたします。

また、ご自身のWebサイト運用に支障がない形でカスタマイズしていただいて全く問題ありませんので、うまいことコードを活かしていただければと思います。

機能を実装する場合は、以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
function require_password_for_pages_and_posts() {
    // 特定のユーザー名(例: admin)以外にはパスワードを要求
    if (!is_user_logged_in() || wp_get_current_user()->user_login !== '特定のユーザー名(例:admin)') { 
        // 投稿または固定ページの管理画面の場合
        if ((strpos($_SERVER['REQUEST_URI'], 'wp-admin/edit.php') !== false) || (isset($_GET['post_type']) && ($_GET['post_type'] === 'page'))) {
            // パスワードを要求
            if (!isset($_POST['required_password']) || $_POST['required_password'] !== '指定したパスワード(例:password)') {
                // パスワードフォームを表示
                ?>
                <div class="wrap">
                    <h1 class="wp-heading-inline">編集画面へのアクセス</h1>
                    <div class="notice notice-warning is-dismissible">
                        <p>管理画面にアクセスするには、パスワードを入力してください。</p>
                    </div>
                    <form method="POST" style="margin-top: 20px;">
                        <table class="form-table">
                            <tr>
                                <th scope="row"><label for="required_password">パスワードを入力してください:</label></th>
                                <td><input type="password" name="required_password" class="regular-text" /></td>
                            </tr>
                        </table>
                        <p class="submit">
                            <input type="submit" name="submit" class="button button-primary" value="送信" />
                        </p>
                    </form>
                </div>
                <?php
                exit; // 他のコンテンツを表示させない
            }
        }
    }
}
add_action('admin_init', 'require_password_for_pages_and_posts');

ペーストが完了したら、上記コードにある「特定のユーザー名(例:admin)」の部分を、許可したいユーザー名に変更し、「指定したパスワード(例:password)」の部分を任意のパスワードに変更してください。

変更したら管理画面を開いていただき、WordPress管理画面左メニュー「投稿」と「固定ページ」をクリックしてみてください。

すると、いずれも下図のパスワード入力ページが表示されることと思います。

パスワードを入力したら、下図のように投稿一覧、固定ページ一覧が開かれるかと思います。

これで特定のユーザー以外投稿・固定ページ一覧管理画面にパスワード入力画面を表示させる実装は完了です。お疲れ様でした!

ログイン試行回数を制限する

ログイン試行回数を制限する機能の実装方法について解説いたします。

先ほどまでは不正ログイン後のお話でしたが、そもそも手前で不正ログインを防止する実装をすることは非常に有効かと思います。

具体的にどういったセキュリティ機能かというと、例えば5回ログインに失敗したら15分ログインをブロックするという内容になります。

実装したところで、チームでサイト運用していてもパスワードの変更などは必要ないため、すでに重複するプラグインを導入済みとかでなければ実装しても良い機能かと思います。

実装方法は以下の記事にて詳しく解説しておりますので、ご確認いただければと思います。

まとめ

今回は、WordPressでログイン履歴の監視機能を実装してセキュリティ強化する方法を解説いたしました。

WordPressはその使いやすさと柔軟性から多くのウェブサイトで利用されていますが、同時にセキュリティリスクも伴います。特にログイン情報の漏洩や不正アクセスは深刻な問題となるため、ログイン履歴の監視は非常に重要なセキュリティ対策の一つです。

今回の内容により、不正アクセスの早期発見や不正ユーザーの排除が可能になり、サイトのセキュリティを大幅に強化することができるかと思います。

また、ログイン履歴監視に加えて、他のセキュリティ対策も取り入れることで、さらに安全なサイト運営が可能になります。特にブログやコーポレートサイト、メディア運営など、さまざまな用途において実践的な内容として役立てていただけることと思います。

ぜひ、これらの対策を実施し、ご自身のWordPressサイトを守る一歩を踏み出していただければと思います。

執筆者

UMENOKI編集部 高澤 翔汰

歴5年目(2024年8月以降から5年目です)のエンジニアです!
CMSでのサイト構築とWebデザイン制作を兼任して5年目になります。
自作のiOSアプリ(iPhoneアプリ)やWordPressプラグインを開発することもあり、まだまだ現在進行形で勉強中です!

お気軽に皆さんのご要望をお聞かせください!

どんなに些細なことでも構いません!よろしければ記事や当サイトへの「こんな記事があったら仕事とかで役に立つな〜」や「こうだったらもっと役に立つのに!」といったようなご要望等をお気軽にお聞かせください!今後のサービス改善にお役立てさせていただきます!

例1)Reactの技術記事を書いてほしい!
例2)WordPressの使い方とかを初心者向けに解説してほしい!...など

送信と同時にプライバシーポリシーに同意したものとします。