Развёртывание в Kubernetes¶
Production-сценарий через Helm-чарты. Поддерживает single-node k3s и multi-node k8s.
Поставка — Helm-чарт
hub-platform(umbrella) с готовыми образами Hub. Сборка из исходников не предполагается.
Что входит¶
Umbrella-чарт hub-platform собирает следующие subcharts:
| Чарт | Что деплоит |
|---|---|
security-scan-hub |
Hub backend + worker + frontend + PostgreSQL |
domainscope |
DomainScope daemon + PostgreSQL (опц. WireGuard sidecar) |
openvas (опц.) |
Greenbone Community Edition (gvmd/gsad/ospd/pg-gvm/redis) |
owasp-zap (опц.) |
OWASP ZAP daemon (StatefulSet с PVC) |
netbox (опц.) |
NetBox IPAM/DCIM |
Дополнительно (вне umbrella): sshub-atlassian-secrets-scanner — CronJob для сканирования секретов в Jira/Confluence.
Получение чартов¶
Помимо стандартного helm repo или OCI-pull, поставка может приходить tarball'ом со всеми чартами и values.yaml:
Или через helm OCI registry:
Сценарий A: всё-в-одном (рекомендуется для пилотов)¶
Подходит для evaluation и небольших инсталляций. Полный стек на одной VM.
Предусловия¶
- Linux VM (Ubuntu 22.04+, Debian 12+, RHEL 9+, Astra Linux 1.7)
- 8 vCPU / 16 GB RAM / 60 GB disk (с OpenVAS); 4/8/30 без OpenVAS
- Root-доступ
- DNS-запись
hub.example.com→ IP вашей VM (для Let's Encrypt и UI) - Outbound HTTPS к registry с образами
Установка¶
Установите k3s (или используйте свой кластер):
curl -sfL https://get.k3s.io | sh -
sudo mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
Установите helm и cert-manager:
curl -fsSL https://get.helm.sh/helm-v3.13.0-linux-amd64.tar.gz | tar -xz
sudo mv linux-amd64/helm /usr/local/bin/
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager --create-namespace \
--set installCRDs=true
Создайте ClusterIssuer для Let's Encrypt:
# letsencrypt-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: admin@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef: { name: letsencrypt-prod }
solvers:
- http01:
ingress: { class: traefik } # или nginx
Заготовьте values.yaml (override поверх дефолтов):
# values.yaml
global:
domain: hub.example.com
ingressClass: traefik # или nginx
tls:
issuer: letsencrypt-prod
securityScanHub:
image:
tag: "0.30"
env:
appEnv: production
frontendUrl: https://hub.example.com
allowedOrigins: https://hub.example.com
authMode: LOCAL # или SSO
pvc:
postgresData:
size: 100Gi # рассчитайте на год вперёд
backendStorage: 10Gi
workerStorage: 5Gi
secrets:
existingSecretName: hub-secrets # см. ниже
backend:
replicas: 2
worker:
replicas: 2
domainscope:
enabled: true
image:
tag: "0.30"
openvas:
enabled: false # включите если нужен CVE-scanner
owaspZap:
enabled: false
Создайте секрет руками или через sealed-secrets / external-secrets:
kubectl create namespace hub
kubectl -n hub create secret generic hub-secrets \
--from-literal=dbPassword='<strong-random>' \
--from-literal=jwtSecret="$(openssl rand -hex 32)" \
--from-literal=localAdminPassword='<strong-admin>' \
--from-literal=domainscopeDbPassword='<strong-random>' \
--from-literal=hubApiToken='<заполните после первого старта>'
Установка:
Hub стартует через 2-5 минут. OpenVAS дополнительно качает CVE-фиды ~10-30 минут после первого старта.
Сценарий B: GitOps (ArgoCD + Vault)¶
Для боевого деплоя с git-as-source-of-truth и централизованным хранением секретов.
Архитектура¶
┌──────────────────────┐
│ Git-репо (ваш) │
│ values.yaml │
│ ApplicationSets │
└──────────┬───────────┘
│ git fetch
▼
┌──────────────────────┐ ┌──────────────────┐
│ ArgoCD │◀───────▶│ HashiCorp Vault │
│ + avp-plugin │ │ (secrets KV v2) │
└──────────┬───────────┘ └──────────────────┘
│ apply
▼
┌──────────────────────┐
│ Kubernetes cluster │
└──────────────────────┘
ArgoCD читает чарт и values из вашего git, argocd-vault-plugin подменяет плейсхолдеры <path:kv/data/...> на реальные секреты из Vault, helm накатывает в кластер.
Минимальный Application для ArgoCD¶
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: hub
namespace: argocd
spec:
destination:
namespace: hub
server: https://kubernetes.default.svc
project: default
source:
repoURL: <your-git-repo-with-values>
path: hub-platform
targetRevision: main
helm:
valueFiles:
- values.yaml
syncPolicy:
automated: { prune: true, selfHeal: true }
syncOptions:
- CreateNamespace=true
Сценарий C: WireGuard egress (изолированный сканинг)¶
Если DomainScope должен сканировать перимметр через выделенный egress IP (например, для попадания в allowlist облачных провайдеров), DomainScope ходит через WG sidecar к отдельному WG-серверу. WG-server разворачивается отдельно — поставщик может предоставить готовый скрипт.
В values.yaml:
domainscope:
wireguard:
enabled: true
config: |
[Interface]
PrivateKey = <client-priv-key>
Address = 10.99.0.2/24
[Peer]
PublicKey = <server-pub-key>
Endpoint = <wg-vps-ip>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Секреты¶
Минимальный набор для production:
- Hub DB password
- Hub JWT secret
- Hub local admin password
- DomainScope DB password
- DomainScope Hub API token (из Service Account Hub, см.
integration-sarif.md) - Keycloak client secret (если SSO)
- LLM API key (если AI-триаж)
- Jira bot password / token (если интеграция)
- NetBox token (если sync)
- OpenVAS admin password (если CVE-scanner)
- ZAP API key (если DAST)
Все секреты — через k8s Secret (ручное создание / sealed-secrets / external-secrets / Vault+AVP).
Проверка после установки¶
# Статус pods
kubectl -n hub get pods
# Логи backend (миграции должны прокатиться)
kubectl -n hub logs deploy/hub-backend
# Версия
curl https://hub.example.com/version
# Войти в UI
# https://hub.example.com — admin@localhost.local / <localAdminPassword>
# Swagger UI (документация API)
# https://hub.example.com/swagger/index.html
Upgrade¶
Обновление: смените тег в значениях чарта и примените их. Подробнее — Обновления.
# Обновить чарт (если поставщик прислал новую версию)
tar -xzf hub-platform-charts-new.tar.gz -C /opt/hub-charts-new
# Apply
helm upgrade hub /opt/hub-charts-new/hub-platform -n hub -f values.yaml
# Поды пересоздадутся последовательной заменой
kubectl -n hub rollout restart deploy
Подробнее: upgrades.md.
Состав компонентов и что из них обязательно — Архитектура. Значения ресурсов из чартов — Расчёт ресурсов.