Безопасность 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_KEYMessaging не запустится. - Ключи шифрования и пароли храните в хранилище секретов или в переменных службы, а не в репозитории.
Код ботов и песочница
Действия, хуки и переходы ботов выполняются в изолированной среде. Не включайте переменные 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: в метриках видны объёмы трафика и число ботов.
Обновления
Поддерживайте платформу в актуальной версии: исправления безопасности поставляются с новыми версиями дистрибутива и образов. Порядок обновления описан в разделе Резервное копирование и обновление.