Вопрос или проблема
Я размещаю несколько сайтов на WordPress. Время от времени сайты одного из моих клиентов оказываются скомпрометированными, иногда из-за повторного использования пароля или чего-то подобного.
Я бы хотел иметь возможность добавлять информацию о логировании в Apache, чтобы лучше видеть, кто пытается войти в систему, и было бы еще лучше, если бы можно было добавлять имена пользователей (если пользователь вошел в систему) к каждому запросу в файле журнала доступа.
Кто-нибудь знает, возможно ли сделать что-то из этого без больших усилий и без необходимости установки плагина WordPress на каждый сайт? Если да, можете ли вы дать подсказки, как это сделать. Надеюсь, это можно сделать без mod_security или чего-то подобного, но я рассмотрю этот вариант, если это необходимо.
Я предполагаю, что, по крайней мере, должна существовать переменная post, которую я могу записывать каждый раз, когда кто-то пытается войти через /wp-admin, и это было бы полезно, но было бы еще лучше, если бы я мог сделать что-то более надежное.
Ответ или решение
Вопрос, касающийся возможности логирования авторизованных пользователей WordPress в Apache без использования плагинов WordPress, поднимает несколько важных аспектов, касающихся безопасности и управляемости веб-сайтов. Понимание и реализация этой задачи требует определенной технической квалификации, а также понимания, как веб-инфраструктура и WordPress взаимодействуют друг с другом.
Теория
Когда пользователи авторизуются на сайте WordPress, им присваивается сессия с уникальным идентификатором, обычно с использованием файлов cookies. WordPress предоставляет API для аутентификации, а также обрабатывает запросы пользователей через файл wp-login.php
. Чтобы добавить информацию о пользователе, вошедшем на сайт, в лог файлы Apache, важно понять, на каком уровне можно интегрировать эти данные и каким образом они доступны.
Apache по умолчанию логирует запросы с использованием формата, который не включает специфические данные аутентификации пользователей. Однако, используя настраиваемые логи, такие как LogFormat
и CustomLog
, можно изменить формат логирования, чтобы включать дополнительные данные. Но самое сложное – это связывание данных WordPress с данными, которые доступна Apache.
Пример
Представьте себе, что у нас есть несколько сайтов на одной платформе, они все используют WordPress, и у вас нет возможностей или желания использовать плагины для расширения функциональности. Вашей целью является логирование пользователей в формате: username@example.com - [дата] "Запрос" код
Для этой цели можно использовать вызовы PHP и инициализацию файлов cookies для извлечения имени пользователя. Простым примером может служить добавление кастомного кода в файл functions.php
вашей темы. Например:
add_action('init', 'log_user_activity');
function log_user_activity() {
if (is_user_logged_in()) {
$current_user = wp_get_current_user();
$username = $current_user->user_login;
$ip = $_SERVER['REMOTE_ADDR'];
$url = $_SERVER['REQUEST_URI'];
error_log("$username - $ip accessed $url");
}
}
Этот код логирует IP-адрес и URL-запрос вместе с именем пользователя. Однако это логируется в логи PHP ошибки и вам потребуется соединить их с логами Apache.
Применение
-
Модуль mod_rewrite и mod_headers: Используйте Apache модули, чтобы манипулировать заголовками запросов. Это может позволить передать идентификатор пользователя или имя в логи Apache через заголовки запросов, если они известны вашей PHP логике:
RewriteEngine on RewriteCond %{HTTP_COOKIE} ^.*wordpress_logged_in.*$ RewriteRule ^ - [E=WP_USER:%{HTTP:my-wp-user-header}]
-
Интерфейс CGI и скрипты: Создание скриптов, работающих с API WordPress для извлечения данных о пользователя и последующего добавления их в формат логов:
#!/bin/bash USERNAME=$(php -r "require('wp-load.php'); echo wp_get_current_user()->user_login;") echo "SetEnv user_name $USERNAME"
-
Логи второго уровня и асинхронный сбор данных: Интеграция внешних систем логирования, таких как Elasticsearch и Kibana, для сохранения и анализа логов. Это позволит отслеживать и анализировать чрезвычайные события без нагрузки на сервер.
-
Системы безопасности и анализаторы: Использование инструментов для обеспечения безопасности, таких как fail2ban, могут добавить второй уровень мониторинга активности пользователей.
-
Каталоги и обработки: Создание автоматизированных процессов, «склеивающих» (связывающих) логи PHP ошибок с логами Apache, может обеспечить целостность данных.
Заключение
Без использования плагинов WordPress задача по логированию активности пользователей в Apache становится более технически сложной, требующей дополнительных скриптов или даже модулей Apache для обработки специфической информации. Необходимы глубокие интеграции между PHP и Apache, а также креативный подход к обработке и управлению потоками пользовательских данных. Хотя настройка может быть сложной, автоматизация этого процесса и учет всех переменных позволит вам создать более надежную и безопасную систему, которая будет отвечать вашим потребностям в отслеживании активности пользователей без значительного увеличения нагрузки на серверные ресурсы.