Files
kubernetes-security-baselin…/ci/README.md
T
swaphb 8934ea95a4
Kube-bench CIS scan / Scan ephemeral K3s cluster (push) Failing after 3m11s
Use lightweight cluster topology in CI
2026-08-09 22:01:11 -04:00

2.8 KiB

CIS benchmark scanning

The scan uses the official kube-bench K3s profile, k3s-cis-1.7, against a disposable K3d control-plane node. kube-bench needs host PID access and read-only host mounts because the CIS checks inspect processes, permissions, and node configuration. The job is intentionally separate from the ArgoCD application tree so the scanner cannot become part of the workload baseline.

GitHub Actions creates a disposable one-server K3s cluster, runs the job, stores the JSON report, and prints pass, warn, and fail totals in the workflow summary. The CI topology is intentionally smaller than the developer quick-start topology so it remains reliable on shared runners.

The workflow fails if the scanner job or report generation fails. It does not yet fail on CIS findings because a vanilla K3d cluster is expected to produce findings; later hardening phases can turn selected controls into merge gates.

To run the same scan locally against the active K3d cluster:

kubectl create namespace kube-bench --dry-run=client -o yaml | kubectl apply -f -
kubectl delete job kube-bench -n kube-bench --ignore-not-found
kubectl apply -f ci/kube-bench-k3s-job.yaml
kubectl wait --for=condition=complete job/kube-bench -n kube-bench --timeout=180s
kubectl logs -n kube-bench job/kube-bench > kube-bench-report.json

The benchmark release is pinned in the Job image. Update it deliberately when the benchmark support matrix or K3s version changes.

Gitea Actions support

Gitea Actions can run the same workflow file. Gitea's default workflow search order includes .gitea/workflows and .github/workflows; because this repository has no .gitea/workflows directory, Gitea will discover the existing .github/workflows/kube-bench-scan.yml file. GitHub Actions continues to use that same file.

The Gitea instance must have Actions enabled and an act_runner registered at the repository, organization, or instance level. The runner needs Docker access because the workflow creates a k3d cluster and runs the kube-bench Job. Register a dedicated runner for this repository rather than sharing a runner with unrelated repositories.

Example Docker runner setup, with the registration token supplied separately:

docker run -d \
  --name kubernetes-security-baseline-runner \
  -e GITEA_INSTANCE_URL=https://git.swaphb.com/ \
  -e GITEA_RUNNER_REGISTRATION_TOKEN="$GITEA_RUNNER_REGISTRATION_TOKEN" \
  -e GITEA_RUNNER_NAME=kubernetes-security-baseline \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v gitea-runner-data:/data \
  docker.io/gitea/act_runner:latest

Mounting the Docker socket gives workflow jobs substantial control over the runner host. Use a dedicated disposable runner, restrict its repository scope, and avoid placing unrelated credentials on that host.