Безопасность и доступ
Изоляция физическая, а не «предикат в запросе»
Каждая организация владеет отдельным файлом SQLite. Запрос, забывший условие принадлежности, не может дотянуться до чужих данных: их нет в файле, который это соединение открыло.
Что сделано
Восемь свойств, каждое из которых можно проверить: они либо в схеме базы, либо в коде стража, либо в тестах.
Отдельный файл базы на каждую организацию
Изоляция физическая, а не предикат в запросе: строки другой организации лежат в файле, который это соединение не открывало. Запрос, забывший условие, не может дотянуться до чужих данных — их там просто нет.
Пароли — scrypt, а не хэш общего назначения
Хранится scrypt с параметрами N=16384, r=8, p=1 и 64-байтным ключом; сравнение постоянного времени. Пароль в открытом виде не хранится и не логируется нигде.
Сессия — cookie httpOnly
Флаги httpOnly и SameSite=Lax, признак secure следует настоящей схеме запроса, срок 30 дней. Ограничение частоты попыток входа — на адрес и на логин.
Код маркировки не попадает в журнал веб-сервера
Поиск кода — POST, а не GET, именно поэтому. Адресная строка не несёт ни кода, ни серийного номера.
Журнал действий, который нельзя обойти
Каждая операция записи проходит через одну воронку, и запись в журнал идёт в той же транзакции, что и сама операция. Журнал доступен на чтение всем, включая Наблюдателя, и выгружается в CSV.
Доступ поддержки — только чтение и всегда в журнале
Сотрудник платформы не имеет прав внутри организации. Единственный путь к данным — открыть файл в режиме наблюдения: соединение открывается только для чтения, причина обязательна, а запись в журнал платформы делается ДО того, как данные будут прочитаны.
Резервная копия — одной кнопкой, в любой момент
Согласованный снимок собственного файла организации: одна кнопка, весь файл базы. Плюс выгрузка каждого раздела в CSV — коды, справочник артикулов, журнал, партия исходным файлом. Забрать данные можно всегда, включая период неоплаты: у этой кнопки нет стража прав намеренно.
Данные не удаляются никогда
Неоплата переводит организацию в режим «только чтение»: коды, партии, выгрузки и журнал остаются на месте, их видно и можно скачать. Ни один код не прячется и не удаляется ни при каком состоянии подписки.
Четыре роли, полностью упорядоченные
Не матрица прав, которую никто ни разу не изгибает, а четыре ступени. Выше ступень — строго больше прав. Отдельно разделены «смотреть коды» и «выгружать коды файлом»: без этого разделения роль наблюдателя была бы ролью выноса данных.
| Роль | Что может |
|---|---|
| Владелец | Всё, что может администратор, плюс тариф, оплата и передача организации |
| Администратор | Управляет пользователями, токенами и базой, откатывает партии |
| Оператор | Загрузка, выгрузка, поиск и списание кодов |
| Наблюдатель | Только просмотр: остатки, коды, партии, выгрузки и журнал. Журнал содержит действия всех сотрудников. Выгрузка файлов недоступна |
Пятой роли — администратора платформы — внутри вашей организации не существует: у него нет членства, он не появляется в вашем списке пользователей, и сбросить ему пароль вашими правами нельзя, потому что его там нет.
Как поддержка смотрит ваши данные
Единственный путь от учётной записи вендора к вашему складу — режим наблюдения. У него три свойства, и они не настройка, а устройство.
- Запись в журнал делается ДО чтенияНе после, не в блоке «наконец». Процесс, убитый на середине запроса, всё равно оставляет строку о том, что вендор открыл файл.
- Соединение открыто только для чтенияОтказ на любую запись приходит от самой SQLite, а не от флага в нашем коде: будущая правка не может его потерять.
- Права урезаны двумя независимыми механизмамиРоль наблюдателя плюс отдельный список прав, запрещённых под наблюдением всегда. Режима записи в продукте нет вообще — не «отключён», а не написан.
Причина обращения обязательна
Чего нет
Если что-то из этого требуется вашей службе безопасности, лучше узнать сейчас.
- Нет двухфакторной аутентификации и единого входа (SSO)
- Нет внешнего аудита безопасности и сертификации: ни ISO 27001, ни аттестации по 152-ФЗ
- Нет шифрования базы на диске: файл организации защищён правами файловой системы и доступом к серверу
- Нет резервного копирования по расписанию: копия снимается кнопкой или скриптом на стороне оператора
- Нет журнала доступа на уровне записей: журнал фиксирует действия, а не факты просмотра
Отдельно про хранение: файлы организаций лежат на сервере, к которому имеет доступ вендор — тот же человек, который выпускает обновления. Площадка размещения указана в политике обработки данных; выдумывать её на этой странице мы не станем.