Безопасность и данные
Страница для технического аудита: что Amobit Chats делает для защиты данных, как это проверить и какие гарантии мы не заявляем. Она описывает публичную поверхность сервиса — вход, токены, webhooks, хранение и обработчиков данных.
Коротко. Вход только через Amobit ID с проверкой подписи и прав; компании изолированы на уровне серверных запросов; токены интеграций хранятся в виде хешей и показываются один раз; webhooks подписаны HMAC-SHA256, адрес проходит проверку на SSRF; медиа недоступны по прямой ссылке; резервные копии шифруются. Сертификаты SOC 2 / ISO 27001 не заявлены, шифрование at-rest не заявлено — подробности в разделе «Чего мы не заявляем».
Доступ и изоляция компаний
| Контроль | Как реализовано |
|---|---|
| Аутентификация пользователей | Единый вход через Amobit ID. Launch-токен проверяется как JWT: только RS256, ключ по kid из JWKS, закреплённые issuer и audience, обязательные exp, iat, sub; после подписи проверяются модуль, подписка, организация и роль. |
| Локальные пароли | Отключены по умолчанию. Включение — только для служебных сценариев и только с loopback-адреса. |
| Браузерная сессия | Непрозрачная серверная сессия Django. Cookies Secure и SameSite=None (нужно для встраивания в amoCRM/Bitrix24), HttpOnly; изменяющие запросы защищены CSRF. Продакшен не запускается с небезопасной политикой cookies. |
| Роли | owner, admin, agent, viewer. Управление каналами и интеграциями — owner/admin; подключать каналы может также агент с явным правом can_connect_channels; ответы в диалогах — owner/admin/agent; viewer только читает. |
| Изоляция компаний | Каждый маршрут /workspaces/<slug>/… сначала проверяет активное членство пользователя и статус компании, затем все запросы фильтруются по этой компании. Компания, отключённая в Amobit ID, недоступна даже при сохранённом членстве. |
| Межкомпанийный доступ | Покрыт регрессионными тестами: чужая компания, чужой диалог, чужое медиа и чужой токен не должны давать доступ. Если хотите проверить самостоятельно — запросите тестовый workspace: чужой slug вернёт 403, чужой объект — 404, но не данные. |
| Отключение доступа | Депровижининг компании отзывает пользовательские сессии и токены входа. Выход из текущей сессии инвалидирует её; отдельной кнопки «выйти на всех устройствах» нет. Токен внешней интеграции отзывается отдельно — заменой или отключением интеграции в кабинете. |
Токены и секреты
| Секрет | Хранение | Выдача и отзыв |
|---|---|---|
Токен внешней интеграции amc_… | Хеш с солью развёртывания; в ответах только префикс. | Показывается один раз при выпуске; срок действия встроен в токен — по умолчанию 365 дней. Новый выпуск немедленно отключает предыдущий и возвращает expires_at. Токены старого формата действуют до замены — перевыпустите их по регламенту. |
| Секрет подписи webhook | Хранится на сервере как секрет интеграции; через API не возвращается, доступен только флаг «настроен». | Задаётся владельцем/администратором, не короче 16 символов. Меняется в настройках интеграции; HMAC считается этим секретом. |
Токен MCP acmcp_… | SHA-256-хеш, префикс. | Показывается один раз, срок 1–90 дней, ограничен выбранными каналами, отзывается отдельно. На каждом запросе проверяются срок, отзыв, организация и актуальная роль создателя. |
| Секреты каналов (провайдеры) | Не возвращаются API — интерфейс показывает только «настроено/нет». Для Meta и Viber применяется шифрование на уровне приложения; остальные секреты хранятся в БД сервиса и доступны только ему. | Меняются при переподключении канала; при компрометации — отзыв у провайдера и замена. |
- Токен
amc_…принимает только эндпоинт отправки. Настройки интеграции и журнал доставок требуют сессию пользователя, поэтому украденный токен не даёт управлять интеграцией. - Токены и секреты не возвращаются API после сохранения; в ответах — только префикс и флаги.
- Подписи проверяются за постоянное время; токен
amc_…сравнивается черезcompare_digest. MCP-токен ищется по SHA-256-хешу. - Действия с MCP-токенами и вызовы инструментов пишутся в аудит без аргументов и текстов переписки.
Webhooks и защита от SSRF
| Контроль | Реализация |
|---|---|
| Адрес получателя | Только абсолютный https://. localhost, приватные и непубличные IP отклоняются; имя хоста разрешается в DNS и все адреса должны быть публичными. |
| Повторная проверка | Адрес проверяется при сохранении и заново перед каждой попыткой доставки; редиректы не выполняются (3xx считается ошибкой). |
| Подпись | X-Amobit-Chats-Signature = "sha256=" + HMAC-SHA256(secret, timestamp + "." + raw_body); версия алгоритма — в заголовке hmac-sha256-v1. |
| Защита от повторов | Каждое событие содержит X-Amobit-Chats-Idempotency-Key и timestamp. Проверка возраста timestamp — на стороне получателя (рекомендуем 5 минут). |
| Сбои | Таймаут 10 секунд, до 8 попыток с нарастающей паузой, затем dead. В журнале ошибок хранится только безопасный код: error_id, тип исключения, HTTP-статус — без текста исключения и секрета. |
| Входящие webhooks провайдеров | Meta — подпись X-Hub-Signature-256; Viber — HMAC-SHA256; amoCRM — X-Signature (HMAC-SHA1, обязательна в продакшене); Wappi — allowlist IP источника плюс токен канала (без HMAC). |
Свои webhooks вы принимаете на своей стороне: проверяйте подпись по сырому телу и отклоняйте старые timestamp. Готовые примеры — в разделе проверка подписи.
Транспорт и заголовки
- Только HTTPS. HTTP перенаправляется на HTTPS, сертификаты Let's Encrypt; HSTS включён с коротким сроком (без preload).
- Один источник. SPA и API на одном домене; API проксируется nginx на локальный gunicorn. Публичного Django admin нет.
- Заголовки безопасности:
X-Content-Type-Options: nosniff,Referrer-Policy: same-origin,Cross-Origin-Opener-Policy: same-origin; встраивание в CRM ограничено allowlist через CSPframe-ancestors, для остальных маршрутов —X-Frame-Options: DENY. - Зависимости зафиксированы lock-файлом и минимальными версиями; установка в продакшене — строго по lock-файлу.
- Медиа. Прямой путь
/media/закрыт на nginx. Скачивание — только через проверку членства в компании; share-ссылки подписаны и по умолчанию действуют 7 дней. Активный контент (HTML/SVG/JS) не отдаётся как исполняемый.
Какие данные хранятся
Amobit Chats обрабатывает переписку и связанные с ней данные клиентов компании:
- профиль пользователя Amobit ID (имя, email, телефон, дата рождения, город, пол, должность, аватар);
- компания (workspace), участники и роли;
- контакты и диалоги: имя, телефон, канал, внешние идентификаторы;
- сообщения: текст, тип, статус доставки, служебные поля провайдера (raw payload);
- вложения и медиафайлы;
- данные веб-чата: имя/телефон из предчата, сообщения посетителя;
- реквизиты компании для счетов, включая банковские данные;
- журналы: доставки webhooks, аудит MCP, сервисные события.
База данных — PostgreSQL на выделенном сервере Amobit, медиа — на локальном диске того же сервера. Шифрование канала обязательно; шифрование данных «at rest» не заявлено как гарантия (см. ниже).
Сроки хранения
| Данные | Срок |
|---|---|
| Переписка, контакты, вложения | Хранятся, пока существует компания и диалог. Автоматического удаления по сроку нет; удаление — по действию пользователя или запросу в поддержку. |
| События веб-чата | 90 дней |
| Данные посетителей веб-чата (PII) | 180 дней |
| Сетевые данные посетителей | 30 дней |
| Кэш удалённых медиа | 14 дней |
| Web-push доставки и подписки | 90 дней |
| Журнал доставок webhooks, аудит MCP | Без автоматического срока; хранятся для диагностики. |
Резервное копирование
- Ежедневный дамп PostgreSQL и снимок медиа, с шифрованием в отдельном хранилище (restic); пароль репозитория хранится вне каталога приложения.
- Еженедельная автоматическая проверка восстановления в изолированную базу: миграции, таблицы, индексы, ограничения.
- Резервное копирование выполняется отдельной сервисной учётной записью с ограниченными правами; процесс восстановления описан в runbook.
Статус эксплуатации. Механизм реализован и автоматизирован. Текущий статус включения и дату последней успешной проверки восстановления подтверждаем в рамках security review — не публикуем как гарантию без подтверждения на конкретном окружении.
Мониторинг и журналирование
- Предусмотрены автоматические проверки здоровья каждые 5 минут: доступность, диск, очереди отправки и доставок, зависшие задачи; аварийные уведомления команде (доставка зависит от настроенного на окружении канала оповещений).
- Отдельный сторож по расписанию проверяет контракт аутентификации и конфигурацию nginx/SPA; отклонения фиксируются для оператора.
- В журналах приложения не пишутся тексты переписки, токены и секреты; для ошибок провайдера сохраняются безопасные коды, а не исходный текст.
- Очереди используют атомарный захват задачи, восстановление «зависших» аренд и терминальное состояние
dead, поэтому потеря воркера не приводит к бесконечным повторам.
Сторонние обработчики
Данные передаются только тем сервисам, которые нужны для подключённой функции. Перечень зависит от каналов и модулей компании:
| Категория | Сервис | Что передаётся |
|---|---|---|
| Транспорт мессенджеров | Wappi | Тексты, медиа, номера телефонов, идентификаторы профилей и каналов. |
| Прямые каналы Meta | Meta (Messenger, Instagram, WhatsApp Cloud) | Тексты, медиа, идентификаторы пользователей и страниц — если канал подключён напрямую. |
| Прямые каналы | Viber | Тексты, медиа, идентификатор пользователя. |
| CRM-коннекторы | amoCRM/Kommo, Битрикс24, Altegio, PulseCRM | Сообщения и связанные сущности CRM — только если интеграция включена клиентом. |
| Идентификация | Amobit ID | Идентификатор пользователя, организация, роли, тариф. |
| AI-функции | Amobit AI, опционально OpenAI / Gemini | Контекст диалога или аудио — только при включённых AI-сценариях и транскрипции. |
| Сервисные проверки | DaData, Cloudflare Turnstile, Google FCM | Реквизиты по ИНН/БИК; IP и site key для антиспама веб-чата; push-токен устройства — если функции включены. |
| Egress-релей Meta (опционально) | Vercel | Payload запросов к Meta API, если включён relay META_EGRESS_RELAY_URL; используется для обхода сетевых ограничений egress. |
| Платежи | VPOS / Ameriabank (через Amobit ID) | Данные счёта и статуса оплаты. Данные карт в Amobit Chats не попадают. |
| Резервные копии | Отдельное хранилище (restic) | Шифрованный дамп БД и медиа. |
Актуальный перечень субпроцессоров, модель поручения обработки (DPA) и применимую юрисдикцию подтверждаем индивидуально при заключении договора и в рамках security review.
Уязвимости и инциденты
Сообщить о потенциальной уязвимости или инциденте безопасности: info@amobit.io с темой Security. Опишите затронутый адрес/функцию, шаги воспроизведения и влияние; не прикладывайте реальные персональные данные и секреты.
- Мы подтверждаем получение, проводим первичную оценку и сообщаем о дальнейших шагах.
- Затронутых клиентов уведомляем после подтверждения инцидента и определения объёма данных.
- Публичного bug bounty нет; координированное раскрытие — после исправления, по согласованию с исследователем.
Чего мы не заявляем
Чтобы security review опирался на факты, перечислим ограничения прямо:
| Тема | Фактическое состояние |
|---|---|
| Сертификаты | Сертификаты SOC 2 / ISO 27001 / PCI DSS на момент публикации не заявлены. По запросу подтвердим актуальный статус и объём assurance; отчёт о независимом пентесте предоставляем в рамках согласованного аудита. |
| Шифрование at rest | Не заявлено как гарантия. Политика конфиденциальности описывает шифрование канала. Если для вашего комплаенса обязательно шифрование диска/СУБД — обсудим отдельно. |
| CSP | Встраивание в CRM ограничено через frame-ancestors; политика script-src/default-src не заявлена. |
| HSTS | Включён; includeSubDomains/preload не заявлены. |
| Лимиты частоты | Лимиты применяются к аутентификации и отдельным чувствительным методам; отдельной публичной квоты для API отправки нет. |
| Срок хранения переписки | По умолчанию переписка и вложения хранятся в течение срока работы компании; для договорного срока включается retention-очистка (команда purge_conversation_retention, минимальное окно 30 дней). Удаление также доступно по запросу в поддержку. |
| «Выйти везде» | Нет массового отзыва всех браузерных сессий; отключение компании отзывает доступ, выход завершает текущую сессию. |
| Резервные копии | Реализованы и автоматизированы; статус эксплуатации подтверждается на конкретном окружении, а не по умолчанию. |
Чек-лист для вашей стороны
- Храните
amc_…и секрет подписи в секрет-хранилище, не в коде и не в браузере. - Проверяйте
X-Amobit-Chats-Signatureпо сырому телу и отклоняйте старые timestamp. - Дедуплицируйте события по
X-Amobit-Chats-Idempotency-Keyилиmessage.id. - Фильтруйте события по
message.direction, чтобы не отправлять внутренние заметки клиенту. - Ротируйте токен при смене подрядчика/интегратора и при подозрении на утечку.
- Ограничьте исходящие IP вашего сервера, если используете собственный firewall.
- Для AI-клиентов выпускайте отдельные MCP-токены: только нужные каналы, только чтение, короткий срок.
Контакты
Технические вопросы и security review: info@amobit.io. Юридические документы: политика конфиденциальности и правовая информация.