Безопасность, Шифрование и SSRF Guard
Безопасность, Шифрование и 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.