3

WebTech

Личный кабинет

Проекты, коммерческие предложения, документы и отчёты — в одном месте.

Войти Зарегистрироваться Забыли пароль?
Обновления и патчи безопасности

Обновляемся по расписанию а не после инцидента

Ведём учёт зависимостей, отслеживаем уязвимости и обновляем продукт небольшими шагами. Каждое обновление проходит проверку на стенде, а неудачная выкатка откатывается к предыдущей версии за минуты.

Или сразу: +7 (962) 368-39-51 Telegram

CVE
мониторинг уязвимостей зависимостей
2 недели
обычный цикл плановых обновлений
стенд
регрессия до попадания в прод
15 мин
откат к предыдущему релизу
Задачи

Чем обходятся отложенные обновления

Пока обновления делаются регулярно, это рутина на пару часов. Когда их откладывают год, это уже отдельный проект с непредсказуемым результатом.

Обновление превращается в проект

Пропущено пять мажорных версий фреймворка: теперь нельзя поднять одну библиотеку, не переписав половину интеграций. Работа растягивается на месяцы.

Уязвимость закрыта вендором, но не у вас

Патч для опубликованной уязвимости вышел неделю назад, а в вашем окружении остаётся старая версия. Автоматические сканеры находят такие цели в первые дни.

Обновление ломает непокрытый тестами сценарий

После обновления библиотеки перестаёт работать выгрузка в бухгалтерию: этот сценарий проверяли руками раз в квартал и покрытия в тестах у него нет.

Версия языка устарела настолько, что пакеты несовместимы

Старая версия PHP больше не поддерживается вендором и не получает исправлений безопасности, а нужные библиотеки требуют более новую.

Нет стенда, где обновление можно проверить

Тестировать приходится сразу на продакшене, потому что тестовый контур разошёлся с боевым на год и воспроизводит другие данные и настройки.

Изменения окружения никто не помнит

Конфигурации правились руками на сервере, часть параметров отличается между стендом и продом, и восстановить исходное состояние уже невозможно.

Решения

Как построен процесс обновлений

Обновления мы рассматриваем как регулярную операцию с предсказуемым риском, а не как разовую кампанию.

Учёт и мониторинг уязвимостей

Мы знаем полный состав зависимостей продукта — включая транзитивные, о которых обычно никто не помнит.

  • Аудит зависимостей PHP, JavaScript и системных пакетов
  • Сопоставление версий с базами уязвимостей и оценка эксплуатируемости
  • Отдельная проверка библиотек, работающих с платежами, файлами и шифрованием
  • Уведомление о критичных находках сразу, без ожидания планового цикла

Плановые обновления

Обновляемся небольшими порциями: так проще найти причину, если что-то пошло не так.

  • Патчи безопасности и минорные версии — раз в две недели
  • Мажорные версии фреймворка и языка — отдельным планом, раз в год
  • Обновление базовых образов контейнеров и системных пакетов
  • Ведение журнала изменений окружения, а не правки руками на сервере

Проверка до продакшена

Каждое обновление сначала проверяется на контуре, повторяющем боевую конфигурацию.

  • Автотесты на критичные сценарии: вход, оплата, оформление, обмен данными
  • Ручная проверка сценариев, которые тестами не покрыты
  • Проверка миграций базы на копии боевых данных
  • Оценка влияния на производительность до и после обновления

Выкатка и откат

Обновление должно быть обратимым: если что-то ломается, мы возвращаемся к рабочей версии, а не чиним в спешке.

  • Выкатка в согласованное окно с минимальным трафиком
  • Сохранение предыдущего релиза для мгновенного возврата
  • Откат приложения и схемы базы данных за 15 минут
  • Проверка ключевых сценариев сразу после выкатки
Процесс

Порядок работ по обновлениям

