Документация / Руководство по установке / Установка
Параметры конфигурации
Core и Radar читают настройки из переменных окружения контейнеров. В Kubernetes переменные приходят из секретов (envFrom: secretRef) и из описания пода. Изменения применяются после перезапуска подов. Настройки, которые меняются в интерфейсе, на этой странице не описаны - они хранятся в базе.
Обозначения: "Обязательный" - без значения компонент не работает или работает небезопасно; "Секрет" - значение хранится только в Kubernetes Secret.
Core
Переменные читает образ sf-core-back во всех режимах. Отдельно отмечено, каким ещё образам Core переменная нужна.
Режим и процессы
| Параметр | Назначение | Формат | По умолчанию | Обязательный | Секрет |
|---|---|---|---|---|---|
MODE |
какой процесс поднять: init - миграции, статика, администратор; web - интерфейс и API на 8000; importer - приём отчётов на 8001; worker - Celery, очередь appsecpanel_; beat - планировщик; all - подготовка и все четыре процесса в одном контейнере |
строка | all |
да, в Kubernetes - свой у каждого компонента | нет |
GUNICORN_WORKERS |
процессов gunicorn интерфейса и API | число | 1 (в Kubernetes 4) |
нет | нет |
GUNICORN_THREADS |
потоков на процесс | число | 1 (в Kubernetes 4) |
нет | нет |
IMPORTER_ |
процессов gunicorn приёма отчётов | число | 1 (в Kubernetes 2) |
нет | нет |
IMPORTER_ |
потоков на процесс приёма отчётов | число | 1 (в Kubernetes 4) |
нет | нет |
ADMIN_USER |
логин первого администратора, создаётся в режимах init и all |
строка | admin |
нет | нет |
ADMIN_EMAIL |
почта первого администратора | задана в образе | рекомендуется | нет | |
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:// |
пусто | да | да | sf-core-back, sf-core-importer, sf-core-db-helper, sf-core-jira-helper |
BROKER_ |
не проверять сертификат брокера | 1 или True |
выключено | нет | нет | те же |
AUTOMATION_ |
слотов помощника БД под автоматизацию | число | 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_ |
секрет Django | строка, например openssl rand -hex 32 |
заглушка django_ |
да | да | 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:// |
нет | нет | sf-core-back |
LICENSE_ |
открытый ключ сервера лицензий: проверка подписи ключа лицензии | PEM | заглушка | да | нет | sf-core-back, sf-core-db-helper |
LICENSE_ |
период сверки лицензии с сервером по расписанию | секунды | 300 |
нет | нет | sf-core-back |
LICENSE_ |
сверка от работы пользователей - не чаще раза в столько секунд на процесс gunicorn | секунды | 60 |
нет | нет | sf-core-back |
LICENSE_ |
таймаут запроса к серверу лицензий | секунды | 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_ |
не проверять сертификат брокера | True или False |
False |
нет | нет |
REDIS_HOST |
адрес Redis; порт всегда 6379 | имя или IP | redis |
да | нет |
REDIS_PASSWORD |
пароль Redis | строка, может быть пустой | нет значения | да, переменная должна быть задана | да |
REDIS_SSL |
TLS к Redis | True или False |
False |
нет | нет |
REDIS_ |
проверять сертификат Redis | True или False |
True |
нет | нет |
DOCKER_ |
ключ шифрования паролей реестров в базе Radar | ровно 16 или 32 символа ASCII, например openssl rand -hex 16 |
пусто | да | да |
ACCESS_TOKEN |
токен Radar. С ним Radar back раз в 10 с проверяет таймауты пайплайнов и раз в час собирает статистику длительности джоб | строка | пусто | да | да |
API_WORKERS |
процессов uvicorn | число | 4 |
нет | нет |
FIXTURE_ |
пакет каталога джоб | строка | 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_ |
не проверять сертификат брокера | True или False |
False |
нет | нет |
ACCESS_TOKEN |
токен Radar для обращений к API Radar back | строка | пусто | да | да |
AUDITOR_HOST |
адрес API Radar back | URL без слеша в конце | http:// |
нет | нет |
HTTP_ |
не проверять сертификат Core при отправке отчёта | True или False |
False |
нет | нет |
REDIS_HOST |
адрес Redis | имя или IP | redis |
да | нет |
REDIS_PASSWORD |
пароль Redis | строка | пусто | если у Redis есть пароль | да |
REDIS_SSL |
TLS к Redis | True или False |
False |
нет | нет |
REDIS_ |
проверять сертификат Redis | True или False |
True |
нет | нет |
MAX_ |
верхняя граница автомасштабирования пайплайн-воркера (--autoscale 1,N): столько пайплайнов под выполняет одновременно |
число | 2 (в расчёте ресурсов - 3) |
нет | нет |
UTILITY_IMAGE |
служебный образ: чтение отчёта, артефакты, копирование между томами | образ с реестром и тегом | alpine |
в закрытом контуре - да | нет |
LOG_LEVEL |
уровень журнала пайплайн-воркера | INFO, DEBUG и т. п. |
INFO |
нет | нет |
DOCKER_HOST |
демон Docker для контейнеров джоб | URL сокета | unix:/// |
нет | нет |
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>