SecurityFlow Кабинет лицензий , откроется в новой вкладке

Документация / Руководство по установке / Установка

Параметры конфигурации

Обновлено 20 октября 2026

Core и Radar читают настройки из переменных окружения контейнеров. В Kubernetes переменные приходят из секретов (envFrom: secretRef) и из описания пода. Изменения применяются после перезапуска подов. Настройки, которые меняются в интерфейсе, на этой странице не описаны - они хранятся в базе.

Обозначения: "Обязательный" - без значения компонент не работает или работает небезопасно; "Секрет" - значение хранится только в Kubernetes Secret.

Core

Переменные читает образ sf-core-back во всех режимах. Отдельно отмечено, каким ещё образам Core переменная нужна.

Режим и процессы

Параметр Назначение Формат По умолчанию Обязательный Секрет
MODE какой процесс поднять: init - миграции, статика, администратор; web - интерфейс и API на 8000; importer - приём отчётов на 8001; worker - Celery, очередь appsecpanel_worker; beat - планировщик; all - подготовка и все четыре процесса в одном контейнере строка all да, в Kubernetes - свой у каждого компонента нет
GUNICORN_WORKERS процессов gunicorn интерфейса и API число 1 (в Kubernetes 4) нет нет
GUNICORN_THREADS потоков на процесс число 1 (в Kubernetes 4) нет нет
IMPORTER_GUNICORN_WORKERS процессов gunicorn приёма отчётов число 1 (в Kubernetes 2) нет нет
IMPORTER_GUNICORN_THREADS потоков на процесс приёма отчётов число 1 (в Kubernetes 4) нет нет
ADMIN_USER логин первого администратора, создаётся в режимах init и all строка admin нет нет
ADMIN_EMAIL почта первого администратора e-mail задана в образе рекомендуется нет
ADMIN_PASSWORD пароль первого администратора. Пусто - пароль генерируется и один раз печатается в журнал подготовки. Если пользователь уже есть, пароль не меняется строка пусто рекомендуется да

При значениях по умолчанию gunicorn обрабатывает один запрос за раз. Задавайте процессы и потоки явно.

Адрес и доступ

Параметр Назначение Формат По умолчанию Обязательный Секрет
DOMAIN внешний адрес Core. Значение на https включает Secure для cookie сессии и CSRF и добавляет адрес в CSRF_TRUSTED_ORIGINS URL без пути; слеш в конце отрезается domain да нет
ALLOWED_HOSTS имена хостов, на которые Core отвечает список через запятую * рекомендуется нет
CORS_ORIGIN_WHITELIST origin, которым разрешены кросс-доменные запросы к /api/ список через запятую пусто нет нет
DEBUG режим отладки 1 или True включает выключен нет нет

ALLOWED_HOSTS должен включать все имена, по которым приходят запросы: внешнее имя Core, имя из "Внутреннего URL приложения", по которому Radar отправляет отчёты, и имя или адрес, которые подставляют пробы Kubernetes.

База данных

Нужна образам sf-core-back и sf-core-db-helper.

Параметр Назначение Формат По умолчанию Обязательный Секрет
DB_HOST адрес PostgreSQL имя или IP postgres да нет
DB_PORT порт число 5432 нет нет
DB_NAME база Core строка appsec_db да нет
DB_USER пользователь строка postgres да нет
DB_PASS пароль строка заглушка да да
DB_CONN_MAX_AGE сколько секунд держать соединение открытым между запросами число 60 нет нет

Параметры соединения, которые не настраиваются: таймаут подключения 30 с, statement_timeout 30 с, idle_in_transaction_session_timeout 60 с, TCP keepalive.

Брокер

Параметр Назначение Формат По умолчанию Обязательный Секрет Образы
AMQP_HOST_STRING подключение к RabbitMQ Core amqp://<пользователь>:<пароль>@<хост>:5672/<vhost> пусто да да sf-core-back, sf-core-importer, sf-core-db-helper, sf-core-jira-helper
BROKER_SSL_SKIP_VERIFY не проверять сертификат брокера 1 или True выключено нет нет те же
AUTOMATION_WORKER_CONCURRENCY слотов помощника БД под автоматизацию число 3 в образе; задавайте 6 да нет sf-core-db-helper

