Security Hardening Guide — Stella Ops

Audience — site-reliability and platform teams deploying Stella Ops in production or restricted networks.

See also: Security Hardening overview in the docs index, the Security Policy, and the Coordinated Vulnerability Disclosure policy.


Contents

  1. Threat model (summary)
  2. Host-OS baseline
  3. Container & runtime hardening
  4. Network-plane guidance
  5. Secrets & key management
  6. Image, SBOM & plug-in supply-chain controls
  7. Logging, monitoring & audit
  8. Update & patch strategy
  9. Incident-response workflow
  10. Pen-testing & continuous assurance
  11. Vulnerability disclosure & contact
  12. Change log

1 · Threat model (summary)

AssetThreatsMitigations
SBOMs & scan resultsDisclosure, tamperTLS-in-transit, read-only Valkey volume, RBAC, Cosign-verified plug-ins
Backend containerRCE, code-injectionDistroless image, non-root UID, read-only FS, seccomp + CAP_DROP:ALL
Update artefactsSupply-chain attackCosign-signed images & SBOMs, enforced by admission controller
Admin credentialsPhishing, brute forceOAuth 2.0 with 12-h token TTL, optional mTLS

2 · Host-OS baseline checklist

ItemRecommended setting
OSUbuntu 22.04 LTS (kernel ≥ 5.15) or Alma 9
Patchesunattended-upgrades or vendor-equivalent enabled
Filesystemnoexec,nosuid on /tmp, /var/tmp
Docker Enginev24.*, API socket root-owned (0660)
AuditdWatch /etc/docker, /usr/bin/docker* and Compose files
Time syncchrony or systemd-timesyncd

3 · Container & runtime hardening

3.1 Docker Compose reference (compose-core.yml)

services:
  backend:
    image: registry.stella-ops.org/stella-ops/stella-ops:<PINNED_TAG_OR_DIGEST>
    user: "101:101"              # non-root
    read_only: true
    security_opt:
      - "no-new-privileges:true"
      - "seccomp:./seccomp-backend.json"
    cap_drop: [ALL]
    tmpfs:
      - /tmp:size=64m,exec,nosymlink
    environment:
      - ASPNETCORE_URLS=https://+:8080
      - TLSPROVIDER=OpenSslGost
    depends_on: [valkey]
    networks: [core-net]
    healthcheck:
      test: ["CMD", "wget", "-qO-", "https://localhost:8080/health"]
      interval: 30s
      timeout: 5s
      retries: 5

  valkey:
    image: valkey/valkey:8.0-alpine
    command: ["valkey-server", "--requirepass", "${VALKEY_PASS}", "--rename-command", "FLUSHALL", ""]
    user: "valkey"
    read_only: true
    cap_drop: [ALL]
    tmpfs:
      - /data
    networks: [core-net]

networks:
  core-net:
    driver: bridge

No dedicated “Valkey” or “PostgreSQL” sub-nets are declared; the single bridge network suffices for the default stack.

3.2 Kubernetes deployment highlights

4 · Network-plane guidance

PlaneRecommendation
North-southTerminate TLS 1.2+ (OpenSSL-GOST default). Use LetsEncrypt or internal CA.
East-westCompose bridge or K8s ClusterIP only; no public Valkey/PostgreSQL ports.
Ingress controllerLimit methods to GET, POST, PATCH (no TRACE).
Rate-limits40 rps default; tune ScannerPool.Workers and ingress limit-req to match.

5 · Secrets & key management

SecretStorageRotation
Client-JWT (offline)/var/lib/stella/tokens/client.jwt (root : 600)30 days – provided by each OUK
VALKEY_PASSDocker/K8s secret90 days
OAuth signing key/keys/jwt.pem (read-only mount)180 days
Cosign public key/keys/cosign.pub baked into image;change on every major release
Trivy DB mirror token (if remote)Secret + read-only30 days

Never bake secrets into images; always inject at runtime.

Operational tip: schedule a cron reminding ops 5 days before client.jwt expiry. The backend also emits a Prometheus metric stella_quota_token_days_remaining.

6 · Image, SBOM & plug-in supply-chain controls

See the Plugin SDK Guide for signing and version-compatibility details.

7 · Logging, monitoring & audit

ControlImplementation
Log formatSerilog JSON; ship via Fluent-Bit to ELK or Loki
MetricsPrometheus /metrics endpoint; default Grafana dashboard in infra/
Audit eventsValkey (Redis-compatible) stream audit; export daily to SIEM
Alert rulesFeed age ≥ 48 h, P95 wall-time > 5 s, Valkey used memory > 75 %

7.1 Concelier authorization audits

8 · Update & patch strategy

LayerCadenceMethod
Backend & CLI imagesMonthly or CVE-drivendocker pull + docker compose up -d
Trivy DB24 h scheduler via ConcelierConfigurable via Concelier scheduler options
Docker EngineVendor LTSDistro package manager
Host OSSecurity repos enabledunattended-upgrades

9 · Incident-response workflow

10 · Pen-testing & continuous assurance

ControlFrequencyTool/Runner
OWASP ZAP baselineEach merge to mainGitHub Action zap-baseline-scan
Dependency scanningPer pull requestTrivy FS + Dependabot
External red-teamAnnual or pre-GACREST-accredited third-party

11 · Vulnerability disclosure & contact

12 · Change log

VersionDateNotes
v2.02025-07-12Full overhaul: host-OS baseline, supply-chain signing, removal of unnecessary sub-nets, role-based contact e-mail, K8s guidance.
v1.12025-07-09Minor fence fixes.
v1.02025-07-09Original draft.