Культура и госсектор
Молодёжный театр на Фонтанке
Публичный сайт Санкт-Петербургского государственного Молодёжного театра на Фонтанке, репертуарного театра в Измайловском саду, чей зритель выбирает вечер с телефона. Это была не работа над дизайном: сайт достался нам как EOL-установка WordPress на пиратских коммерческих плагинах с двумя действующими бэкдорами.
Что мы обнаружили
WordPress 5.5.17 на PHP 7.4, на годы позже конца поддержки, причём правки вносились прямо на боевом сервере. В теме жил инжектор ссылок, обращавшийся к стороннему домену, а в одном из вендоренных плагинов был спрятан создатель админ-аккаунта с зашитым паролем. xmlrpc.php не использовался и находился под постоянным брутфорсом: около 13 000 POST-запросов в логах.
Снятие пиратских компонентов
Каждый пиратский компонент был заменён чистым источником, а не пропатчен: ACF Pro уступил место Secure Custom Fields, форку с WordPress.org, который читает те же данные полей через тот же API, а Slider Revolution заменил небольшой собственный shim. Оба бэкдора удалены, заражённый контейнер остановлен, а изменение файлов отключено на уровне конфигурации, чтобы ничего нельзя было вернуть через wp-admin.
Перенос стека
Стек переведён на WordPress 6.9 / PHP 8.2 / MySQL 8: сначала в dev-окружении, затем на проде в плановом переключении. Ядро WordPress больше не хранится в репозитории: оно зафиксировано и запекается в Docker-образ, поэтому работающий контейнер доступен только на чтение, а любое изменение, включая обновления плагинов, проходит через git.
Конвейер доставки
Однобранчевый GitLab CI/CD: пуш в main автоматически выкатывается на dev, а прод получает тот же образ в одно нажатие. Пограничный Traefik v3 терминирует TLS через Let’s Encrypt для обоих окружений, которые работают изолированными Docker-стеками поверх общей MySQL. После каждого деплоя и каждой пересидки выполняется шаг сверки: база несёт состояние, которого нет в образе.
Масштаб
CMS ведут нетехнические русскоязычные редакторы; в ней 2 869 показов, 146 постановок, 93 артиста, 101 создатель и 880 новостей примерно с 1 455 вложениями. Билеты продаются через провайдера «Билетёр», встроенного под собственной шапкой театра.
Ключевые особенности
- Удалены два действующих бэкдора: инжектор ссылок в теме и создатель админа с зашитым паролем
- Пиратские плагины заменены, а не пропатчены: чистые open-source аналоги на тех же API
- с 5.5.17 на PHP 7.4 до 6.9 на PHP 8.2: отрепетировано в dev, затем плановое переключение прода
- Неизменяемые деплои: ядро в образе, контейнер только на чтение, никаких правок на сервере
- Прод в одно нажатие: dev катится на каждый пуш, прод промоутит тот же образ
- Закрыт xmlrpc.php: неиспользуемая точка входа, тянувшая постоянный брутфорс
- Хостинг на российской инфраструктуре: требование закона о персональных данных, не предпочтение