Автовалидатор, дедупликатор и расчёт CVSS - три постоянных цикла помощника БД, каждый навсегда занимает слот. При трёх слотах, как в образе по умолчанию, другие задачи автоматизации не выполняются. Задавайте AUTOMATION_WORKER_CONCURRENCY не меньше 6.

Параллельность воркеров разбора отчётов и Jira-помощника задаётся в команде запуска, например: celery -A importer_service worker -Q importer_service --concurrency=3 и celery -A jira_helper_service worker -Q jira_helper_service --concurrency=2.

Безопасность и ключи

Параметр Назначение Формат По умолчанию Обязательный Секрет Образы
DJANGO_SECRET_KEY секрет Django строка, например openssl rand -hex 32 заглушка django_secret_key да да sf-core-back
JWT_PRIVATE_KEY закрытый ключ RS256: подпись токенов входа и расшифровка секретов интеграций PEM, см. Формат PEM-ключей заглушка да да sf-core-back, sf-core-db-helper
JWT_PUBLIC_KEY открытый ключ той же пары: проверка токенов входа и шифрование секретов PEM заглушка да нет, хранится вместе с закрытым sf-core-back

Пару JWT-ключей не меняют после первого запуска

Этой парой Core шифрует секреты в своей базе: токен Radar, SSH-ключ и пароль реестра для пайплайнов, токены систем контроля версий, учётные данные Jira и DefectDojo, клиентские данные SSO, токены уведомлений и LLM, секреты облачных ассетов. Ключ симметричного шифрования части этих полей тоже зашифрован этой парой. При смене пары сохранённые секреты не расшифровать: их придётся ввести заново во всех интеграциях, а пользователям - войти повторно. Храните пару вместе с резервной копией базы Core.

Лицензия

Параметр Назначение Формат По умолчанию Обязательный Секрет Образы
LICENSE_SERVER адрес сервера лицензий URL https://securityflow.ru нет нет sf-core-back
LICENSE_SERVER_PUBLIC_KEY открытый ключ сервера лицензий: проверка подписи ключа лицензии PEM заглушка да нет sf-core-back, sf-core-db-helper
LICENSE_CHECK_INTERVAL_SECONDS период сверки лицензии с сервером по расписанию секунды 300 нет нет sf-core-back
LICENSE_CHECK_MIN_INTERVAL сверка от работы пользователей - не чаще раза в столько секунд на процесс gunicorn секунды 60 нет нет sf-core-back
LICENSE_CHECK_TIMEOUT таймаут запроса к серверу лицензий секунды 10 нет нет sf-core-back

Открытый ключ сервера лицензий передаёт команда SecurityFlow. Сервер отдаёт его и сам: GET https://securityflow.ru/api/public-key, ответ - PEM в text/plain. Как Core проверяет лицензию и что происходит без связи - см. Лицензирование.

Интеграции

Параметр Назначение Формат По умолчанию Обязательный Секрет
AI_PROXY_URL адрес сервиса AI-прокси, через который Core работает с LLM URL со слешем в конце http://aiproxy:8080/ только для LLM нет
AI_PROXY_VERIFY проверка TLS AI-прокси: путь к файлу CA в контейнере. Не задана - сертификат проверяется по системным CA путь к файлу системные CA нет нет

Сервис AI-прокси для LLM-интеграции по запросу разворачивает команда SecurityFlow - см. LLM.

Остальные интеграции - Jira, системы контроля версий, уведомления, SSO - настраиваются в интерфейсе Core и переменных окружения не требуют. Синхронизацию с DefectDojo по запросу разворачивает команда SecurityFlow - см. DefectDojo.

Radar back

Образ sf-radar-back.

