Аудит исходного кода перед доработкой: что проверить и как принять отчёт
Аудит исходного кода перед доработкой: сборка, архитектура, данные, безопасность, доказательства рисков и приёмка отчёта. План для владельца продукта.
Аудит исходного кода нужен перед доработкой продукта, если компания не понимает, насколько безопасно менять существующую систему. Его результат — проверяемая карта рисков и план действий: что можно развивать сейчас, какие препятствия убрать сначала и на каких данных строить оценку. Репозиторий сам по себе ещё не доказывает, что продукт можно собрать, выпустить и поддерживать. Этот разбор адресован владельцу продукта, руководителю разработки и заказчику, который принимает проект от прежней команды. Здесь рассматриваем техническое состояние уже работающего сервиса. Ежедневное ревью отдельных изменений — отдельный процесс; аудит охватывает систему, окружение, данные и эксплуатацию. Примеры ниже учебные: они показывают способ принятия решения, а не результаты клиентских проектов. Что такое аудит исходного кода и какой вопрос он решает Аудит исходного кода — обследование программного продукта, при котором команда проверяет воспроизводимость сборки, устройство системы, критические сценарии, зависимости и условия сопровождения. Выводы привязываются к конкретной версии и подтверждениям. Для бизнеса полезен отчёт, позволяющий выбрать следующий шаг, а не абстрактная оценка «качества кода». Начните с решения, ради которого проводится обследование. Компания может готовить передачу разработки, запускать новый канал продаж, подключать интеграцию или принимать продукт после длительной паузы. У этих ситуаций разные приоритеты. Перед интеграцией важно понять границы данных и обработку повторных событий; перед сменой подрядчика — владение инфраструктурой, возможность сборки и выпуска. Одно универсальное число не заменяет эти ответы. Хорошая постановка задачи звучит предметно: «Можно ли добавить дилерский кабинет без остановки текущих заказов? Какие изменения нужны для этого?» Слабая постановка — «Посмотрите, всё ли нормально». Во втором случае легко получить большой список замечаний к стилю, который никак не помогает оценить ближайший релиз. Сначала запишите бизнес-сценарий, затем выберите модули и глубину проверки. Когда обследование оправдано Аудит оправдан, когда неопределённость мешает принять техническое или управленческое решение. Признаки: новый разработчик не может запустить проект по инструкции; оценка каждой функции меняется после начала работ; сбой исправляется только прямой правкой сервера; доступы сосредоточены у одного человека; заказ нельзя проследить от интерфейса до учётной системы. Эти симптомы требуют проверки причин, а не автоматического переписывания продукта. Перед передачей проекта. Нужно убедиться, что получены репозиторий, настройки окружения, схема выпуска и права на внешние сервисы. Перед большой доработкой. Проверяется, выдержит ли существующая архитектура новый сценарий и как проверить отсутствие регрессий. После повторяющихся инцидентов. Разбирается цепочка отказа: приложение, база, очередь, интеграция, мониторинг и действия команды. При остановке поддержки стека. Выясняется, какие обновления обязательны и какие изменения они затронут. Перед приёмкой результата. Проверяется выполнение согласованных требований и возможность дальнейшего сопровождения. Если задача ограничена небольшим визуальным изменением, полный аудит может оказаться избыточным. Достаточно проверить затронутый компонент, сборку и зависимые сценарии. Если же сервис принимает платежи, хранит клиентские данные или управляет заказами, даже локальная доработка требует понимания границ ответственности. Масштаб обследования определяется последствиями ошибки и неизвестными частями системы, а не количеством файлов. Аудит, код-ревью, тестирование и пентест: разные результаты Эти работы дополняют друг друга. Код-ревью помогает оценить конкретное изменение до его включения в продукт. Функциональное тестирование проверяет поведение сценариев. Пентест исследует возможность эксплуатации уязвимостей в согласованных границах. Технический аудит связывает устройство продукта с условиями его развития, но не может автоматически заменить каждую специализированную проверку. Работа Основной объект Полезный результат Код-ревью Изменение или набор изменений Замечания к реализации до включения в основную ветку Функциональное тестирование Пользовательские и интеграционные сценарии Подтверждение поведения и воспроизводимые дефекты Пентест Согласованная поверхность атаки Подтверждённые способы воздействия и рекомендации по защите Технический аудит Код, архитектура, сборка и эксплуатация Карта рисков, ограничения и план развития продукта Для повседневной работы команды полезен отдельный материал о код-ревью . При подготовке аудита укажите, какие виды проверки входят в объём, а какие потребуют отдельной работы. Формулировка «проверили безопасность» без описания метода, доступа и границ не даёт основания считать продукт защищённым. Что подготовить до начала проверки Подготовьте доступы и контекст, позволяющие воспроизвести продукт без риска для рабочей среды. Нужны репозиторий с историей, инструкции запуска, перечень сервисов, схема окружений и список критических сценариев. Для работы с данными используйте согласованный тестовый набор: реальные клиентские выгрузки не должны становиться стандартным способом объяснить структуру базы. Отдельно опишите, какая версия обслуживает пользователей. Ветка разработки, последний тег и код на сервере иногда расходятся. Аудитор должен знать, что именно он проверяет: идентификатор коммита, версию контейнера, состояние миграций, конфигурацию окружения. Без этой привязки исправление найденной проблемы может попасть в ветку, которая вообще не участвует в выпуске. Список репозиториев и владельцев, включая мобильный клиент, серверную часть, инфраструктурные конфигурации и внутренние библиотеки. Инструкция сборки с версиями инструментов и шаблоном переменных окружения без секретов. Схема данных, миграции и правила создания тестового окружения. Перечень внешних API, платежей, рассылок и учётных систем с ответственными за каждый контракт. Известные инциденты, ограничения и планы доработки. Критерии приёмки и перечень сценариев, которые нельзя нарушить. Права выдаются по необходимости. Обследование не требует автоматически предоставлять возможность удалять рабочие данные, изменять DNS или публиковать релизы. Начните с чтения и тестового окружения; дополнительные действия согласуйте отдельно. Если часть доступов отсутствует, это должно появиться в отчёте как ограничение проверки, а не раствориться в общем выводе. Первый этап: воспроизвести сборку и запуск Первое полезное доказательство — продукт собирается из переданного исходного кода в описанном окружении. Проверяется установка зависимостей, компиляция, подготовка базы, запуск фоновых обработчиков и прохождение базового сценария. Запуск на ноутбуке прежнего разработчика недостаточен: там могут оставаться незафиксированные настройки, локальные пакеты и старые секреты. В отчёте фиксируют команды, версии инструментов и место, где возникло препятствие. Например, зависимость скачивается из закрытого реестра, а доступ к нему принадлежит бывшему сотруднику. Это не замечание к красоте архитектуры, а прямой риск сопровождения. Решение включает перенос владения, проверку лицензий и воспроизводимый способ получения пакета. После локального запуска проверьте путь до релиза. Какие проверки обязательны? Где собирается артефакт? Как отличить тестовую конфигурацию от рабочей? Кто подтверждает выпуск? Как возвращается предыдущая версия? Аудит не обязан выпускать новую версию, но должен показать, может ли команда сделать это управляемо. Ручная загрузка неизвестного архива на сервер не подтверждает воспроизводимость. Отдельный пункт — секреты. В репозитории должен быть образец конфигурации, а рабочие ключи должны передаваться через предназначенное для этого хранилище. Если секрет найден в истории, простого удаления строки из последнего коммита мало: владелец оценивает необходимость его замены и проверяет круг доступа. В публичном отчёте сами значения не приводятся. Второй этап: описать архитектуру через бизнес-сценарии Архитектуру полезнее разбирать по движению данных, чем по красивой схеме сервисов. Выберите критический сценарий и проследите его целиком: действие пользователя, серверная проверка, запись, очередь, внешний вызов, подтверждение и отображение результата. На каждом переходе выясните, кто отвечает за состояние и что происходит при ошибке. Учебный пример — покупатель оформляет заказ, оплачивает его, а менеджер видит результат в учётной системе. Проверка должна ответить, когда заказ считается созданным, как связывается платёж с заказом и что происходит при повторном уведомлении. Если интерфейс показывает успех до подтверждения сохранения, проблема лежит на границе сценария. Перенос файлов между папками не исправит её. Не требуйте микросервисы как обязательный признак зрелости. Для конкретного продукта модульный монолит может быть удобнее распределённой системы. Вопрос в том, можно ли локализовать изменение, проверить контракт и отследить отказ. Сложность оправдывается потребностями продукта и команды. В отчёте полезна причинная связь: «Общий обработчик смешивает расчёт цены и отправку писем, поэтому сбой рассылки блокирует заказ». Проверьте зависимость от одного специалиста. Если бизнес-правила существуют только в устных объяснениях, это препятствие для развития даже при аккуратном коде. Зафиксируйте правила рядом с моделями и тестами: кто может менять статус, какой переход запрещён, чем отличаются отмена и возврат. Такая документация уменьшает неопределённость следующей доработки. Третий этап: проверить данные и миграции Данные требуют отдельного внимания, потому что ошибки здесь переживают выпуск исправленного кода. Проверьте схему, ограничения, миграции, транзакционные границы и восстановление. Аудитор должен понять, какие сущности являются источниками истины и как система сохраняет согласованность при параллельной работе пользователей и фоновых задач. Типичный вопрос: можно ли провести одну операцию дважды? Ответ ищут не только в кнопке интерфейса, но и на сервере. Повтор может возникнуть после сетевого сбоя, перезапуска обработчика или повторной доставки события. Для операции создания заказа нужен устойчивый идентификатор и явно выбранное поведение при дубле. Если защита существует только на клиенте, другой путь вызова может её обойти. Миграции проверяют на тестовой копии с подходящей структурой и объёмом. Изменение поля способно блокировать таблицу или нарушить чтение старой версией приложения; безопасная последовательность зависит от базы и конкретной операции. Попросите команду описать совместимость перехода: новый код со старой схемой, старый код с новой схемой, откат приложения после миграции. Резервная копия становится доказательством только после проверенного восстановления. Полезный результат проверки — известны место хранения, права доступа, периодичность, порядок восстановления и ответственный. Запись «бэкапы настроены» без попытки восстановить тестовую среду оставляет важный вопрос открытым. В отчёте указывайте, что действительно проверено, а что сообщено владельцем инфраструктуры. Четвёртый этап: исследовать зависимости и безопасность Проверка зависимостей помогает увидеть устаревшие пакеты, известные уязвимости и ограничения обновления. Автоматический сканер даёт список сигналов, но требует интерпретации: затронут ли используемый путь, доступен ли он внешнему пользователю и существует ли совместимое исправление. Количество предупреждений само по себе не отражает риск продукта. Ручная проверка фокусируется на границах доверия: аутентификация, права доступа, загрузка файлов, обработка внешних данных, секреты и журналирование. Например, пользователь может иметь доступ к своему заказу, но не к заказу другого клиента. Нужно проверить серверную авторизацию по объекту, а не только отсутствие ссылки в меню. Для таких проверок применяются согласованные тестовые аккаунты. В NIST SSDF 1.1 безопасная разработка описана как набор практик, которые включаются в жизненный цикл продукта. Это полезная рамка для обсуждения процессов с поставщиком. Сам факт о
Автор: Арнак Меликян, CTO, 404gen.
404gen — креативное digital-агентство полного цикла, работаем удалённо по всей России.
Телефон: +7 993 729-59-59 (пн–пт, 10:00–19:00 МСК). WhatsApp: +7 913 141-20-96. Telegram: @aporkulevich. Почта: ap@404gen.ru.