ZemBo Щит
Свой плагин защиты WordPress: сорок модулей, файрвол запросов, сканеры файлов и уязвимостей, вход по QR через своё приложение. Без подписок и чужого облака.
Замысел, разработка и поддержка
Зачем свой
Готовые «щиты» для WordPress устроены одинаково: годовая подписка, тяжёлый сканер на каждой странице и облако, которому надо доверять свои журналы. Нам нужна была защита, которая не стоит подписки, не тормозит сайт и целиком остаётся на сервере клиента.
ZemBo Щит — сорок отдельных модулей, каждый включается галочкой. Ставим его на все сайты, которые ведём: и на свои, и на клиентские.
Что он делает
Закрывает лишние двери
- отключает XML-RPC, пароли приложений и публичный список пользователей — три обычных входа для перебора;
- прячет версию ядра, убирает подсказки о начинке сайта и запрещает выполнение PHP в папке загрузок;
- ставит безопасные HTTP-заголовки, запрещает редактор файлов в админке и закрывает системные файлы;
- ограничивает попытки входа и блокирует адрес, с которого их слишком много.
Смотрит за файлами и версиями
- сканер вредоносного кода: сравнивает файлы с эталоном, показывает подозрительный фрагмент вместе с соседними строками и даёт увести файл в карантин;
- слежение за файлами плагинов — любое изменение против эталона видно в журнале;
- ежедневная сверка версий плагинов и тем с базой известных уязвимостей: если для установленной версии есть CVE, это видно до того, как ей воспользуются;
- проверка заброшенных плагинов — тех, что закрыты или давно не обновлялись.
Разбирает запросы
- файрвол запросов: разбирает GET, POST и cookie на признаки внедрения кода и запросов к базе; сначала можно включить режим «только записывать в журнал» и убедиться, что ловит атаки, а не посетителей;
- обновляемые правила: если для чужого плагина вышла уязвимость, а обновления ещё нет, дыру закрывают правилом — без правки чужого кода;
- ограничение частоты обращений к служебным адресам сайта, чтобы подбор паролей не шёл в обход обычной формы входа;
- автоматическая блокировка тех, кто перебирает несуществующие адреса, — так работают сканеры уязвимостей.
Вход
- двухфакторный вход по одноразовому коду;
- вход по QR-коду через наше приложение для Android: телефон показывает шестизначный код, его вводят на сайте — так же сделан вход во ВКонтакте. Никаких СМС: код рождается в приложении и никуда не передаётся. Так подтверждение нельзя «подсунуть» человеку со стороннего сайта;
- журнал действий администратора: активация плагинов, смена ролей, сброс паролей, правка настроек;
- срок сессии администратора задаётся числом и может отсчитываться от последнего действия, а не от входа.
Проверяет базу
- ищет администраторов, которых нет в списке пользователей, — так прячется взломщик;
- замечает подмену адреса сайта и почты администратора, опасно открытую регистрацию, код в автозагружаемых настройках и в записях;
- ничего не удаляет: только показывает и, если нужно, шлёт письмо или сообщение в мессенджер.
Что это дало
- защита стоит на всех сайтах, которые мы ведём, без единой подписки;
- журналы и карантин остаются на сервере сайта — ничего не уходит в чужое облако;
- QR-код и ключи двухфакторного входа рисуются на самом сервере: раньше картинку рисовал сторонний сервис, и в него уезжали данные входа — это нашли и закрыли;
- сканер уязвимостей нашёл на клиентских сайтах уязвимые версии покупных тем и плагинов, у которых обновление доступно только по лицензии; дыры закрыли правилами файрвола, не трогая чужой код.
Как мы его проверяем
Щит несколько раз проходил сплошной разбор кода — в том числе тремя разными системами ИИ параллельно, с очной сверкой их выводов. Ни одна не нашла способа войти без пароля, но нашлось другое, и всё это исправлено: одноразовый код можно было использовать второй раз в соседнем окне времени; подтверждение входа не было привязано к тому браузеру, который его запросил; «доверенное устройство» жило месяц и не отзывалось при смене пароля.
Мы считаем такой разбор обязательным. Плагин, который защищает вход, обязан сам выдерживать проверку — и мы можем её провести, потому что это наш код.
Как это выглядит