Безопасность, Шифрование и SSRF Guard

Движок ForjBot Engine защищает персональные данные пользователей и ключи API провайдеров по промышленным стандартам безопасности.

flowchart LR subgraph Encryption ["Encryption at Rest (Fernet)"] Key["PII_ENCRYPTION_KEY / SHA256(SECRET_KEY)"] --> Fernet["Fernet Cipher"] Plain["Plain Text API Key"] --> Fernet --> EncStr["ENC:gAAAAAB... (PostgreSQL)"] Startup["Старт app/main.py"] --> Canary{"Проверка encryption_canary"} Canary -->|OK| Boot["Успешный Запуск"] Canary -->|Fail| Banner["CRITICAL Log + Красный баннер в Admin UI"] end

1. Шифрование Секретов в БД (Encryption at Rest)

  • Префикс ENC:: Все API-ключи провайдеров в BotConfig и CrmConfig записываются с типом колонки EncryptedString.
  • Проверка канарейки (check_encryption_canary): На старте сервер проверяет запись global_settings.encryption_canary. При изменении ключа приложение выдает ошибку, а в админ-панели блокируется случайная перезапись ключей.
  • Маскирование в HTML: В формах секреты выводятся значением SECRET_MASK (******), предотвращая утечку ключей из открытых вкладок.

2. Фильтрация Исходящих Запросов (SSRF HTTP Guard)

Все исходящие вызовы (fetch_url, Jina Reader, Tavily, загрузка моделей, вебхуки) проходят через validate_outbound_url() в [app/shared/http_guard.py](file:///c:/Users/mike/Documents/OpenC/Flirtestor/flirtbot/app/shared/http_guard.py):

flowchart TD URL["Outbound URL"] --> CheckSSRF["http_guard.validate_outbound_url()"] CheckSSRF --> Private{"Приватный IP / Loopback?\n(127.0.0.1, 10.0.0.0/8, 169.254.169.254)"} Private -->|Да| AllowList{"Входит в SSRF_ALLOWED_HOSTS?"} AllowList -->|Да| Fetch["Разрешить Запрос"] AllowList -->|Нет| Block["Блокировка 403 Forbidden"] Private -->|Нет| Fetch
  • Защита от DNS Rebinding: Блокируется повторное резолвинг-сопоставление локальных хостов.
  • Исключения: Для закрытых контуров (Ollama, local vLLM) хосты вносятся через SSRF_ALLOWED_HOSTS.