Перейти к содержимому

Модель безопасности

Документ ведётся с первого коммита: приказ ФСТЭК России № 76 требует модель безопасности, архитектуру безопасности и функциональную спецификацию как часть процесса разработки. Реконструировать их по готовому продукту дороже, чем поддерживать по ходу.

АктивГде находитсяЧем грозит компрометация
Пароли пользователей каталогатолько в службе каталогазахват учётной записи
Одноразовые коды подтвержденияоперативная память, в виде хэшаобход второго фактора
Секреты TOTPхранилище секретов инсталляции (файл 0600, запись через переименование)обход второго фактора
Учётные данные привилегированного подключения к каталогуконфигурациясброс пароля любому сотруднику
Журнал событий безопасностифайл журналасокрытие следов атаки
Персональные данные (ФИО, телефон, адрес почты)каталог, журнал в маскированном виденарушение 152-ФЗ

Продукт не хранит пароли ни в каком виде — ни открытым текстом, ни хэшем. Это осознанное архитектурное ограничение: единственным источником и хранилищем пароля остаётся служба каталога.

НарушительВозможностиОсновной сценарий
Внешний анонимныйдоступ к порталу из сети общего пользованияперебор имён и паролей, перехват сценария восстановления
Внешний с частичным знаниемзнает имя сотрудника и часть персональных данныхвосстановление пароля от чужого имени
Внутренний пользовательимеет собственную учётную записьповышение прав, смена пароля коллеги
Внутренний администратор порталадоступ к конфигурации и журналамсокрытие собственных действий
Владелец канала доставкиконтролирует SMS-трафик или SIMперехват одноразового кода

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

3. Предположения о среде функционирования

Заголовок раздела «3. Предположения о среде функционирования»
  1. Транспортная защита обеспечивается внешним терминатором TLS. В аттестованных контурах — сертифицированным средством криптографической защиты с алгоритмами ГОСТ. Продукт собственной криптографии для защиты канала не реализует.
  2. Соединение со службой каталога защищено (LDAPS либо StartTLS); операции с паролями по незащищённому каналу служба каталога отвергает сама.
  3. Узел, файл конфигурации и хранилище секретов TOTP доступны только учётной записи, от имени которой выполняется продукт.
  4. Часы узла синхронизированы: от них зависит проверка TOTP и срок жизни кодов.
УгрозаМераГде реализовано
Перебор пароля или кодаограничение неудачных попыток по имени и по адресу источника, блокировка на времяinternal/ratelimit
Разведка существующих учётных записейединообразный ответ и время реакции независимо от существования учётной записиобработчики портала
Подмена адреса источника для обхода ограниченийзаголовки прокси учитываются только от доверенных сетейinternal/httpx
Перехват одноразового кодасрок жизни 5 минут, три попытки, одноразовость, приоритет TOTP над SMSinternal/factor/sms
Подмена номера доставкиномер берётся только из каталога, собственного справочника телефонов нетinternal/factor/sms
Раскрытие кода через журнал или памятьхранится только хэш кода, в журнал не попадает, номер маскируетсяinternal/audit, internal/factor/sms
Повторное использование сеансаограничение параллельных сеансов, таймаут бездействия, абсолютный таймаутinternal/session
Сокрытие следов атакижурнал append-only со сцеплением записей хэшами, проверка целостностиinternal/audit
Удаление журнала вместе с узломкопия событий уходит во внешнюю систему сбора, потери доставки видны в метрикахinternal/audit/syslog.go
Сброс пароля произвольному сотруднику при компрометации продуктарежим без привилегированного подключения: смена выполняется от имени самого пользователяinternal/directory/ad
Атака по времени на сравнение кодовсравнение постоянного времениinternal/factor/*
Подбор пароля даёт возможность его сменитьвторой фактор в сценарии смены (factor_on_change)internal/web
Привязка своего приложения по украденному паролюзамена подключённого приложения требует кода из прежнегоinternal/web/enroll.go
Прерванная регистрация оставляет учётную запись без рабочего факторасекрет сохраняется только после подтверждения кодомinternal/web/enroll.go
Утечка секрета через журналы прокси и историю браузераQR формируется на сервере и встраивается в страницу, ссылка с секретом не создаётсяinternal/qr
Потеря устройства запирает сотрудника без второго факторазамена подтверждается запасным способом; при его отсутствии привязку снимает администратор командой на узлеinternal/web/enroll.go, cmd/sspr/totpcmd.go
Скрытое снятие второго фактора администраторомснятие фиксируется в журнале вместе с именем оператораcmd/sspr/totpcmd.go, internal/admin
Вход в управление по украденному паролювторой фактор обязателен, права проверяются в каталоге при каждом входеinternal/admin
Присвоение прав администрированиячленство определяется группой каталога, а не настройкой продуктаinternal/admin

Перечень соответствует мерам защиты по приказам ФСТЭК России № 17, 21 и 239.

МераРеализация
ИАФ.1–ИАФ.6идентификация по имени учётной записи каталога, подтверждение вторым фактором, скрытие вводимых значений
УПД.6ограничение числа неудачных попыток
УПД.8оповещение о предыдущем входе
УПД.9ограничение параллельных сеансов
УПД.10завершение сеанса при бездействии
РСБ.1–РСБ.8регистрация событий, защита журнала от изменения сцеплением хэшей через границы файлов при ротации, выгрузка копии в систему сбора по RFC 5424, сквозная проверка sspr audit verify
АНЗ.5проверка соответствия пароля политике до обращения к каталогу
ЗИС.1разделение интерфейсов пользователя и администратора

Продукт разворачивается в двух режимах, и это ключевое архитектурное решение:

  • Смена известного пароля — продукту не нужна привилегированная учётная запись в каталоге. Операция выполняется соединением, установленным от имени самого пользователя. Компрометация продукта в этом режиме не даёт возможности сменить пароль другому сотруднику.
  • Восстановление забытого пароля — требует привилегированного подключения. Включается явно параметром allow_reset; при его отключении соответствующий путь недоступен. «Привилегированное» здесь означает два делегированных права на подразделении с сотрудниками, а не членство в административных группах. Точный перечень прав и команды делегирования — в документе «Права в каталоге», он предоставляется по запросу.

7. Принятый риск: пароли, ожидающие подтверждения

Заголовок раздела «7. Принятый риск: пароли, ожидающие подтверждения»

При включённом factor_on_change введённые пароли — текущий и новый — живут в памяти процесса между отправкой формы и вводом кода.

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

Ограничения. Срок ожидания — 5 минут, заметно короче срока сценария. Хранение в байтовых срезах с затиранием сразу после применения, по истечении срока и при отмене сценария. В журналы, метрики и ответы страниц значения не попадают.

ИнтерфейсСлушательКому доступен
Портал пользователяlistenсотрудникам, через внешний терминатор TLS
Управлениеadmin.listenадминистраторам во внутренней сети
Метрики и пробыobservability.metrics_listenсистеме мониторинга во внутренней сети

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

Персональные данные не попадают ни в метрики (метки имеют закрытые множества значений), ни в журнал эксплуатации (в нём нет строки запроса и тела формы). Телефон в журнале аудита хранится в маскированном виде.

  • Хранение секретов TOTP в СУБД для отказоустойчивых инсталляций. Сейчас — файл на узле; двух экземпляров портала с общим состоянием не бывает.
  • История паролей при административном сбросе: Active Directory её не проверяет, продукт не компенсирует. Компенсация потребовала бы хранить хэши прежних паролей на стороне продукта — это новый защищаемый актив, и вводить его без запроса заказчика не следует.