Конфигурация backend-приложений¶
Требования этого документа применяются к backend-приложениям, API,
worker-процессам, consumer-процессам и исполняемым data pipelines. Уровни
обязательности определены в корневом README.md.
BE-CONF-001. Версионируемая базовая конфигурация¶
Уровень: MUST
Применяется к: конфигурации приложения
Несекретная базовая конфигурация приложения должна задаваться машинно-читаемыми файлами со стабильной документированной структурой и храниться в репозитории проекта.
Значения, зависящие от окружения или экземпляра, не должны требовать изменения собранного артефакта.
Обоснование¶
Версионируемая базовая конфигурация делает поведение приложения воспроизводимым, а отделение окружения позволяет использовать один артефакт на всех этапах поставки.
Проверка¶
- review структуры проекта и pipeline поставки;
- проверка запуска одного артефакта с конфигурациями разных окружений;
- проверка отсутствия конфигурации, встроенной при сборке.
Исключения¶
Формат выбирает проект; несколько форматов допустимы только при однозначно определённых назначении и порядке их объединения.
BE-CONF-002. Порядок объединения источников¶
Уровень: MUST
Применяется к: загрузке конфигурации
Проект должен объявить закрытый перечень источников конфигурации и их детерминированный порядок приоритета. Изменение порядка должно быть версионируемым изменением конфигурационного контракта.
Переопределение одного параметра не должно изменять соседние параметры объекта. Порядок и список загруженных файлов должны быть детерминированы.
Секретный параметр должен заполняться из одного объявленного механизма доставки на окружение. Если значение одновременно предоставлено несколькими механизмами и приоритет явно не определён проектным контрактом, приложение должно завершить запуск с ошибкой.
Обоснование¶
Явный приоритет исключает зависимость результата от порядка обхода файлов, реализации библиотеки и способа запуска.
Проверка¶
- unit-тест каждого уровня приоритета;
- тест точечного переопределения вложенного параметра;
- тест одинакового результата при повторном запуске.
Исключения¶
Новый источник допускается после добавления в объявленный перечень и проверки его приоритета.
BE-CONF-003. Переопределение переменными окружения¶
Уровень: MUST
Применяется к: параметрам, переопределяемым переменными окружения
Каждый такой параметр должен иметь однозначное документированное соответствие имени переменной окружения и пути в базовой конфигурации. Имена должны иметь единый для приложения префикс и не зависеть от регистра ключей файла.
Значение переменной окружения должно заменять только соответствующий параметр.
Пустая строка должна отличаться от отсутствующей переменной. Способ задания
списков, объектов и значения null должен быть определён схемой конфигурации.
Обоснование¶
Однозначное отображение позволяет безопасно управлять отдельными параметрами через Docker, Kubernetes и CI/CD.
Проверка¶
- contract-тест отображения имён на пути базовой конфигурации;
- тест отсутствующего, пустого и некорректного значения;
- проверка перечня поддерживаемых переменных окружения.
Исключения¶
Не допускаются для параметров, объявленных переопределяемыми.
BE-CONF-004. Типизация и проверка при старте¶
Уровень: MUST
Применяется к: итоговой конфигурации приложения
Приложение должно до приёма запросов и запуска фоновой обработки проверить:
- наличие обязательных параметров;
- типы и допустимые диапазоны значений;
- формат адресов, длительностей и размеров;
- взаимные ограничения параметров;
- отсутствие неизвестных ключей в управляемых разделах конфигурации;
- корректность значений, полученных из переменных окружения.
При ошибке приложение должно завершить запуск с ненулевым кодом. Оно не должно молча использовать значение по умолчанию вместо явно переданного, но некорректного значения.
Обоснование¶
Fail-fast предотвращает запуск экземпляра с частично применённой или неверно истолкованной конфигурацией.
Проверка¶
- unit-тест схемы конфигурации;
- негативные тесты каждого класса ошибок;
- интеграционный тест ненулевого кода завершения.
Исключения¶
Неизвестные ключи допускаются только в явно объявленном расширяемом разделе.
BE-CONF-011. Неизвестные переменные окружения¶
Уровень: SHOULD
Применяется к: переменным окружения с объявленным префиксом приложения
Приложению следует обнаруживать неизвестные переменные со своим префиксом и сообщать о них до начала обработки. Служебные переменные среды исполнения следует либо размещать вне префикса приложения, либо включать в закрытый перечень разрешённых имён.
Обоснование¶
Проверка обнаруживает опечатки, но безусловный отказ может блокировать запуск из-за переменной, управляемой платформой или CI.
Проверка¶
- тест неизвестной переменной приложения;
- тест разрешённой служебной переменной;
- review перечня исключённых имён.
Исключения¶
Проект MAY ограничиться предупреждением, если среда не позволяет отделить служебные переменные от входов приложения.
BE-CONF-012. Динамическая конфигурация и feature flags¶
Уровень: MUST
Применяется к: конфигурации backend, изменяющей поведение запущенного процесса без поставки нового артефакта
Проект должен определить типизированную схему, владельца, источник, область и версию динамической конфигурации. Каждое изменение должно иметь автора, время и аудит-запись. Приложение должно проверять полученное значение до применения и атомарно сохранять последнюю принятую версию.
Для каждого feature flag должны быть определены безопасное исходное значение, поведение при недоступном, просроченном или некорректном источнике и способ удаления flag после завершения rollout. Изменение не должно обходить авторизацию, миграцию данных или обязательную проверку публичного контракта.
Обоснование¶
Динамическое изменение является исполняемым входом production-системы и без версии, проверки и отказного поведения создаёт невоспроизводимое состояние.
Проверка¶
- contract-тест схемы и атомарного применения версии;
- тест недоступного, просроченного и некорректного источника;
- проверка аудита изменения и удаления завершённого flag.
Исключения¶
Операционный параметр MAY применяться только после перезапуска, если это явно определено его контрактом и не создаёт частично обновлённого состояния.
BE-CONF-013. Управляемый rollout feature flag¶
Уровень: MUST
Применяется к: feature flag, постепенно включаемому для части операций, пользователей или tenant
Проект должен до rollout определить стабильный ключ распределения, этапы и доли включения, минимальный объём наблюдения, критерии продолжения, остановки и отката. Одинаковый субъект должен сохранять назначенный вариант в пределах контрактного периода; случайное перераспределение при restart запрещено.
Откат flag должен выполняться без нового application artifact и сохранять совместимость данных обеих ветвей. После завершения rollout проект должен удалить flag, неактивную ветвь, временную telemetry и конфигурацию в зафиксированный срок.
Обоснование¶
Стабильные когорты позволяют сравнивать результат, а конечный жизненный цикл не оставляет постоянно расходящиеся ветви поведения.
Проверка¶
- тест стабильности распределения между restart и экземплярами;
- controlled rollout с нарушением критерия остановки;
- тест отката после записи данных новой ветвью;
- проверка срока и diff удаления flag.
Исключения¶
Одновременное включение для всех MAY использоваться, если постепенный rollout не уменьшает область отказа и rollback остаётся проверяемым.
BE-CONF-005. Секреты вне репозитория и артефакта¶
Уровень: MUST
Применяется к: секретам и аутентификационным данным
Открытые значения секретов запрещено хранить в Git, базовой конфигурации, исходном коде, Dockerfile, container image и других артефактах сборки.
Секрет должен поступать во время выполнения через объявленный проектом механизм доставки из управляемого secret store или изолированного secret input среды исполнения. Механизм должен ограничивать доступ конкретными компонентом и окружением, поддерживать ротацию и не сохранять открытое значение в артефакте.
Зашифрованный secret resource допускается хранить в Git только тогда, когда ключ расшифрования доступен исключительно доверенному контроллеру целевой среды и открытое значение не появляется в pipeline.
Обоснование¶
Отделение секрета от кода ограничивает распространение значения и позволяет управлять доступом и ротацией независимо от сборки приложения.
Проверка¶
- secret scanning репозитория и container image;
- review manifests, Dockerfile и GitLab CI/CD;
- проверка источника каждого секретного параметра.
Исключения¶
Не допускаются.
BE-CONF-007. Минимизация доступа к секретам¶
Уровень: MUST
Применяется к: загрузке и использованию секретов
Приложение должно получать только необходимые ему секреты. Доступ secret store и среды запуска должен быть ограничен конкретным сервисом и окружением.
Секрет должен передаваться в компонент только в момент использования и не должен сохраняться в глобальном диагностическом контексте, сообщениях ошибок, метриках или трассировке. После загрузки приложение не должно записывать открытое значение на диск.
Обоснование¶
Минимальные привилегии и область видимости уменьшают последствия компрометации экземпляра или ошибочного диагностического вывода.
Проверка¶
- review политик secret store и среды исполнения;
- review области видимости секретов в приложении;
- тест отсутствия секрета в телеметрии и временных файлах.
Исключения¶
Кэширование в памяти допускается в пределах процесса, если этого требует клиент секретного хранилища или внешней системы.
BE-CONF-008. Безопасная диагностика загруженной конфигурации¶
Уровень: SHOULD
Применяется к: диагностике результата загрузки конфигурации
После успешной проверки конфигурации приложению следует один раз записать
структурированное событие configuration.loaded. Событие должно позволять
определить версию или fingerprint конфигурации и использованные типы источников
без записи открытых значений секретов.
Вывод значений параметров допускается только на уровне DEBUG, по явному
allowlist несекретных полей и с ограничением размера. Полный dump конфигурации,
environment или неизвестного раздела запрещён. Событие должно соответствовать
OBS-LOG-001, OBS-LOG-003 и OBS-LOG-006.
Обоснование¶
Fingerprint и перечень источников позволяют сопоставить экземпляры и переопределения, не создавая вторую копию всех значений конфигурации в логах.
Проверка¶
- интеграционный тест старта с несколькими источниками;
- проверка fingerprint, перечня источников и ограничения размера;
- controlled secret scanning события;
- тест запрета полного dump неизвестного раздела.
Исключения¶
Событие MAY отсутствовать, если среда поставки предоставляет эквивалентное проверяемое сопоставление экземпляра с версией конфигурации.
BE-CONF-010. Сообщения об ошибках конфигурации¶
Уровень: MUST
Применяется к: ошибкам загрузки и проверки конфигурации
Сообщение должно идентифицировать источник, путь параметра и причину ошибки, но не должно содержать открытое значение секретного параметра. Для секретного параметра допустимы только факт отсутствия, тип источника и замаскированное значение.
Ошибка загрузки конфигурации не должна приводить к выводу environment, исходного файла или итоговой конфигурации.
Обоснование¶
Ошибочный старт является наиболее вероятным моментом небезопасного вывода непроверенной конфигурации.
Проверка¶
- негативные тесты отсутствующего и некорректного секрета;
- проверка
stdoutиstderrпроцесса; - controlled secret scanning сообщений об ошибках.
Исключения¶
Не допускаются.