Параметр Назначение Формат По умолчанию Обязательный Секрет
DB_HOST адрес PostgreSQL имя или IP postgres да нет
DB_PORT порт, задавайте явно число - да нет
DB_NAME база Radar строка appsec_db да нет
DB_USER пользователь строка postgres да нет
DB_PASS пароль строка заглушка да да
DB_CONN_STRING полная строка подключения, заменяет DB_* для приложения postgresql+psycopg2://<пользователь>:<пароль>@<хост>:<порт>/<база> пусто нет да
AMQP_HOST_STRING брокер Celery Radar amqp://..., redis://... или rediss://... пусто да да
BROKER_SSL_SKIP_VERIFY не проверять сертификат брокера True или False False нет нет
REDIS_HOST адрес Redis; порт всегда 6379 имя или IP redis да нет
REDIS_PASSWORD пароль Redis строка, может быть пустой нет значения да, переменная должна быть задана да
REDIS_SSL TLS к Redis True или False False нет нет
REDIS_SSL_CERT_REQS проверять сертификат Redis True или False True нет нет
DOCKER_ENCRYPTION_TOKEN ключ шифрования паролей реестров в базе Radar ровно 16 или 32 символа ASCII, например openssl rand -hex 16 пусто да да
ACCESS_TOKEN токен Radar. С ним Radar back раз в 10 с проверяет таймауты пайплайнов и раз в час собирает статистику длительности джоб строка пусто да да
API_WORKERS процессов uvicorn число 4 нет нет
FIXTURE_PACKAGE_NAME пакет каталога джоб строка ws_fixtures не менять нет

Миграции базы Radar читают только DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASS. Задавайте их, даже если приложение подключается через DB_CONN_STRING.

Без ACCESS_TOKEN таймауты джоб и пайплайнов не срабатывают: проверку запускает только фоновый цикл Radar back. Как получить токен - Первичная настройка.

DOCKER_ENCRYPTION_TOKEN задаётся один раз

Этим ключом Radar шифрует пароли в "Уч. Данные Docker". При смене ключа сохранённые пароли не расшифровать: их придётся ввести заново. Длина ключа - ровно 16 или 32 символа ASCII: с другой длиной учётные данные реестра не сохраняются. Храните ключ вместе с резервной копией базы Radar.

Воркеры Radar

Образ sf-radar-worker: пайплайн-воркер, utils-воркер и планировщик.

Параметр Назначение Формат По умолчанию Обязательный Секрет
AMQP_HOST_STRING брокер Radar, тот же, что у Radar back как у Radar back пусто да да
BROKER_SSL_SKIP_VERIFY не проверять сертификат брокера True или False False нет нет
ACCESS_TOKEN токен Radar для обращений к API Radar back строка пусто да да
AUDITOR_HOST адрес API Radar back URL без слеша в конце http://auditor:8090 нет нет
HTTP_SSL_SKIP_VERIFY не проверять сертификат Core при отправке отчёта True или False False нет нет
REDIS_HOST адрес Redis имя или IP redis да нет
REDIS_PASSWORD пароль Redis строка пусто если у Redis есть пароль да
REDIS_SSL TLS к Redis True или False False нет нет
REDIS_SSL_CERT_REQS проверять сертификат Redis True или False True нет нет
MAX_SCALEWORKERS_COUNT верхняя граница автомасштабирования пайплайн-воркера (--autoscale 1,N): столько пайплайнов под выполняет одновременно число 2 (в расчёте ресурсов - 3) нет нет
UTILITY_IMAGE служебный образ: чтение отчёта, артефакты, копирование между томами образ с реестром и тегом alpine в закрытом контуре - да нет
LOG_LEVEL уровень журнала пайплайн-воркера INFO, DEBUG и т. п. INFO нет нет
DOCKER_HOST демон Docker для контейнеров джоб URL сокета unix:///var/run/docker.sock нет нет
TZ часовой пояс контейнера имя пояса UTC, задан в образе нет нет

