По фреймворкам
Безопасность WordPress — практическая референс-инструкция по хардненингу продакшна
Референс по хардненингу продакшна WordPress: приоритетный чек-лист плюс обновления, управление плагинами/темами, 2FA администратора, снижение открытости админки, wp-config и секреты, файлы и резервные копии, с чек-листом самопроверки. Защитно, без шагов атаки.
Для: всех, кто ведёт сайт на WordPress. Здесь нет шагов атаки — это рабочий референс по хардненингу: приоритетный чек-лист, руководство по областям и самопроверка. Общую по фреймворкам картину смотрите на хабе безопасности по фреймворкам.
Приоритетный чек-лист хардненинга
Выполняйте эту таблицу сверху вниз. P0 — высший приоритет, P1 — самый частый источник инцидентов, P2 — постоянная операционная гигиена.
P0 ── Предпосылка (сначала это)
Автообновления / удаление неиспользуемых плагинов и тем / надёжный администратор + 2FA
P1 ── Главный источник инцидентов
Минимизация плагинов / снижение открытости админки / восстановимые резервные копии
P2 ── Операционная гигиена
wp-config и секреты / права на файлы / HTTPS, заголовки, свежесть PHP/зависимостей
| Приоритет | Мера | Конкретика (WordPress) |
|---|---|---|
| P0 | Автообновления | Включите автообновления для ядра, плагинов, тем. Делайте резервную копию перед мажорными обновлениями |
| P0 | Удалять неиспользуемое | Удаляйте неиспользуемые плагины/темы, не просто отключайте (оставшиеся файлы всё ещё цель) |
| P0 | Надёжный администратор + 2FA | Надёжный пароль + двухфакторная. Избегайте имени пользователя admin; роли по наименьшим привилегиям |
| P1 | Минимизация плагинов | Перед установкой проверяйте частоту обновлений, распространённость, известные CVE. Держите число низким |
| P1 | Защита входа | Ограничение числа попыток входа. Ограничьте открытость wp-admin/wp-login.php |
| P1 | Снижение открытости | Ограничьте xmlrpc.php, если не используется. Подавите перечисление пользователей через REST API |
| P1 | Резервные копии | Офлайн/раздельные восстановимые резервные копии + тесты восстановления + обнаружение подмены |
| P2 | wp-config и секреты | Задайте ключи/соли аутентификации, защитите wp-config.php, отключите вывод отладки в продакшне |
| P2 | Права на файлы | ~644 файлы / 755 каталоги. Запретите выполнение PHP в каталоге загрузок |
| P2 | HTTPS/заголовки/обновления | Принудительный HTTPS, HSTS и т.д. Держите PHP/БД на поддерживаемых версиях |
1. Обновления (главная защита)
Большинство атак на WordPress — это автоматизированные инструменты, массово бьющие по опубликованной известной уязвимости (CVE). Поэтому скорость обновления — ваша самая большая защита.
- Включите автообновления для ядра, плагинов и тем — закрывайте опубликованные дыры до того, как по ним ударят.
- Для важных сайтов проверяйте мажорные обновления в staging и делайте резервную копию перед обновлением.
- Пропущенное обновление — открытый вход для автоматизированных атак. Не откладывайте «на потом».
2. Плагины и темы (поверхность атаки)
Уязвимости стороннего кода — крупнейший вход. Главное — держать число низким и никогда не оставлять без присмотра.
- Всё неиспользуемое удаляйте, а не отключайте (отключённые файлы всё ещё могут быть целью).
- Перед установкой проверяйте частоту обновлений, распространённость, дату последнего обновления и известные CVE. Избегайте заброшенных.
- Проверить CVE плагинов можно через поиск CVE/KEV. Меньше расширений — меньше ответственности за обновления и меньше поверхность атаки.
3. Учётные записи администратора и аутентификация
Большинство захватов — это перебор против слабых/переиспользуемых учётных записей администратора или переиспользование утёкших паролей.
Частое (опасное)
- имя пользователя
admin+ слабый пароль + без 2FA - все являются администраторами (нет разделения ролей)
- неограниченное число попыток входа
wp-adminдоступен откуда угодно
Правильно
- надёжный пароль + 2FA, имя пользователя, отличное от
admin - роли по наименьшим привилегиям (используйте редактора/автора уместно)
- ограничение числа попыток входа (сдерживает перебор)
- где возможно, ограничьте, откуда можно достучаться до
wp-admin/wp-login.php
О выборе 2FA см. что такое 2FA; о маршруте, нацеленном на администраторов, см. что такое фишинг.
4. Снижение открытости (поверхность администрирования и раскрытие информации)
Атакующие сначала ищут «пригодный вход». Отсекайте неиспользуемые функции и ненужное раскрытие информации.
- Добавьте ограничение числа попыток входа, чтобы снизить эффективность перебора.
- Ограничьте
xmlrpc.php, если он не используется (он может стать входом для усиления перебора и потока запросов). - Подавите перечисление пользователей через REST API (не допускайте раскрытия имён администраторов через
?author=и т.п.). - Отключите листинг каталогов и сократите ненужное раскрытие версий.
- Отключите редактирование файлов из админки (
DISALLOW_FILE_EDIT), чтобы усложнить подмену после проникновения.
5. wp-config и секреты (P2)
- Задайте уникальные ключи/соли аутентификации и защитите
wp-config.phpсоответствующими правами (никогда не делайте доступным для чтения всем). - Держите секреты вроде учётных данных БД вне публичной поверхности. Не оставляйте резервные копии или экспорты в публичном каталоге (→ не храните секреты в публичных каталогах).
- В продакшне отключите вывод отладки (
WP_DEBUG_DISPLAYвыключен). Не раскрывайте внутренности через ошибки.
6. Файлы и загрузки (P2)
- Права на файлы примерно 644 файлы / 755 каталоги, и строже для
wp-config.php. Никогда не оставляйте что-либо доступным для записи всем. - Не допускайте выполнения PHP в каталоге загрузок (защита от веб-шелла). Проверяйте тип и размер загрузок.
- Используйте обнаружение подмены (мониторинг изменений файлов), чтобы рано замечать изменения после проникновения.
7. HTTPS, заголовки, резервные копии (P2)
- Принудительный HTTPS + HSTS. Устраните смешанный контент.
- Добавьте заголовки безопасности (проверьте свой сайт через проверку заголовков безопасности).
- Держите офлайн/неизменяемые резервные копии + тесты восстановления, чтобы вы могли восстановиться (→ основы резервных копий). Последняя линия против шифровальщиков и дефейса.
8. Хостинг и зависимости (P1–P2)
- Держите PHP и базу данных на поддерживаемых версиях. Не оставляйте EOL-версии на месте.
- Знайте статус патчей вашего хостинга (на общем хостинге это включает реакцию провайдера).
- WAF — это дополнение; сначала укрепите фундамент (обновления, минимизация, аутентификация, резервные копии).
Проверка: действительно ли ваш WordPress укреплён?
Собрать — это ещё не конец; готово только тогда, когда вы проверили. Это защитные самопроверки против собственного сайта.
Секреты и конфигурация не открыты
/wp-config.php не возвращает своё содержимое и что резервные копии (.zip/.sql) или файлы типа .env нельзя получить по URL.Имена администраторов и версии не утекают
?author=1 и подобное не раскрывают имя пользователя администратора и что листинг каталогов отключён.Защита входа и 2FA работают
admin.Обновления, резервные копии, заголовки
Взгляд нашего сайта: управляйте «расширениями и заброшенностью», а не ядром
Для WordPress работает не эффектная конфигурация, а операционная дисциплина «не добавлять расширений сверх меры, не оставлять их без присмотра». Плагины удобны, но каждый добавляет ответственность продолжать обновлять. Центр тяжести — проработать таблицу выше сверху вниз: автоматизируйте обновления, держите плагины минимальными и защищайтесь надёжной аутентификацией и восстановимыми резервными копиями. Выглядит специфично для WordPress, но на деле это применённый универсальный фундамент (свежесть зависимостей, минимальная публичная поверхность, аутентификация, восстановление).
Читать дальше
- Хаб: безопасность по фреймворкам · безопасность Laravel
- Практика: плейбук реагирования на уязвимости · основы резервных копий
- Секреты/аутентификация: не храните секреты в публичных каталогах · что такое 2FA · что такое фишинг
- Инструменты: проверка заголовков безопасности · поиск CVE/KEV
FAQ
QЧто сделать в первую очередь, чтобы защитить WordPress?
Три пункта P0: (1) включите автообновления для ядра, плагинов и тем, чтобы опубликованные известные уязвимости (CVE) закрывались до того, как по ним ударят; (2) удаляйте неиспользуемые плагины/темы (не просто отключайте), чтобы срезать поверхность атаки; (3) защитите учётные записи администратора надёжным паролем и двухфакторной аутентификацией (2FA) и избегайте имени пользователя admin. Эти три пункта сами по себе останавливают большинство автоматизированных атак. Далее снижайте открытость админки и настройте резервные копии.
QСколько плагинов — уже слишком много?
Правило: «только необходимый минимум». Каждый плагин расширяет поверхность атаки и добавляет «ответственность продолжать обновлять». Перед установкой проверьте частоту обновлений, распространённость, дату последнего обновления и известные уязвимости; а всё, что не используется, удаляйте, а не отключайте (файлы отключённого плагина всё ещё могут быть целью уязвимости). То же и с темами.
QСтоит ли отключать xmlrpc.php?
Если вы им не пользуетесь, ограничить или отключить его рекомендуется. xmlrpc.php обслуживает удалённую публикацию и пингбэки, но он же может стать входом для усиления перебора и потока запросов. Если вы всё же используете функции, которым он нужен (некоторые интеграции приложений), ограничьте его только нужными методами или защитите ограничением по частоте/IP. Сначала проверьте, используете ли вы его на самом деле.
QДелает ли меня безопасным плагин безопасности?
Плагин безопасности помогает, но не серебряная пуля. Прикрутить его, пока отсутствует фундамент (автообновления, минимум плагинов, надёжная аутентификация администратора, резервные копии, снижение открытости админки), — дыры не закроет. Сначала пройдите чек-лист на этой странице, а потом используйте плагин как дополнение для таких вещей, как ограничение числа попыток входа и обнаружение подмены.
QЧто абсолютный минимум?
(1) автообновления, (2) удаление неиспользуемых плагинов/тем, (3) надёжный пароль + 2FA для администраторов, (4) ограничение числа попыток входа и снижение открытости админки, (5) восстановимые офлайн-резервные копии + обнаружение подмены. Эти пять останавливают большинство автоматизированных атак. Подробности см. в чек-листе и разделах выше.