Skip to content

Security: yellow444/epgu

Security

docs/security.md

Безопасность

Криптографические операции

Операция Инструмент Примечание
Хранение закрытого ключа КриптоПро CSP, контейнер xxx.000 Монтируется в /var/opt/cprocsp/keys/app/
Подпись api_key для ЕСИА pycades.Signer + CADESCOM_CADES_BES, detached base64 -> urlsafe base64
Метка времени TSA TSAAddress CAdES-T при необходимости
Валидация XML lxml.XMLSchema по piev_epgu.xsd Только для /push/chunked
TLS к ЕПГУ httpx, CA из test_ca_rtk3.cer (тест) В проде - корневые ФСБ/Минцифры

JWT (accessTkn ЕСИА)

  • Получается в обмен на подпись API-key.
  • Хранится в глобальной переменной процесса (ACCESS_TKN_ESIA).
  • Используется как Authorization: Bearer ... для всех вызовов svcdev_host.
  • Срок действия (exp) парсится без верификации подписи (_decode_jwt_exp) и возвращается клиенту вместе с токеном, а также доступен через GET /version (поле runtime.access_tkn_exp).
  • На фронтенде декодируется только для отображения exp (никакой верификации - JWT подписывает ЕСИА).

Угрозы и меры

Угроза Оценка Меры
Утечка KeyPin через env высокая Использовать Docker secrets / Vault в prod
Утечка приватного ключа (volume) высокая Шифровать том, ограничить FS-права, не коммитить xxx.000
CSRF на backend средняя CORS управляется env ALLOWED_ORIGINS (см. .env.example); в prod указать конкретный домен фронта, дополнительно - CSRF-токен при необходимости
MITM к ЕПГУ низкая Только HTTPS + корневой CA
Повторная подача/replay средняя ЕПГУ отвечает дедупликацией по orderId; на стороне системы - идемпотентные ключи
Отсутствие аудита средняя Логировать все операции подписания с указанием пользователя/ключа
XXE / billion laughs средняя lxml.etree.fromstring без отключения внешних сущностей - рассмотреть XMLParser(resolve_entities=False)
Логирование PII средняя Не логировать тело заявления/PII в prod; маскировать

Реализовано в коде (2026-05)

  • Безопасный парсер XML: XMLParser(resolve_entities=False, no_network=True, huge_tree=False) в validate_xml_content (см. app.py).
  • Парсинг exp JWT: _decode_jwt_exp -> возвращается клиенту и через /version.
  • CORS через env ALLOWED_ORIGINS (список доменов через запятую или *).
  • Разделение certs/public/ (в git) и certs/personal/ (gitignored).

Дальнейшие рекомендации

  • Перенести глобальное состояние в защищённое хранилище (Redis с TTL на токен).
  • Авто-обновление токена при приближении exp (сейчас обновление инициирует клиент).
  • Аудит операций подписания (кто, когда, какой сертификат, хэш данных).
  • KeyPin - через Docker secrets / Vault вместо env.

Сертификаты CA

  • В backend-образ устанавливается test_ca_rtk3.cer (certenroll.test.gosuslugi.ru).
  • Для прод-контура заменить на действующие корневые сертификаты Минцифры / ФСБ (ГОСТ TLS) - публикуются в составе дистрибутива КриптоПро и в реестре доверенных корневых ЦА.
  • Все публичные CA должны лежать в api-gosuslugi-backend/certs/public/ (видны в репозитории), личные ключи и сертификаты - в certs/personal/ (gitignored).

Регламентные требования к ИС перед прод-эксплуатацией

Сверено с разделом «Регламентные требования» референсной реализации go-api-epgu и регламентом подключения v1.4 (09.11.2022).

  1. ИС зарегистрирована в технологическом портале ЕСИА (тест - https://esia-portal1.test.gosuslugi.ru/console/tech, прод - https://esia.gosuslugi.ru/console/tech/).
  2. Выпущен сертификат для подписи запросов; публичная часть загружена на технологический портал ЕСИА.
  3. Согласованы заявки на подключение ИС к ЕСИА и ЕПГУ - в тестовом и прод-контурах раздельно.
  4. На стороне ИС обеспечен журнал операций подписания (audit log) с указанием пользователя, сертификата и хэша данных.

There aren't any published security advisories