Если токен в переменной ACCESS_TOKEN воркера не совпадает с токеном Radar, воркер не начинает пайплайн: в журнале появляется Aborting the pipeline, пайплайн остаётся "В ожидании".

Фронты

У образов sf-core-front и sf-radar-front переменных окружения нет. Фронт Core обращается к интерфейсу и API на порт 8000 и к приёму отчётов на порт 8001, фронт Radar - к Radar back на порт 8090. Имена сервисов бэкендов задаются при установке - см. Маршрутизация запросов. Лимит тела запроса в самих фронтах - 4 ГБ, рабочий лимит задаёт ingress.

Формат PEM-ключей

JWT_PRIVATE_KEY, JWT_PUBLIC_KEY и LICENSE_SERVER_PUBLIC_KEY передаются содержимым ключа, а не путём к файлу. Значение - PEM целиком, со строками -----BEGIN ...----- и -----END ...-----.

Допустимы два вида:

  • многострочное значение, как в файле ключа. Так получается при создании секрета с --from-file;
  • одна строка, где переводы строк заменены на два символа \n. Core заменяет их обратно на переводы строк.

Сгенерируйте пару RSA 2048 для JWT:

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out jwt.key
openssl rsa -in jwt.key -pubout -out jwt.pub

Получите открытый ключ сервера лицензий:

curl -sS https://securityflow.ru/api/public-key -o license.pub

Переведите ключ в одну строку, если система конфигурации не принимает многострочные значения:

awk 'NF {sub(/\r/, ""); printf "%s\\n", $0}' jwt.key

Если LICENSE_SERVER_PUBLIC_KEY задан с ошибкой, активация на сервере проходит, но на следующем запросе Core не может проверить подпись лицензии, удаляет её и снова показывает экран активации. В журнале процесса интерфейса и API - Signature verification failed. или Unexpected error during license handling.

Пример: секрет Core

Значения в угловых скобках замените своими.

apiVersion: v1
kind: Secret
metadata:
  name: sf-core-env
  namespace: securityflow-core
type: Opaque
stringData:
  DOMAIN: https://core.example.ru
  ALLOWED_HOSTS: core.example.ru,<внутреннее имя Core>
  DJANGO_SECRET_KEY: <openssl rand -hex 32>
  DB_HOST: <адрес PostgreSQL>
  DB_PORT: "5432"
  DB_NAME: <база Core>
  DB_USER: <пользователь Core>
  DB_PASS: <пароль>
  AMQP_HOST_STRING: amqp://<пользователь>:<пароль>@<RabbitMQ Core>:5672/<vhost>
  LICENSE_SERVER_PUBLIC_KEY: |
    -----BEGIN PUBLIC KEY-----
    <ключ>
    -----END PUBLIC KEY-----
  JWT_PRIVATE_KEY: |
    -----BEGIN PRIVATE KEY-----
    <ключ>
    -----END PRIVATE KEY-----
  JWT_PUBLIC_KEY: |
    -----BEGIN PUBLIC KEY-----
    <ключ>
    -----END PUBLIC KEY-----
  ADMIN_USER: admin
  ADMIN_EMAIL: <почта администратора>
  ADMIN_PASSWORD: <пароль администратора>

Пример: секрет Radar

apiVersion: v1
kind: Secret
metadata:
  name: <секрет Radar>
  namespace: securityflow-radar
type: Opaque
stringData:
  DB_HOST: <адрес PostgreSQL>
  DB_PORT: "5432"
  DB_NAME: <база Radar>
  DB_USER: <пользователь Radar>
  DB_PASS: <пароль>
  AMQP_HOST_STRING: amqp://<пользователь>:<пароль>@<RabbitMQ Radar>:5672/<vhost>
  REDIS_HOST: <адрес Redis>
  REDIS_PASSWORD: <пароль Redis>
  DOCKER_ENCRYPTION_TOKEN: <openssl rand -hex 16>
  ACCESS_TOKEN: <токен Radar>