Переменные окружения: backend и worker¶
Справочник всех переменных окружения Go-компонентов Security Hub: backend (HTTP API) и worker (фоновые задачи). Worker запускается тем же config.Load(), что и backend, поэтому читает тот же набор переменных; в колонке «Компонент» отмечено, где переменная реально влияет.
Колонка «По умолчанию»: [code] — литерал в Go, [chart] — значение из Helm-чарта (charts/security-scan-hub/values.yaml). Если значения расходятся, указаны оба.
Секреты (
DB_PASSWORD,JWT_SECRET,KEYCLOAK_CLIENT_SECRET,LOCAL_ADMIN_PASSWORD,LLM_API_KEYи т.п.) в Helm передаются черезsecretKeyRef(k8s Secret), а не plain values. В production задавайте их через секрет-менеджер (Vault / External Secrets / SealedSecrets).
Аутентификация, авторизация, SSO¶
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
AUTH_MODE |
Режим аутентификации | LOCAL | SSO (иное → аварийный останов) |
SSO [code] / LOCAL [chart] |
оба |
SSO_PROVIDERS |
Список активных провайдеров через запятую. Каждый даёт кнопку на странице входа. keycloak настраивается через KEYCLOAK_*, остальные — через OIDC_<ИМЯ>_* |
список через запятую, имена строчными | keycloak |
оба |
APP_ENV |
Окружение. В не-development включаются проверки https и обязательность секретов |
development | production | test |
production [code] |
оба |
ALLOW_DEV_MODE |
Разрешает обход аутентификации по служебному токену разработки. Требует одновременно APP_ENV=development. Принимается только точное значение true |
true | false |
false |
backend |
BOOTSTRAP_ADMIN_EMAILS |
Адреса, получающие роль администратора при первом входе через IdP. Нужен, чтобы завести первого администратора, не выключая SSO. Сравнение регистронезависимое; адрес без подтверждения провайдером роль не получает. При старте пишется предупреждение — уберите переменную, как только администратор заведён | список адресов через запятую | "" |
backend |
KEYCLOAK_URL |
Внутренний URL Keycloak (backend → KC) | URL | http://localhost:9090 [code] / "" [chart] |
оба |
KEYCLOAK_PUBLIC_URL |
Публичный URL Keycloak (редиректы браузера). Пусто → берётся KEYCLOAK_URL |
URL | "" |
оба |
KEYCLOAK_REALM |
Realm Keycloak | строка | securityhub [code] / "" [chart] |
оба |
KEYCLOAK_CLIENT_ID |
Client ID в Keycloak | строка | security-hub [code] / "" [chart] |
оба |
KEYCLOAK_CLIENT_SECRET |
Client secret. При AUTH_MODE=SSO и не-dev — обязательная (fatal без неё) |
строка (секрет) | change-me [code] |
оба |
KEYCLOAK_JWKS_URL |
Переопределение jwks_uri из OIDC discovery (Docker/K8s split network) |
URL; в prod обязан https:// |
"" |
оба |
KEYCLOAK_TOKEN_URL |
Переопределение token_endpoint |
URL; в prod обязан https:// |
"" |
оба |
KC_JWKS_URL |
JWKS для валидации внешних Keycloak JWT (transparent SSO / atom-idp) | URL; в prod обязан https:// |
"" |
оба |
KC_ISSUER |
Ожидаемый iss во внешнем JWT |
URL; в prod обязан https:// |
"" |
оба |
KC_AUDIENCES |
Разрешённые aud (client_id) внешних JWT |
CSV-список | "" |
оба |
KC_AUTO_PROVISION |
Автосоздание пользователей в БД при первом входе по внешнему JWT | true | false |
false |
оба |
FEATURE_SECURITY_HUB_INTEGRATION |
Мастер-флаг прозрачного SSO + эндпоинта /findings/by-correlation-keys |
true | false |
false |
оба |
ATOM_IDP_BASE_URL |
Доп. CORS-origin для atom-idp | URL | "" |
backend |
Generic OIDC-провайдеры (OIDC_<NAME>_*)¶
Для каждого провайдера, указанного в SSO_PROVIDERS (кроме keycloak), задаётся набор переменных с префиксом OIDC_<UPPER(NAME)>_. Пример: провайдер azure → переменные OIDC_AZURE_*.
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
OIDC_<NAME>_DISPLAY_NAME |
Метка кнопки входа в UI | строка | имя провайдера | оба |
OIDC_<NAME>_DISCOVERY_URL |
URL OIDC well-known (/.well-known/openid-configuration). Обязательна, если не заданы все эндпоинт-overrides явно |
URL | "" |
оба |
OIDC_<NAME>_CLIENT_ID |
Client ID в IdP | строка | "" |
оба |
OIDC_<NAME>_CLIENT_SECRET |
Client Secret | строка (секрет) | "" |
оба |
OIDC_<NAME>_SCOPES |
Запрашиваемые scopes — через пробел | строка | openid profile email |
оба |
OIDC_<NAME>_AUTO_PROVISION |
Автосоздание пользователей в БД при первом входе (роль viewer). false — принимать только уже существующих |
true | false |
true |
оба |
OIDC_<NAME>_TRUST_EMAIL |
Доверять email из IdP как верифицированному, даже если email_verified отсутствует в токене. Обязательна для Microsoft Entra ID (Azure AD v2) — без неё любой вход через Azure завершается 403 |
true | false |
false |
оба |
OIDC_<NAME>_AUTH_URL |
Переопределение authorization эндпоинт | URL | из discovery | оба |
OIDC_<NAME>_TOKEN_URL |
Переопределение token эндпоинт | URL | из discovery | оба |
OIDC_<NAME>_JWKS_URL |
Переопределение jwks_uri | URL | из discovery | оба |
OIDC_<NAME>_ISSUER |
Переопределение issuer | URL | из discovery | оба |
OIDC_<NAME>_END_SESSION_URL |
Переопределение end_session_endpoint | URL | из discovery | оба |
Разрешение адресов: явное переопределение важнее сведений из документа обнаружения; если не хватает и того и другого — старт прерывается. Адрес возврата, который нужно зарегистрировать у провайдера:
{FRONTEND_URL}/auth/callback.
Токены и доступ¶
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
JWT_SECRET |
Секрет подписи внутренних токенов. Вне development — обязательная, иначе аварийный останов |
строка (секрет) | change-this-secret-key [code] |
оба |
LICENSE_SECRET |
Отдельный секрет для лицензионных данных. Если не задан — берётся JWT_SECRET. Задавайте явно на новых установках, чтобы JWT_SECRET можно было менять независимо |
строка (секрет) | значение JWT_SECRET |
оба |
ACCESS_TOKEN_TTL_MINUTES |
Срок жизни токена доступа | целое ≥ 1 | 15 |
backend |
REFRESH_TOKEN_TTL_DAYS |
Срок жизни токена обновления | целое ≥ 1 | 7 |
backend |
LOCAL_ADMIN_PASSWORD |
Пароль первого администратора в режиме LOCAL. Без него на чистой базе войти невозможно |
строка (секрет) | "" |
backend |
ALLOWED_ORIGINS |
Список разрешённых источников для межсайтовых запросов. Значение * отклоняется |
адреса через запятую | http://localhost:3000,http://localhost:8084 |
backend |
TRUSTED_PROXIES |
Адреса и подсети обратных прокси, которым разрешено подменять адрес клиента заголовками X-Forwarded-For / X-Real-IP. Пусто — не доверять никому: адресом клиента считается адрес TCP-соединения |
список IP или CIDR через запятую | "" |
backend |
TRUSTED_PROXIES и ограничение частоты
По умолчанию заголовки пересылки игнорируются полностью — это безопасно, потому что иначе клиент мог бы подделать свой адрес и обойти ограничение частоты обращений к эндпоинтам входа, а в журнале действий остался бы чужой адрес.
Обратная сторона: если Hub стоит за обратным прокси и переменная не задана, все запросы будут выглядеть пришедшими с адреса прокси — ограничение частоты станет общим на всех. Задавайте её, когда прокси действительно есть, и не задавайте, когда его нет.
База данных¶
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
DB_HOST |
Хост PostgreSQL | hostname | localhost [code] |
оба |
DB_PORT |
Порт PostgreSQL | число | 5432 |
оба |
DB_NAME |
Имя БД | строка | securityhub |
оба |
DB_USER |
Пользователь БД | строка | securityhub |
оба |
DB_PASSWORD |
Пароль базы. Вне development — обязательная, иначе аварийный останов |
строка (секрет) | securityhub123 [code] |
оба |
DB_SSLMODE |
Режим TLS (disable, require, verify-full и другие значения libpq) |
перечисление | disable |
оба |
DB_MAX_OPEN_CONNS |
Верхний предел соединений с базой на процесс | целое ≥ 1 | 25 |
оба |
DB_MAX_IDLE_CONNS |
Сколько соединений держать открытыми в простое | целое ≥ 0 | 5 |
оба |
DB_CONN_MAX_LIFETIME_MINUTES |
Максимальное время жизни соединения | целое ≥ 1 | 30 |
оба |
Предел соединений действует на процесс. Каждая реплика backend и worker открывает свой пул: при пяти репликах с настройками по умолчанию это уже 125 соединений — сверяйтесь с
max_connectionsбазы.
LLM / Sandbox (активная верификация находок)¶
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
LLM_BASE_URL |
Базовый URL LLM API | URL | "" |
оба |
LLM_API_KEY |
Ключ LLM API | строка (секрет) | "" |
оба |
LLM_MODEL |
Имя модели | строка | glm-4-plus |
оба |
LLM_DRY_RUN |
Не обращаться к LLM (заглушка) | true | false |
false [code] / true [chart] |
оба |
LLM_FALSE_POSITIVE_THRESHOLD |
Порог уверенности для отсева false-positive | float 0..1 |
0.9 |
оба |
LLM_WORKERS |
Кол-во LLM-worker | целое | 5 [code] |
оба |
LLM_PROMPTS_DIR |
Каталог с промптами | путь | "" |
оба |
LLM_REQUEST_TIMEOUT_SECONDS |
Таймаут запроса к LLM | целое (сек) | 180 |
оба |
LLM_TEMPERATURE |
Температура запросов к модели. Значение вне диапазона или нечисловое заменяется умолчанием — с сообщением в журнале, а не молча | 0.0…2.0 |
0.1 |
оба |
LLM_CONFIRM_BEFORE_DISMISS |
Применять закрывающий вердикт модели только после подтверждения повторным вызовом | true | false |
true |
оба |
LLM_RISK_ACCEPTED_TTL_DAYS |
Срок, на который модель принимает риск по находке. 0 — не принимать |
целое ≥ 0 | 180 |
оба |
SANDBOX_TYPE |
Тип песочницы | "" (выкл) | docker | kubernetes |
"" [code] / worker kubernetes [chart] |
worker |
SANDBOX_IMAGE |
Docker-образ песочницы | image ref | dexionius/sshub-sandbox-tools:latest |
оба |
SANDBOX_TIMEOUT_SECONDS |
Таймаут выполнения в песочнице | целое (сек) | 120 |
оба |
SANDBOX_OUTPUT_LIMIT_KB |
Лимит вывода песочницы | целое (КБ) | 10 |
оба |
SANDBOX_NAMESPACE |
k8s namespace для pod песочницы | строка | "" (= namespace релиза) |
оба |
SANDBOX_KUBECONFIG |
Путь к kubeconfig; пусто → in-cluster | путь | "" |
оба |
SANDBOX_WG_SECRET_NAME |
Имя k8s Secret с WireGuard-ключами | строка | "" |
оба |
SANDBOX_WG_POD_IP |
WireGuard IP pod (CIDR) | CIDR | 10.200.0.3/32 |
оба |
SANDBOX_WG_PRIVATE_KEY |
WireGuard приватный ключ (docker/local) | строка (секрет) | "" |
оба |
SANDBOX_WG_SERVER_PUBLIC_KEY |
WireGuard публичный ключ сервера | строка | "" |
оба |
SANDBOX_WG_SERVER_ENDPOINT |
WireGuard эндпоинт сервера | host:port | "" |
оба |
Уведомления¶
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
NOTIFICATIONS_DRY_RUN |
Не отправлять уведомления по-настоящему | true | false |
false |
worker |
FRONTEND_BASE_URL |
Базовый адрес интерфейса для ссылок внутри уведомлений | адрес | http://localhost:3000 |
worker |
С 0.33 все каналы доставки — плагины. Токены ботов, адреса вебхуков и пороги задаются в настройках канала на карточке проекта, а не переменными окружения; сами плагины устанавливаются администратором. Переменные
MATTERMOST_NOTIFICATION_WORKERS,MAXRU_NOTIFICATION_WORKERSиMATTERMOST_ALLOW_LOCAL_DIALудалены — см. Уведомления.
Электронная почта¶
Параметры SMTP самого Hub. Они действуют, пока плагин email-notifier не
задал собственных: цепочка — проект → установка плагина → эти переменные.
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
SMTP_HOST |
Сервер отправки. Пусто — отправка по почте не работает | имя узла | "" |
worker |
SMTP_PORT |
Порт | число | 587 |
worker |
SMTP_USERNAME |
Учётная запись | строка | "" |
worker |
SMTP_PASSWORD |
Пароль | строка (секрет) | "" |
worker |
SMTP_FROM |
Адрес отправителя | адрес почты | "" |
worker |
SMTP_TLS_MODE |
Режим TLS: starttls (обычно порт 587) или прямой TLS |
строка | starttls |
worker |
Параллелизм очередей¶
| Переменная | Очередь | По умолчанию |
|---|---|---|
DISPATCHER_WORKERS |
Очередь по умолчанию: диспетчер событий, разбор отчётов | 10 |
SARIF_PROCESSING_WORKERS |
Разбор загруженных отчётов. Отдельная очередь: пик памяти ингеста больше не задаётся числом, подобранным под рассылку уведомлений | 4 |
EMAIL_NOTIFICATION_WORKERS |
Уведомления по электронной почте встроенным путём | 5 |
FINDING_COPY_WORKERS |
Копирование находок между продуктами | 4 |
DUAL_VERIFY_WORKERS |
Перепроверка вторым источником | 2 |
PLUGIN_FINDING_SOURCE_SYNC_WORKERS |
Опрос источников-плагинов | 4 |
Все значения — для процесса worker. Ноль не допускается: очередь с нулевым
параллелизмом не обрабатывается. Число обработчиков очереди обогащения
находок отдельной переменной не имеет — оно на единицу меньше
PLUGIN_RUNNER_PER_PLUGIN_LIMIT.
Учёт задач и исходящие обращения¶
Встроенная интеграция с Jira удалена в 0.33: задачи ведут плагины-провайдеры, их настройки живут в конфигурации плагина для проекта. Переменных окружения у самой интеграции почти не осталось.
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
TICKET_STATUS_POLL_INTERVAL_MINUTES |
Период опроса статусов задач у провайдера — второй канал закрытия там, где трекер не дотягивается до Hub | целое (мин) | 60 |
worker |
TICKET_STATUS_POLL_BATCH_SIZE |
Потолок находок за один прогон опроса | целое | 500 |
worker |
HUB_BASE_URL |
Публичный адрес Hub для ссылок и адресов обратного вызова | URL | "" |
оба |
FEATURE_FINDING_COPY |
Копирование находок между продуктами | true | false |
false |
оба |
SSRF-гард: по подсистемам, а не одним рычагом¶
Раньше JIRA_ALLOW_HTTP и JIRA_ALLOW_LOCAL_DIAL управляли исходящими
обращениями и не-Jira клиентов. Теперь у каждой подсистемы свои переменные с
её префиксом:
| Префикс | Подсистема |
|---|---|
VCS_ |
Статусы коммитов и комментарии в GitHub/GitLab |
RESCAN_ |
Обращения к сканерам при ручной перепроверке |
IAC_SOURCE_ |
Получение исходников для сканера инфраструктурного кода |
Для каждого префикса действуют три переменные: <ПРЕФИКС>_ALLOW_HTTP,
<ПРЕФИКС>_ALLOW_LOCAL_DIAL и <ПРЕФИКС>_HOST_ALLOWLIST (список узлов через
запятую). По умолчанию все три пусты: только https и только публичные
адреса.
Если в окружении остались JIRA_ALLOW_*, Hub один раз на подсистему пишет
предупреждение: переменная больше не действует, задайте собственную. Это
ужесточение, и молчать о нём значило бы получить «интеграция сломалась после
обновления» вместо «настройку переименовали».
Исходящие обращения плагинов ограничиваются отдельно — PLUGIN_EGRESS_*, см.
Платформу плагинов.
Dual-verify (Hub ↔ DomainScope)¶
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
FEATURE_DUAL_VERIFY |
Мастер-флаг dual_confirm flow | true | false |
false |
оба |
DOMAINSCOPE_VERIFY_URL |
Эндпоинт сканера для POST verify-находка. В prod обязан https:// |
URL | "" |
оба |
DOMAINSCOPE_VERIFY_API_KEY |
Outbound API-key Hub→DomainScope | строка (секрет) | "" |
оба |
DOMAINSCOPE_VERIFY_HMAC_SECRET |
HMAC-подпись исходящих запросов | строка (секрет) | "" |
оба |
SCANNER_CALLBACK_API_KEY |
Inbound API-key для callback от сканера | строка (секрет) | "" |
оба |
SCANNER_CALLBACK_HMAC_SECRET |
Primary HMAC inbound callback (32+ байт) | строка (секрет) | "" |
оба |
SCANNER_CALLBACK_HMAC_SECRET_PREVIOUS |
Доп. HMAC-ключ на окно ротации | строка (секрет) | "" |
оба |
DUAL_VERIFY_CALLBACK_BASE_URL |
Публичный URL Hub для генерации callback_url. При FEATURE_DUAL_VERIFY=true пустой → fail-fast |
URL | "" |
оба |
DUAL_VERIFY_SCANNER_TIMEOUT |
Таймаут ожидания callback | duration | 60s |
оба |
DUAL_VERIFY_SCHEDULER_INTERVAL |
Период тика scheduler | duration | 15m |
оба |
DUAL_VERIFY_BATCH_SIZE |
Кандидатов за тик | целое | 100 |
оба |
DUAL_VERIFY_MAX_CONCURRENT |
Глобальный cap конкурентности | целое | 5 |
оба |
DUAL_VERIFY_PER_PROJECT_HOURLY_CLOSURE_CAP |
Лимит закрытий/час на проект | целое | 10 |
оба |
DUAL_VERIFY_RETRY_BACKOFF |
Задержки между retry | CSV duration | 30m,2h,6h |
оба |
DUAL_VERIFY_INCONCLUSIVE_COOLDOWN |
Окно перед re-enqueue inconclusive | duration | 720h |
оба |
DUAL_VERIFY_REAPER_INTERVAL |
Период тика reaper | duration | 1h |
оба |
Manual Rescan (Hub → сканеры)¶
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
FEATURE_MANUAL_RESCAN |
Включить ручной rescan | true | false |
false |
backend |
DOMAINSCOPE_RESCAN_URL |
URL DomainScope для rescan/probe | URL | "" |
оба |
DOMAINSCOPE_RESCAN_API_KEY |
API-key DomainScope rescan | строка (секрет) | "" |
оба |
IAC_SCANNER_RESCAN_URL |
URL iac-scanner для rescan | URL | "" |
оба |
IAC_SCANNER_RESCAN_API_KEY |
API-key iac-scanner rescan | строка (секрет) | "" |
оба |
RESCAN_TIMEOUT_SECONDS |
Таймаут rescan/probe-запроса | целое (сек) | 10 |
оба |
RESCAN_HOST_ALLOWLIST |
Allowlist хостов rescan (SSRF-гард) | список | "" |
оба |
Автоматическое закрытие исправленных находок¶
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
FEATURE_AUTO_VERIFY_FIXES |
Глобальное разрешение автоматически закрывать исправленные находки. Одно из трёх условий: нужны ещё признак в настройках проекта и verify_fixes=true при загрузке отчёта |
true | false |
false |
оба |
AUTO_VERIFY_PROBE_RETRIES |
Сколько раз подряд проверять отсутствие находки внутри одной проверки. Любой ответ «на месте» или «неопределённо» немедленно оставляет находку открытой | целое ≥ 1 | 3 |
worker |
AUTO_VERIFY_ABSENT_THRESHOLD |
Сколько последовательных проверок должны дать «отсутствует» до закрытия. Любое обнаружение сбрасывает счётчик. Значение 1 возвращает прежнее поведение «закрывать по одному наблюдению» |
целое ≥ 1 | 3 |
worker |
Не ставьте AUTO_VERIFY_ABSENT_THRESHOLD=1
Именно такое поведение было раньше и привело к массовому ложному закрытию настоящих находок: значительная часть вернулась при следующем сканировании. Два уровня защиты — повторы внутри проверки и кворум между проверками — добавлены как реакция на этот случай и по отдельности недостаточны.
Сервер, хранилище, логи, лимиты, лицензия¶
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
SERVER_PORT |
Порт HTTP-сервера | число | 8080 [code] / 8082 [chart] |
backend |
FRONTEND_URL |
URL фронта (редиректы, ссылки, fallback callback) | URL | http://localhost:3000 [code] / https://hub.example.com [chart] |
оба |
STORAGE_PATH |
Каталог хранения отчётов | путь | ./storage [code] / /app/storage/reports [chart] |
оба |
LOGS_PATH |
Каталог логов | путь | ./logs |
оба |
LOG_MAX_SIZE_MB |
Размер лог-файла до ротации | целое ≥1 | 50 |
оба |
LOG_MAX_BACKUPS |
Кол-во хранимых ротированных логов | целое ≥0 | 5 |
оба |
LOG_MAX_AGE_DAYS |
Макс. возраст ротированного лога | целое ≥0 | 30 |
оба |
LOG_COMPRESS |
Сжимать ротированные журналы | true | false |
true |
оба |
LOG_LEVEL |
Уровень подробности: debug, info, warn, error. Переопределяет уровень, выведенный из APP_ENV, не меняя формат вывода — можно включить подробный вывод в промышленной среде для диагностики |
строка | по APP_ENV: development → debug, иначе info |
оба |
LICENSE_SERVER_URL |
Адрес сервера лицензий. Пусто — проверка не выполняется | адрес | "" |
оба |
MAX_UPLOAD_SIZE_MB |
Предел размера загружаемого файла. Обратите внимание: предел разбора — 50 МиБ, он ниже | целое ≥ 1 | 500 |
backend |
RATE_LIMIT_API |
Общий пол по адресу клиента, запросов в минуту | целое ≥ 1 | 600 |
backend |
RATE_LIMIT_API_USER |
Второй слой лимита — по личности, запросов в минуту. Работает вместе с общим полом по адресу | целое ≥ 1 | 300 |
backend |
RATE_LIMIT_API_SERVICE_ACCOUNT |
То же для ключа сервисного аккаунта | целое ≥ 1 | 1200 |
backend |
TRUSTED_PROXIES |
Прокси, чьему X-Forwarded-For можно верить. Без списка адрес клиента подделывается заголовком в обход лимитера |
список адресов/сетей | "" |
backend |
HTTP_REQUEST_TIMEOUT_SECONDS |
Потолок времени HTTP-запроса. Ставит дедлайн контексту: зависший запрос отменяется и отдаёт соединение пулу. Долгие по построению маршруты (загрузка отчёта, выгрузки, экспорт) исключены. 0 выключает |
целое ≥ 0 | 120 |
backend |
MIGRATION_LOCK_WAIT_SECONDS |
Сколько реплика ждёт блокировку миграций при старте | целое ≥ 1 | 180 |
оба |
MIGRATIONS_DIR |
Каталог с SQL-миграциями. Пусто — поиск по встроенному списку путей. Нужен только при нестандартной раскладке файлов (пакеты .deb/.rpm) |
путь | "" |
оба |
LOG_FILE_SINK_ENABLED |
Писать журнал в файл (LOGS_PATH) дополнительно к стандартному выводу. В Kubernetes ставьте false: права на смонтированном томе обычно не совпадают с пользователем контейнера, ротация падает, и отказ виден только как строка на каждую запись — см. Эксплуатацию |
true | false |
true |
оба |
RATE_LIMIT_AUTH |
Частота обращений к эндпоинтам входа, запросов в минуту | целое ≥ 1 | 10 |
backend |
CLEANUP_RETENTION_COMPLETED_DAYS |
Хранение обработанных отчётов, суток | целое ≥ 0 | 7 |
worker |
CLEANUP_RETENTION_FAILED_DAYS |
Хранение отчётов с ошибкой разбора, суток | целое ≥ 0 | 30 |
worker |
CLEANUP_RETENTION_PENDING_DAYS |
Хранение необработанных отчётов, суток | целое ≥ 0 | 0 |
worker |
CLEANUP_RETENTION_ORPHAN_HOURS |
Через сколько часов удалять файлы без записи в базе. 0 отключает |
целое ≥ 0 | 24 |
worker |
CLEANUP_BATCH_SIZE |
Размер порции при очистке — и при выборке из базы, и при обходе каталога. Определяет память на одну порцию. 0 — значение по умолчанию из кода; значения выше 10 000 обрезаются |
целое 0…10 000 | 0 |
worker |
CLEANUP_DRY_RUN |
Очистка без удаления: только сообщения о том, что было бы удалено | true | false |
false |
worker |
REFRESH_CLEANUP_RETENTION_DAYS |
Хранение токенов обновления, суток | целое ≥ 1 | 30 |
worker |
Наблюдаемость¶
| Переменная | Назначение | Значения | По умолчанию | Компонент |
|---|---|---|---|---|
METRICS_ENABLED |
Отдавать метрики Prometheus | true | false |
true |
все |
METRICS_PORT |
Отдельный порт метрик, не совпадает с SERVER_PORT. Свой реестр у каждого долгоживущего процесса: backend, worker, pentagi-worker |
число | 9090 |
все |
METRICS_COLLECT_INTERVAL_SECONDS |
Период сбора бизнес-показателей (находки по критичности и статусу, открытые нарушения сроков, очередь задач). Считает только backend. Минимум 10 | целое ≥ 10 | 60 |
backend |
OTEL_EXPORTER_OTLP_ENDPOINT |
Адрес коллектора трейсов. Пусто — экспорт выключен, но спаны создаются и контекст переносится. Схема решает транспорт: http:// — без TLS, https:// — с TLS. Адрес без схемы роняет старт |
URL | "" |
все |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT |
То же, приоритетнее базовой переменной | URL | "" |
все |
OTEL_TRACES_SAMPLER_ARG |
Доля трейсов, начинаемых здесь. Решение вышестоящего сервиса сохраняется — иначе трейсы получаются с дырами | 0.0…1.0 |
1.0 |
все |
UPDATE_CHECK_ENABLED |
Проверять, вышла ли новая версия, и показывать уведомление | true | false |
false |
backend |
UPDATE_CHECK_URL |
Адрес источника сведений о версиях. Умолчания нет намеренно | URL | "" |
backend |
UPDATE_CHECK_INTERVAL_HOURS |
Период проверки, не чаще раза в час | целое ≥ 1 | 24 |
backend |
RBAC_POLICY_REFRESH_SECONDS |
Период сверки прав с базой. Политики живут в памяти процесса: без перечита правки с других реплик и мимо API не подхватываются до перезапуска. 0 выключает |
целое ≥ 0 | 15 |
оба |
RESCAN_AUTH_PROBE_SECONDS |
Период пробы: принимает ли сканер перепроверки общий ключ. Без пробы расхождение ключей видно только при первом нажатии кнопки. 0 выключает |
целое ≥ 0 | 3600 |
backend |
Порт метрик не публикуется наружу
Аутентификации у него нет (сбор метрик не носит сессию пользователя), а ряды описывают внутреннее состояние: объёмы находок по критичности, вердикты сканеров, заблокированные обращения. В Docker Compose порт намеренно не пробрасывается на хост, в Kubernetes сбор идёт напрямую с пода, а ingress на него не маршрутизирует.
Платформа плагинов¶
| Переменная | Назначение | По умолчанию |
|---|---|---|
PLUGIN_RUNNER_GLOBAL_LIMIT |
Предел одновременно работающих процессов плагинов | 20 |
PLUGIN_RUNNER_PER_PLUGIN_LIMIT |
Предел одновременных запусков одного плагина | 4 |
PLUGIN_RUNNER_KEEP_WARM_SECONDS |
Сколько держать процесс готовым после работы | 300 |
WASM_RUNNER_BINARY_PATH |
Путь к исполняемому файлу среды исполнения плагинов | значение из кода |
ENRICH_TAGS_RATE_LIMIT_PER_MINUTE |
Предел ручных запусков обогащения находки | 10 |
PLUGIN_EGRESS_ALLOWLIST |
Узлы, к которым плагинам разрешено обращаться | "" |
PLUGIN_EGRESS_ALLOW_HTTP |
Разрешить плагинам схему http |
false |
PLUGIN_EGRESS_ALLOW_LOCAL_DIAL |
Разрешить плагинам обращения к локальным и внутренним адресам | false |
PLUGIN_CATALOG_ALLOWLIST |
Разрешённые адреса каталогов плагинов | "" |
PLUGIN_CATALOG_ALLOW_HTTP |
Разрешить http для каталога |
false |
PLUGIN_CATALOG_ALLOW_LOCAL_DIAL |
Разрешить локальные адреса для каталога | false |
PLUGIN_OCI_ALLOWLIST |
Разрешённые реестры образов, откуда ставятся плагины | "" |
PLUGIN_OCI_ALLOW_HTTP |
Разрешить http для реестра |
false |
PLUGIN_OCI_ALLOW_LOCAL_DIAL |
Разрешить локальные адреса для реестра | false |
Нативные плагины (Tier 2)¶
Отдельный процесс на плагин, общение по gRPC. Значения по умолчанию подобраны так, чтобы аварийно завершающийся плагин не перезапускался бесконечно и не оставался выключенным навсегда.
| Переменная | Назначение | По умолчанию |
|---|---|---|
PLUGIN_NATIVE_GLOBAL_LIMIT |
Предел одновременно живущих процессов нативных плагинов | 10 |
PLUGIN_NATIVE_MEMORY_LIMIT_MB |
Предел памяти на процесс | 256 |
PLUGIN_NATIVE_RPC_TIMEOUT_SECONDS |
Тайм-аут вызова плагина | 15 |
PLUGIN_NATIVE_SHUTDOWN_GRACE_SECONDS |
Сколько ждать штатной остановки | 10 |
PLUGIN_NATIVE_MAX_CRASH_RESTARTS |
Перезапусков после падения в пределах окна | 10 |
PLUGIN_NATIVE_CRASH_WINDOW_SECONDS |
Длина окна подсчёта падений | 3600 |
PLUGIN_NATIVE_MAX_RESTARTS_PER_DAY |
Потолок перезапусков за сутки | 50 |
PLUGIN_NATIVE_RESTART_BACKOFF_BASE_SECONDS |
Начальная пауза перед перезапуском | 5 |
PLUGIN_NATIVE_RESTART_BACKOFF_MAX_SECONDS |
Предельная пауза | 300 |
PLUGIN_NATIVE_LEASE_TTL_SECONDS |
Срок аренды процесса — при нескольких репликах плагин держит ровно одна | 30 |
PLUGIN_NATIVE_LEASE_RENEWAL_INTERVAL_SECONDS |
Период продления аренды | 5 |
PLUGIN_NATIVE_LEASE_RENEWAL_TIMEOUT_SECONDS |
Тайм-аут продления | 5 |
PLUGIN_NATIVE_LEASE_CLAIM_GRACE_SECONDS |
Отсрочка перед перехватом чужой аренды | 5 |
PLUGIN_NATIVE_LEASE_SELF_FENCE_SECONDS |
Через сколько реплика сама снимает свой процесс, потеряв аренду | 20 |
PLUGIN_NATIVE_ROUTE_RATE_LIMIT_DEFAULT_PER_MINUTE |
Частота обращений к маршрутам плагина по умолчанию | 60 |
PLUGIN_NATIVE_ROUTE_RATE_LIMIT_MAX_PER_MINUTE |
Потолок, выше которого плагин запросить не может | 600 |
PLUGIN_NATIVE_SANDBOX_ENABLED |
Изоляция средствами ОС. Выкатывается двумя шагами: сначала профиль, потом флаг | false |
Подробнее о модели исполнения и разрешениях — Плагины.
Автономное тестирование на проникновение¶
Отдельная возможность, выключенная по умолчанию: находки в состояниях «принятый риск» и «не будет исправлено», доступные извне, передаются во внешнюю систему автономного тестирования, а её результат возвращается в Hub новыми находками.
| Переменная | Назначение | По умолчанию |
|---|---|---|
FEATURE_PENTAGI_INTEGRATION |
Общий переключатель | false |
PENTAGI_BASE_URL |
Адрес внешней системы. В промышленной среде обязан быть https |
"" |
PENTAGI_API_TOKEN |
Токен доступа | "" |
PENTAGI_PROVIDER |
Языковая модель, используемая внешней системой | "" |
PENTAGI_STATUSES |
Состояния находок, которые берутся в работу | risk_accepted,wont_fix |
PENTAGI_SUBMIT_INTERVAL |
Период постановки новых заданий | 1h |
PENTAGI_POLL_INTERVAL |
Период опроса выполняющихся заданий | 5m |
PENTAGI_MAX_CONCURRENT_FLOWS |
Предел одновременных заданий | 3 |
PENTAGI_PER_TICK_SUBMIT_CAP |
Предел новых заданий за один такт | 5 |
PENTAGI_COOLDOWN |
Окно, в течение которого одна и та же цель не берётся повторно | 168h |
PENTAGI_DRY_RUN |
Готовить задания, но не отправлять | false |
PENTAGI_EXTRA_ROE |
Дополнительные правила проведения работ, через \| |
"" |
PENTAGI_HTTP_TIMEOUT |
Тайм-аут обращений | 30s |
PENTAGI_TLS_INSECURE |
Отключить проверку сертификата. В промышленной среде запрещено — старт прервётся | false |
PENTAGI_LLM_EXTRACT |
Преобразовывать отчёт в структурированные находки языковой моделью | true |
PENTAGI_INGEST_WORKERS |
Параллелизм приёма результатов | значение из кода |
Это активное воздействие
Возможность запускает автоматизированное тестирование на проникновение против ваших же систем. Включайте только с согласованными правилами проведения работ и заведомо верным перечнем целей.
Устаревшие переменные¶
Читаются только для того, чтобы предупредить оператора записью в журнале. Расписание очистки задаётся в коде и этими переменными не управляется.
| Переменная | Прежнее назначение | Компонент |
|---|---|---|
CLEANUP_SCHEDULE |
Расписание очистки отчётов — игнорируется | worker |
GOOGLE_OAUTH_CLIENT_ID, GOOGLE_OAUTH_CLIENT_SECRET, GOOGLE_OAUTH_REDIRECT_URL |
Отдельная ветка входа через Google. Её больше нет: Google подключается как обычный OIDC-провайдер через SSO_PROVIDERS и OIDC_<ИМЯ>_* |
оба |
REFRESH_CLEANUP_SCHEDULE |
Расписание очистки токенов — игнорируется | worker |
MATTERMOST_NOTIFICATION_WORKERS |
Очередь уведомлений Mattermost — удалена в 0.33 вместе с каналом в ядре | worker |
MAXRU_NOTIFICATION_WORKERS |
То же для MAX | worker |
MATTERMOST_ALLOW_LOCAL_DIAL |
SSRF-гард канала Mattermost. Канал ведёт плагин, переменную не читает никто; при старте об этом сообщается | оба |
TELEGRAM_NOTIFICATION_WORKERS |
Очередь уведомлений Telegram. Канал ведёт плагин, очереди и воркера нет | worker |
FALLBACK_JIRA_URL, FEATURE_JIRA_REVERSE_SYNC, JIRA_REVERSE_SYNC_INTERVAL_MINUTES, JIRA_REVERSE_SYNC_BATCH_SIZE, JIRA_REVERSE_SYNC_WORKERS, JIRA_SYNC_WORKERS, FEATURE_JIRA_ENGINE_ROUTING, FEATURE_JIRA_WEBHOOK |
Встроенная интеграция с Jira — удалена в 0.33, задачи ведут плагины | оба |
JIRA_ALLOW_HTTP, JIRA_ALLOW_LOCAL_DIAL, JIRA_BASE_URL_ALLOWLIST |
Общий SSRF-рычаг. Заменён переменными подсистем (VCS_*, RESCAN_*, IAC_SOURCE_*); при остатке в окружении Hub предупреждает |
оба |
Переменные, без которых сервис не стартует¶
| Переменная | При каком условии обязательна |
|---|---|
JWT_SECRET |
Всегда, кроме APP_ENV=development |
DB_PASSWORD |
Всегда, кроме APP_ENV=development |
KEYCLOAK_CLIENT_SECRET |
При AUTH_MODE=SSO и провайдере keycloak вне development. Вне development значение по умолчанию change-me также отвергается — нужен собственный секрет |
OIDC_<ИМЯ>_CLIENT_ID и OIDC_<ИМЯ>_CLIENT_SECRET |
Для каждого провайдера из SSO_PROVIDERS, кроме keycloak |
DUAL_VERIFY_CALLBACK_BASE_URL |
При FEATURE_DUAL_VERIFY=true |
LOCAL_ADMIN_PASSWORD |
Формально нет, фактически обязательна при AUTH_MODE=LOCAL — без неё на чистой базе некому войти |
Неизвестное значение APP_ENV или AUTH_MODE также прерывает запуск — это
сделано намеренно, чтобы опечатка не ослабляла защиту молча.
Обязательный https в промышленной среде¶
При APP_ENV=production запуск прерывается, если любой из этих адресов задан
и использует http:
KEYCLOAK_URL, KEYCLOAK_PUBLIC_URL, KEYCLOAK_JWKS_URL,
KEYCLOAK_TOKEN_URL, KC_JWKS_URL, KC_ISSUER, DOMAINSCOPE_VERIFY_URL,
LLM_BASE_URL, PENTAGI_BASE_URL, а также любой адрес провайдера из
SSO_PROVIDERS.
По этим каналам передаются секреты, поэтому исключений нет. Проверка адресов
Keycloak не выполняется при AUTH_MODE=LOCAL — там он не используется вовсе.
В чарте по умолчанию задаётся лишь часть переменных: группы перепроверки, ручного пересканирования, маршрутизации Jira,
KC_*, ограничения частоты и другие работают на значениях из кода, пока оператор не пробросит их явно черезextraEnv.