Files
cozystack/packages/apps/vm-instance/tests/hook_securitycontext_test.yaml
Aleksei Sviridkin aed0162711 fix(hooks): run the refreshed alpine/k8s kubectl hooks non-root
The vm-disk pvc-resize, cozystack-api, seaweedfs and vm-instance update
hooks (whose alpine/k8s image this PR refreshes) ran as root with no
securityContext. Add a pod-level runAsNonRoot + runAsUser 65534 +
seccompProfile RuntimeDefault and a container-level
allowPrivilegeEscalation: false + capabilities drop ALL, mirroring the
dashboard adopt hook. kubectl needs no root, so this is behavior-neutral.
Each hook is lookup-gated; pin the securityContext in a per-chart
helm-unittest that mocks the gating object (DaemonSet / PVC / Service) via
kubernetesProvider so the guard renders without a cluster. vm-disk and
vm-instance had no Makefile test target, so add 'test: helm unittest .' to
both so CI runs the new suites.

Scope note: other kubectl hooks on clastix/kubectl (mariadb, keycloak,
kubernetes, tenant) are untouched here — they are not part of this
alpine/k8s refresh and belong to a separate hardening pass.

Also fix the vm-disk resize hook's backoffLimit: it was nested under the
pod spec (silently ignored, leaving the Job at the default 6 retries)
instead of Job.spec. Move it to Job.spec and pin it in the test.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
2026-06-22 21:26:42 +03:00

53 lines
1.5 KiB
YAML

suite: vm-instance update-hook runs non-root
# The update hook only renders when an existing VM/Service needs reconciling
# (lookup-gated). Mock a Service whose type differs from the desired one
# (existing LoadBalancer vs desired ClusterIP) to drive the render, then pin
# the non-root securityContext. Scope to the hook template so the chart's
# instanceType lookups elsewhere don't need a live cluster.
release:
name: test-vm
namespace: tenant-test
templates:
- templates/vm-update-hook.yaml
set:
fullnameOverride: test-vm
external: false
kubernetesProvider:
scheme:
"v1/Service":
gvr:
group: ""
version: "v1"
resource: "services"
namespaced: true
objects:
- kind: Service
apiVersion: v1
metadata:
name: test-vm
namespace: tenant-test
spec:
type: LoadBalancer
tests:
- it: update-hook Job runs under a restrictive non-root securityContext
documentSelector:
path: kind
value: Job
asserts:
- equal:
path: spec.template.spec.securityContext.runAsNonRoot
value: true
- equal:
path: spec.template.spec.securityContext.runAsUser
value: 65534
- equal:
path: spec.template.spec.securityContext.seccompProfile.type
value: RuntimeDefault
- equal:
path: spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation
value: false
- contains:
path: spec.template.spec.containers[0].securityContext.capabilities.drop
content: ALL