Skip to content

Security: f2re/docomator

Security

SECURITY.md

Политика безопасности

Статус выпуска: candidate

Канал выпуска: pilot

Текущая версия: 0.4.0.

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

Граница доверия

Оформлятор работает в общем доверенном корпоративном контуре. В соответствии с ADR-0009 приложение требует один общий пароль входа, но не реализует учётные записи, персональные кабинеты, роли или разграничение прав. После успешного входа любой клиент имеет одинаковые возможности работы со всеми пространствами, данными, шаблонами, расписаниями, результатами и административным экспортом.

Начиная с 0.4.0 действует одно узкое исключение, зафиксированное ADR-0010: страница /gost и её stateless API анализа/форматирования DOCX доступны без общего пароля. Этот контур не принимает spaceId, не читает и не пишет SQLite/object store, не имеет доступа к публикациям, шаблонам, сотрудникам и результатам, не использует LLM/LibreOffice/внешнюю сеть и не сохраняет загруженный документ. Расширять публичный allowlist на сохраняемые данные без отдельного ADR запрещено.

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

Поэтому при развёртывании обязательно:

  • не публиковать основной API и веб-интерфейс в Интернет;
  • если /gost доступен шире доверенной сети, дополнительно ограничить его reverse proxy/firewall и учитывать CPU/размерные лимиты;
  • ограничивать доступ к основной рабочей области средствами межсетевого экрана, отдельного сегмента сети, обратного прокси, взаимной проверки сертификатов или эквивалентного внешнего механизма;
  • на новой установке задать общий пароль до предоставления сетевого доступа к основной рабочей области;
  • хранить только scrypt-хэш пароля и отдельный случайный session secret в /etc/docomator/docomator.env с ограниченными системными правами;
  • использовать HTTPS на reverse proxy при доступе не только с localhost, чтобы браузерная session cookie передавалась по защищённому каналу;
  • не считать общий пароль идентификацией пользователя, а заголовок x-actor-id — подтверждением личности: это только непроверенная метка для журнала;
  • предоставлять административный просмотр и экспорт базы только рабочим местам, которым разрешён полный доступ к общим данным;
  • хранить каталог данных, конфигурацию и резервные копии с минимально необходимыми системными правами.

Смена общего пароля должна выполняться локально на сервере. Пароль не передаётся через query string, не записывается в журнал и не входит в автономный комплект. Сессия браузера хранится в подписанной HttpOnly, SameSite=Strict cookie с ограниченным сроком жизни. Для немедленного завершения всех ранее выданных сессий оператор меняет session secret либо использует штатную процедуру, которая его ротирует.

Пространства остаются жёсткими границами пользовательских данных, но не прав доступа. Password gate и публичный /gost не должны ослаблять проверку spaceId, DB triggers и отрицательные межпространственные тесты.

Добавление пользователей, персональной идентификации, ролей или ACL допускается только через новый ADR, обновление требований и отдельную модель угроз.

Сообщение об уязвимости

Не публикуйте секреты, персональные данные, рабочие документы и резервные копии в открытых issue или pull request. Используйте приватный канал владельца репозитория либо закрытое сообщение об уязвимости GitHub, когда оно включено.

В сообщении укажите:

  • затронутую версию и полный commit;
  • условия воспроизведения;
  • ожидаемое и фактическое поведение;
  • минимальный безопасный пример;
  • возможные последствия;
  • предложенное временное ограничение.

Приоритетные классы риска

  • обход password gate и получение доступа к сохраняемым данным через публичный /gost;
  • сохранение, журналирование или межпользовательская выдача документа, отправленного в публичный /gost;
  • CPU/архивный DoS публичного formatter;
  • обход password gate или внешнего периметра и получение полного доступа к общим данным;
  • перебор общего пароля, утечка password hash/session secret или фиксация сессии;
  • подмена непроверенной метки инициатора и недостоверный журнал действий;
  • межсайтовый запрос, повторное использование доверенной браузерной сессии или привязка имени к подменённому узлу;
  • обход ограничения путей или запись вне разрешённого каталога;
  • архивная бомба, опасный XML и небезопасные связи OOXML;
  • внедрение инструкций в документ, приводящее локальную модель к внешнему действию;
  • утечка SMTP-реквизитов, ограниченных свойств, резервных копий или экспортов базы;
  • CSV/Excel formula injection в пользовательском экспорте;
  • повторная автоматическая доставка или повторный выпуск при восстановлении задания;
  • изменение неизменяемого шаблона, результата, миграции или метаданных выпуска;
  • повышение привилегий через LibreOffice, llama-server или системные службы;
  • отключение сетевого подключения с ошибочной записью в локальный каталог точки монтирования;
  • чрезмерно широкие права GitHub Actions или сохранённая одноразовая автоматика изменения веток;
  • неправильные права файловой системы на базу, объектное хранилище, конфигурацию и копии.

Безопасная разработка

  • локальная модель не получает инструменты оболочки, SQL, SMTP, файловой системы или прямого изменения OOXML;
  • публичный formatter не получает LLM, shell, SQL, filesystem path, space context или внешние действия;
  • секреты, рабочие документы и реальные персональные данные не добавляются в репозиторий и тестовые материалы;
  • пароли, password hashes, session secrets и cookies не журналируются;
  • сравнение пароля выполняется через параметризованный scrypt и constant-time сравнение производного ключа;
  • повторные неуспешные попытки входа ограничиваются локальным backoff без внешнего сервиса;
  • экспорт электронных таблиц нейтрализует значения, которые Excel/Calc могли бы интерпретировать как формулы;
  • установка, обновление, проверка и откат на целевой машине не используют сеть;
  • каталоги релиза доступны только для чтения, каталог данных — только необходимым службам;
  • зависимости фиксируются lock-файлом и проверяются в автономном комплекте;
  • применённые миграции и активированные версии шаблонов не изменяются;
  • внешнее действие имеет идентификатор операции, ключ идемпотентности и отрицательные проверки повторов;
  • workflow с правом записи разрешается только для явно утверждённой узкой задачи и проверяется автоматически;
  • изменение границы безопасности требует ADR, обновления требований, отрицательных тестов и описания отката.

There aren't any published security advisories