Логика одинакова и для одного патча, и для мажорного обновления фреймворка — меняется только масштаб.

  1. 01 3–5 дней

    Инвентаризация зависимостей

    Собираем полный список пакетов и версий, отмечаем устаревшие и содержащие известные уязвимости, оцениваем объём работы.

  2. 02 1–3 недели

    Проверка на стенде

    Обновляем на тестовом контуре, прогоняем автотесты и ручные сценарии, проверяем миграции и производительность.

  3. 03 1 день

    Выкатка в продакшен

    Выкладываем в согласованное окно, следим за метриками и журналами, проверяем критичные сценарии и держим готовый откат.

  4. 04 постоянно

    Регулярный цикл

    Возвращаемся к плановым патчам раз в две недели и не даём долгу накопиться снова. Раз в квартал — сводка по составу зависимостей.

Как понять, что обновления назрели

Есть несколько однозначных признаков. Первый — версия фреймворка или языка больше не поддерживается вендором и не получает исправлений безопасности. Второй — аудит зависимостей показывает пакеты с известными уязвимостями, для которых уже есть исправленные версии. Третий — новая функциональность требует библиотеки, несовместимой с текущими версиями, и разработка начинает обходить ограничения вместо решения задачи.

Отдельный сигнал — страх. Если команда боится обновлять пакеты, потому что «после прошлого раза два дня ловили ошибки», значит отсутствует не смелость, а стенд, автотесты и процедура отката. С них и нужно начинать, а не с самого обновления.

Почему нельзя обновляться «по одной библиотеке»

Соблазн закрыть только тот пакет, по которому пришло уведомление об уязвимости, понятен, но опасен. Пакеты связаны между собой требованиями к версиям: обновление одной библиотеки может потребовать более новую версию фреймворка, а та — новую версию языка. Попытка точечного вмешательства приводит к состоянию, когда менеджер зависимостей не может собрать рабочую комбинацию.

Правильный подход — обновлять согласованными наборами и проверять результат целиком на стенде. Так же решается и проблема транзитивных зависимостей: уязвимость может находиться не в том пакете, который вы указали напрямую, а в его внутренней зависимости.

Что делать с регрессией, если автотестов почти нет

Отсутствие покрытия — не повод откладывать обновления, но повод изменить порядок работ. Сначала мы описываем критичные сценарии в виде чек-листа: вход, оформление заказа, оплата, выгрузка документов, обмен с внешними системами. Затем эти сценарии проходятся вручную на стенде при каждом обновлении, а по мере возможности заменяются автоматическими тестами.

Параллельно мы фиксируем дефекты, найденные в ходе таких проверок, и постепенно превращаем самые дорогие сценарии в набор тестов. Через несколько циклов обновление перестаёт быть событием с ручным контролем и становится технической операцией.

Частые вопросы

Патчи безопасности и минорные версии — раз в две недели, критичные уязвимости закрываем вне очереди, в течение одного-двух рабочих дней после выхода исправления. Мажорные обновления фреймворка и версии языка планируем отдельным проектом раз в год. Такой ритм не даёт техническому долгу накопиться до состояния, когда обновление становится опасным.

Мы держим предыдущий релиз готовым к возврату, поэтому откат приложения занимает около пятнадцати минут. Если обновление затрагивало схему базы данных, план отката согласуется заранее: миграции пишутся так, чтобы новая схема была совместима с предыдущей версией кода. Каждый такой случай разбирается, и сценарий, который не был покрыт проверкой, добавляется в чек-лист.

Для регулярных обновлений — да, иначе проверка превращается в риск для боевой системы. Стенд не обязан быть копией продакшена по мощности, но должен повторять версии окружения, состав сервисов и структуру данных. Если поднять полноценный стенд невозможно, мы используем временный контур на копии базы, который создаётся на время проверки и удаляется после выкатки.

Да, сборка фронтенда — такая же часть продукта, и устаревшие библиотеки в ней дают те же проблемы: известные уязвимости, несовместимость с новыми браузерами, рост размера бандла. Мы обновляем зависимости сборки вместе с остальными, проверяя после этого критичные страницы и сценарии на реальных устройствах, поскольку именно клиентская часть чаще всего ломается незаметно для автотестов.

Поддержка и обслуживание: другие направления

Смежные задачи, которые обычно решаются в одном проекте с этой.

Приведём зависимости продукта в порядок

Пришлите файл зависимостей и версию окружения — оценим объём обновления и риски, назовём сроки.