StackRox — security platform on pro
StackRox (the open-source line of Red Hat Advanced Cluster Security) runs on pro, an Intel MacBook Pro (6-core i7, 32 GiB) that joined the lab as a dedicated host on 2026-10-26. One decision shapes everything below: pro has no Argo CD of its own — the Mac mini’s Argo CD is the lab’s single GitOps control plane, and pro’s Docker Desktop Kubernetes is registered in it as an external cluster.
Status: LIVE (2026-10-26). All four Argo Applications are
Synced/Healthy; Central shows cluster pro HEALTHY (sensor and
collector). The whole StackRox namespace draws ~3.4 GiB of real
memory on pro. scripts/check-pro-stackrox.sh passes all stages.
Part A — How it is set up
- Host & cluster: Docker Desktop on pro (Kubernetes v1.36.1, kind mode), VM sized 22 GiB RAM / 5 CPU / 90 GiB disk. Docker Desktop runs without its privileged helper; the engine answers via the user socket.
- GitOps:
rhels/local-k8s-gitops, treeclusters/pro-desktop/. The mini’s root app syncsroot-pro, which delivers thepro-labAppProject and three Applications —stackrox-operator(wave 0),stackrox-central(wave 1),stackrox-secured(wave 2) — all with destination = pro. - The API path: Docker Desktop binds the API to pro’s
localhost:6443. On pro,
tailscale serve --tcp 6443republishes it on the tailnet at the pro host’s own tailnet address, port 6443 (raw TCP passthrough). The DD API certificate has no tailnet SAN, so Argo’s cluster entry usestlsClientConfig.insecure: true— acceptable only on the WireGuard-encrypted, device- authenticated tailnet, with the bearer token still authenticating. The clusterservermust never point anywhere else. - Cluster identity: ServiceAccount
argocd-manager(kube-system, cluster-admin) in pro’s cluster, manifests inclusters/pro-desktop/registration/. Its long-lived token is stored only in Vault (secret/platform/argocd-clusters/pro) and materialized into the mini’s Argo cluster Secret byscripts/sync-pro-cluster-secret.sh— the same Vault-to-Secret script pattern the alert bridge uses, because the mini has no Vault Secrets Operator.scripts/bootstrap-pro-registration.shperforms the whole registration from scratch. - StackRox itself: the
stackrox-operatorHelm chart 4.11.6 (publicquay.io/stackrox-ioimages; no pull secrets, no RHACS images) installs the operator in namespacestackrox. ACentralCR runs Central + Central DB + Scanner V4 (indexer/matcher pinned to 1 replica; the legacy scanner is disabled); aSecuredClusterCR secures pro itself. PVCs are 10 GiB (upstream defaults claim 100 GiB). The CRs are checked against the real 4.11.6 CRD schemas byscripts/validate-pro-stackrox-crds.py— seeclusters/pro-desktop/validation/crd-schema-check.md. - Admin password: operator-generated, never in git. Read back
from pro’s cluster Secret and stored in the VM lab store and in
Vault (
secret/platform/stackrox/central-admin). - LDAP SSO (Dex OIDC bridge): Central 4.x has no direct LDAP
provider, so sign-in runs over OIDC through Dex
(
https://id.rhels.com, apptooling-dexon the mini), whose LDAP connector binds to OpenLDAP as the dedicatedsvc-stackroxaccount (Vaultsecret/lab/ldap/stackrox-bind) and emits directory groups as claims. The Central-side provider lives in Central’s database, not git — re-apply or rebuild it withclusters/pro-desktop/stackrox/apply-oidc-provider.py(run on the mini; idempotent; the load-bearing settings — bare-hostuiEndpoint,mode: query,extra_scopes: groups— are documented in that script). Rules: directory groupacs-admins→ Central Admin; everyone else in the directory → no access. Dex’s own secrets sync from Vault withscripts/sync-dex-secrets.sh. - Init bundle: Sensor cannot connect until the Central-issued
TLS bundle Secrets exist. The bundle is generated once with
roxctl, stored in Vault (secret/platform/stackrox/ pro-init-bundle) viascripts/store-pro-init-bundle.sh, and synced into pro byscripts/sync-pro-init-bundle.sh. The generated YAML is deleted after storing — Vault is its only home. - UI: Central’s LoadBalancer service is published by Docker
Desktop on pro’s localhost. Two doors front it. The primary
one is
acs.rhels.com: the mini’s ingress-nginx terminates it (Let’s Encrypt via cert-manager) and proxies to a raw-TCPtailscale servepassthrough on pro (tailnet port 8443 → Central’s LoadBalancer), speaking Central’s own TLS on the last hop — GitOps inclusters/docker-desktop/rhels-ingress/ acs-ingress.yaml, passthrough asserted byscripts/bootstrap-pro-registration.shstep 1b. Raw TCP is required because serve’s TLS-terminated handler answers any non-tailnet-name SNI with a TLS alert, so the house domain cannot ride it. The fallback door is the pro host’s tailnet name over HTTPS (tailscale serve --https 443, Central’s self-signed certificate on the backend hop). - Known posture debt: no Kyverno and no image-signature verification on pro yet (the request-floor twin is a tracked follow-up); images are pulled by tag from the public registry.
Part B — How to use it
- Open Central: browse to
https://acs.rhels.comfrom any tailnet device (the pro host’s tailnet name over HTTPS works as a fallback). Sign in with Lab LDAP (Dex OIDC) using your directory (OpenLDAP) username and password — members of theacs-adminsgroup land as Central Admins; other directory users authenticate but get no access. The localadminaccount (password in Vault,secret/platform/stackrox/central-admin) remains as break-glass only. - Is the sensor connected? In Central: Platform Configuration
→ Clusters —
proshould show healthy. From the shell, runscripts/check-pro-stackrox.shon the mini: it probes the cluster Secret, the Argo apps, token authentication, and the Central/Sensor deployments, stage by stage, and exits non-zero on any FAIL. Sensor CrashLooping on a missingsensor-tlsSecret is the named red state for “init bundle not synced” — runscripts/sync-pro-init-bundle.shon the mini. - Re-register pro (token rotation, DD reset): re-run
scripts/bootstrap-pro-registration.shfrom the Spark VM, then the README’s recover matrix inclusters/pro-desktop/for the scenario at hand (a pro reset also means a new Central CA: new admin password, new init bundle). - Change something: edit the CRs under
clusters/pro-desktop/stackrox/or the Applications underclusters/pro-desktop/argocd/, commit, and let the mini’s Argo sync. Re-run the CRD validation script before any chart-version bump.