К основному содержимому
Разделы сайта

Безопасность и доступ

Изоляция физическая, а не «предикат в запросе»

Каждая организация владеет отдельным файлом SQLite. Запрос, забывший условие принадлежности, не может дотянуться до чужих данных: их нет в файле, который это соединение открыло.

Что сделано

Восемь свойств, каждое из которых можно проверить: они либо в схеме базы, либо в коде стража, либо в тестах.

  • Отдельный файл базы на каждую организацию

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

  • Пароли — scrypt, а не хэш общего назначения

    Хранится scrypt с параметрами N=16384, r=8, p=1 и 64-байтным ключом; сравнение постоянного времени. Пароль в открытом виде не хранится и не логируется нигде.

  • Сессия — cookie httpOnly

    Флаги httpOnly и SameSite=Lax, признак secure следует настоящей схеме запроса, срок 30 дней. Ограничение частоты попыток входа — на адрес и на логин.

  • Код маркировки не попадает в журнал веб-сервера

    Поиск кода — POST, а не GET, именно поэтому. Адресная строка не несёт ни кода, ни серийного номера.

  • Журнал действий, который нельзя обойти

    Каждая операция записи проходит через одну воронку, и запись в журнал идёт в той же транзакции, что и сама операция. Журнал доступен на чтение всем, включая Наблюдателя, и выгружается в CSV.

  • Доступ поддержки — только чтение и всегда в журнале

    Сотрудник платформы не имеет прав внутри организации. Единственный путь к данным — открыть файл в режиме наблюдения: соединение открывается только для чтения, причина обязательна, а запись в журнал платформы делается ДО того, как данные будут прочитаны.

  • Резервная копия — одной кнопкой, в любой момент

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

  • Данные не удаляются никогда

    Неоплата переводит организацию в режим «только чтение»: коды, партии, выгрузки и журнал остаются на месте, их видно и можно скачать. Ни один код не прячется и не удаляется ни при каком состоянии подписки.

Четыре роли, полностью упорядоченные

Не матрица прав, которую никто ни разу не изгибает, а четыре ступени. Выше ступень — строго больше прав. Отдельно разделены «смотреть коды» и «выгружать коды файлом»: без этого разделения роль наблюдателя была бы ролью выноса данных.

Роли внутри организации и что они дают
РольЧто может
ВладелецВсё, что может администратор, плюс тариф, оплата и передача организации
АдминистраторУправляет пользователями, токенами и базой, откатывает партии
ОператорЗагрузка, выгрузка, поиск и списание кодов
НаблюдательТолько просмотр: остатки, коды, партии, выгрузки и журнал. Журнал содержит действия всех сотрудников. Выгрузка файлов недоступна

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

Как поддержка смотрит ваши данные

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

  1. Запись в журнал делается ДО чтенияНе после, не в блоке «наконец». Процесс, убитый на середине запроса, всё равно оставляет строку о том, что вендор открыл файл.
  2. Соединение открыто только для чтенияОтказ на любую запись приходит от самой SQLite, а не от флага в нашем коде: будущая правка не может его потерять.
  3. Права урезаны двумя независимыми механизмамиРоль наблюдателя плюс отдельный список прав, запрещённых под наблюдением всегда. Режима записи в продукте нет вообще — не «отключён», а не написан.

Причина обращения обязательна

Открыть файл организации нельзя без причины длиннее десяти символов. Это не криптографическая защита, а требование читаемости: «фикс» в журнале через полгода не отвечает на вопрос, что вендор делал в вашей базе во вторник. Причина и номер обращения попадают в журнал платформы вместе с логином сотрудника и временем.

Чего нет

Если что-то из этого требуется вашей службе безопасности, лучше узнать сейчас.

  • Нет двухфакторной аутентификации и единого входа (SSO)
  • Нет внешнего аудита безопасности и сертификации: ни ISO 27001, ни аттестации по 152-ФЗ
  • Нет шифрования базы на диске: файл организации защищён правами файловой системы и доступом к серверу
  • Нет резервного копирования по расписанию: копия снимается кнопкой или скриптом на стороне оператора
  • Нет журнала доступа на уровне записей: журнал фиксирует действия, а не факты просмотра

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

Безопасность · КодКипер