Перейти к основному содержимому
Версия: 3.0

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

Страница собирает настройки, которые нужно проверить перед тем, как открыть платформу пользователям. Часть из них отражена в разделе «Готовность к продуктиву», см. Чек-лист перед выходом в продуктив.

Сетевая схема​

  • Наружу (через HTTPS) открывайте только порт ядра 3000. Порты Studio, NLU, Messaging, языкового сервера, Duckling и PostgreSQL должны быть доступны только самой платформе.
  • По умолчанию ядро слушает все сетевые интерфейсы, хотя в конфигурации стоит localhost. Если платформа должна быть доступна только через обратный прокси на этом же сервере, задайте IQB_HOST=127.0.0.1. В остальных случаях ограничивайте доступ файрволом.
  • Языковой сервер запускайте с --host 127.0.0.1, а если он на отдельном сервере, закройте порт файрволом для всех, кроме сервера iQBot. Дополнительно можно задать ключ --authToken на языковом сервере и такой же authToken в элементе languageSources настроек NLU.
  • PostgreSQL не должен принимать подключения извне. Для платформы создайте отдельного пользователя с правами только на её базу.

HTTPS​

Платформа сама не обрабатывает сертификаты. Поставьте перед портом 3000 обратный прокси с HTTPS и задайте:

  • IQB_EXTERNAL_URL=https://<ваш-адрес>, чтобы ссылки и ресурсы строились правильно;
  • IQB_REVERSE_PROXY=true (или IP-адрес прокси), чтобы платформа доверяла заголовкам прокси.

Пример для NGINX. Обратите внимание на заголовки Upgrade и Connection: через веб-сокеты работают Studio и чат.

server {
listen 443 ssl;
server_name bot.example.com;

ssl_certificate /etc/ssl/bot.example.com.crt;
ssl_certificate_key /etc/ssl/bot.example.com.key;

client_max_body_size 100m;

location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
}
}

Это пример: параметры сертификатов и таймаутов подберите под вашу инфраструктуру. Размер client_max_body_size ограничивает загрузку архивов ботов и файлов.

Учётные записи и доступ​

  • Первый администратор. Задайте IQB_ADMIN_EMAIL и IQB_ADMIN_PASSWORD до того, как платформа станет доступна из сети, иначе администратором станет первый, кто откроет страницу регистрации. После первого запуска удалите IQB_ADMIN_PASSWORD из .env: переменные действуют только на пустой установке, а пароль в открытом виде файлу не нужен.
  • Блокировка подбора пароля. По умолчанию после 5 неудачных попыток вход блокируется на 15 минут (authStrategies.default.options). Самостоятельная регистрация отключена (allowSelfSignup: false), не включайте её в продуктиве.
  • Единый вход. Для сотрудников компании предпочтительнее вход через корпоративного провайдера (OpenID Connect: Keycloak, ADFS) или каталог (LDAP, Active Directory): пароли в платформе не хранятся, блокировка учётной записи в компании закрывает и доступ к платформе. Настройка описана в разделе Аутентификация и единый вход.
  • Второй фактор. Для учётных записей с паролем платформы включите второй фактор (twoFactor: optional или required в базовой стратегии): одноразовые коды приложения-аутентификатора и коды восстановления. Сброс пароля сотрудниками по почте требует настроенной почты платформы (mail); ссылка действует час, старые сеансы завершаются.
  • Пароли. passwordMinLength и requireComplexPassword в настройках базовой стратегии задают минимальную длину и сложность (три группы символов, проверка на словарные пароли), passwordExpiryDelay срок действия.
  • Минимально необходимые права. Выдавайте пользователям роль с нужным набором прав, а не полный доступ. Встроенные роли и редактор ролей описаны в разделе Роли и права доступа. Супер-администраторов должно быть один-два.
  • Токен доступа. Срок действия токена консоли задаёт jwtToken.duration (по умолчанию час). Для хранения токена в защищённом cookie, а не в браузере, включите jwtToken.useCookieStorage: предварительно настройте политику CORS.
  • Перезапуск из консоли. Параметр allowServerReboot по умолчанию разрешает супер-администратору перезапускать сервер из консоли. В продуктиве рекомендуется отключить.

Ограничение запросов и CORS​

  • httpServer.rateLimit.enabled включает ограничение числа запросов с одного IP. По умолчанию выключено. Учитывайте, что в лимит входят запросы консоли, Studio и чата, поэтому не задавайте слишком малое значение limit. Если платформа за прокси, настройте IQB_REVERSE_PROXY, иначе все запросы будут приходить с адреса прокси.
  • httpServer.cors.origin ограничивает источники запросов к API своим доменом. По умолчанию разрешён любой источник.

Секреты​

  • Файл .env должен принадлежать пользователю платформы и иметь права 600.
  • Messaging и токены вебхуков. Когда Messaging запускает ядро (стандартная схема), токены вебхуков хранятся в базе данных без шифрования, поэтому доступ к базе нужно ограничивать так же строго, как доступ к платформе. Если вы запускаете Messaging отдельно, задайте ему ENCRYPTION_KEY (32 случайных байта в base64, например openssl rand -base64 32) и ADMIN_KEY, совпадающий с IQB_MESSAGING_ADMIN_KEY на ядре. Без ADMIN_KEY Messaging не запустится.
  • Ключи шифрования и пароли храните в хранилище секретов или в переменных службы, а не в репозитории.

Код ботов и песочница​

Действия, хуки и переходы ботов выполняются в изолированной среде. Не включайте переменные DISABLE_GLOBAL_SANDBOX, DISABLE_BOT_SANDBOX, DISABLE_TRANSITION_SANDBOX, DISABLE_CONTENT_SANDBOX: они снимают изоляцию. Доступом к редактору кода управляйте через роль: разработчик может менять действия бота, а настройки сервера и глобальные настройки модулей остаются у супер-администратора.

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

Журналирование​

  • В разделе «Отладка» включите контрольный журнал: он записывает запросы, отправленные на сервер, с пользователем и IP-адресом.
  • Включите запись журналов в файлы (logs.fileOutput.enabled) и настройте их ротацию и отправку в систему сбора логов вашей организации. Журналы в базе по умолчанию хранятся две недели.
  • Параметр IQB_DISABLE_SERVER_CONFIG отключает API, которое может отдавать чувствительные данные конфигурации, если оно вам не нужно.
  • История изменений ботов. Платформа записывает, кто и когда изменил файлы бота в Studio, создал ревизию, выполнил откат, импорт или удаление (таблица srv_bot_changes, пункт «История изменений» в меню бота). Записи хранятся в базе и входят в её резервную копию.
  • Метрики. Если GET /metrics доступен из сети, задайте IQB_METRICS_TOKEN: в метриках видны объёмы трафика и число ботов.

Обновления​

Поддерживайте платформу в актуальной версии: исправления безопасности поставляются с новыми версиями дистрибутива и образов. Порядок обновления описан в разделе Резервное копирование и обновление.