Sota kubernetes
State-of-the-art Kubernetes platform security and operations (2026) for cloud-managed (EKS/GKE/AKS) and self-hosted clusters (kubeadm, k3s/k0s, Talos). Use when building, operating, hardening, or auditing the cluster PLATFORM layer: control plane and etcd, API server/kubelet, RBAC, admission control and policy-as-code, GitOps controllers, operators/CRDs/admission webhooks, Helm/Kustomize supply chain, multi-tenancy, cluster lifecycle/upgrades/CVE response, and audit logging. Trigger keywords: Kubernetes, k8s, cluster, control plane, etcd, kube-apiserver, kubelet, RBAC, ClusterRole, ServiceAccount, admission controller, Pod Security Admission, PSA, Kyverno, Gatekeeper, OPA, ValidatingAdmissionPolicy, Argo CD, Flux, GitOps, operator, CRD, admission webhook, Helm, Kustomize, multi-tenancy, vCluster, Talos, k3s, k0s, kubeadm, EKS, GKE, AKS, CIS benchmark, kube-bench, audit log, version skew. NOT pod-level securityContext/seccomp (sota-sandboxing) or NetworkPolicy/CNI depth (sota-network-security).From its SKILL.md
npx -y skills add martinholovsky/SOTA-skills --skill sota-kubernetesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 12 stars12 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 5 commands, including `kubectl` and 4 more.
SKILL.md
12.5 KB, ~2.9k tokens by cl100k_base, as published. Nobody here has run it
SOTA Kubernetes Platform Security & Operations
Purpose
Engineer and audit the Kubernetes platform so that a compromised workload, a hostile chart, a leaked token, or a malicious controller cannot pivot to cluster-admin, read every Secret, or take the cluster down. This skill owns the layer above the pod: control plane and etcd, API server and kubelet hardening, RBAC and ServiceAccount identity, admission control and policy-as-code, GitOps controllers, operators/CRDs and admission webhooks, Helm/Kustomize at admission, multi-tenancy boundaries, cluster lifecycle, and K8s audit logging.
It does not re-teach pod isolation mechanics. Boundaries it defers:
- Pod
securityContext, seccomp, AppArmor, capabilities, PSA pod-level fields →sota-sandboxing(rules/03 containers & microVMs; rules/01 boundaries). This skill owns the admission-time enforcement of those fields, not their internals. - NetworkPolicy semantics, CNI choice, service mesh, mTLS →
sota-network-security. This skill states only the requirement (default-deny per namespace, enforced at admission). - OIDC/SSO and RBAC-role design methodology →
sota-identity-access. This skill owns the K8s RBAC mechanics and escalation traps. - Runtime/audit-log detection content (Falco/Tetragon rules, detections) →
sota-detection-engineering. This skill owns producing and shipping the audit stream. - Workload identity, Secret storage backends (ESO, sealed-secrets, CSI) →
sota-secrets-management(rules/01, rules/02). This skill owns etcd encryption-at-rest. - Cloud IAM, managed-K8s selection, DR →
sota-cloud-infrastructure(rules/02, rules/04, rules/07). - CI/CD provenance, image signing, IaC/GitOps pipeline, runtime ops →
sota-devsecops(rules/02, rules/04, rules/06, rules/07).
Two modes. Pick one explicitly at the start of the task.
BUILD mode
Use when provisioning a cluster, writing RBAC/policies/manifests, configuring a GitOps controller, or installing an operator/chart.
- Name the cluster topology first: managed (EKS/GKE/AKS) vs self-hosted (kubeadm, k3s/k0s, Talos), single- vs multi-tenant, who the threat actors are (workload → control plane? tenant → tenant? compromised CI → cluster?). Read the matching rules.
- Least privilege by default: no wildcard RBAC verbs/resources,
automountService AccountToken: falseunless the pod calls the API, scoped AppProjects, operators get the narrowest RBAC that works. Loosen only with a comment stating why. - Encrypt etcd at rest with a KMS provider (
rules/01) — Secrets are base64, not encrypted, by default. This is the single most common "we thought we were covered" gap. - Admission is fail-closed and ENFORCING, not auditing. A policy left in
audit/warnforever is documentation, not a control (rules/03). Ship the AUDIT→ENFORCE rollout plan with the policy. - GitOps is the only write path to the cluster. Humans propose via PR; the
controller reconciles. Scope the controller's own privileges and AppProjects tightly
(
rules/04). - Plan the upgrade before you build: version skew, EOL date, CVE-response runbook,
tested etcd restore (
rules/01,rules/07).
Deliverables: topology + threat statement, the concrete manifests/configs, the AUDIT→ENFORCE rollout, and the residual-risk/assumptions list (cloud-managed control plane internals you cannot see, org IAM, CNI behavior).
AUDIT mode
Use when reviewing an existing cluster, its RBAC, policies, GitOps config, or operators.
Procedure: inventory the cluster surface (control plane flags or managed equivalent,
RBAC graph, admission policies, GitOps controllers, operators/CRDs, namespaces/tenancy);
for each, walk the relevant rules-file Audit checklist; verify empirically with
kubectl, kubectl auth can-i, rbac-tool/krane, kube-bench, and helm template where
possible; report findings in the format below. Do not report style nits as security
findings.
Severity conventions
| Severity | Meaning | Examples |
|---|---|---|
| Critical | Cluster-admin, all-Secrets read, or cluster takedown reachable now | anonymous-auth enabled on API server/kubelet; etcd unencrypted AND reachable; ClusterRoleBinding granting cluster-admin to a workload SA or system:authenticated; wildcard */* ClusterRole bound broadly; Argo CD AppProject clusterResourceWhitelist: [{group: '*', kind: '*'}] with broad SSO; unpatched control plane on a known-RCE CVE |
| High | Escalation/secret-read by an in-cluster or contributor principal, or a single event from it | escalate/bind/impersonate verbs granted; secret-reader → token-mint → privilege chain; admission policy in audit mode for a control that should enforce; image-verification policy only Audits signatures; operator with cluster-wide secrets:*; kubelet read-only-port open; no etcd backup or untested restore |
| Medium | Weakens defense in depth or detection | PSA not enforced (only warn/audit); automountServiceAccountToken defaulted on for non-API pods; no default-deny NetworkPolicy (requirement-level; depth → network-security); audit policy missing or None/Metadata-only for Secret access; aggregated ClusterRole accreting verbs; no PDB on critical workloads |
| Low | Hygiene, hardening headroom | RBAC subjects for departed users; unused ClusterRoles; namespaces without resource quotas; :latest image tags admitted; missing PolicyException expiry |
Severity is judged by reachability (anonymous > workload/tenant > contributor > admin) × yield (cluster-admin/all-Secrets > namespace compromise > info leak > availability).
Finding format
file:line | rule | severity | effort | fix
Where effort is one of trivial / small / medium / large, rule is the rules-file
section (e.g. 02 §RBAC-wildcards), and fix is the concrete change. Expand below the
line with: what is wrong, who exploits it and how (concrete attack path), and a snippet
when short. Example:
clusterrole-ci.yaml:14 | 02 §escalate-verbs | Critical | small | remove the bind/escalate grant; scope to the 3 named ClusterRoles the controller actually applies
Issue: ClusterRole bound to the CI ServiceAccount grants rbac.authorization.k8s.io/{bind,escalate} on clusterroles.
Attack path: anyone who can run a job as this SA (any merged PR) can bind themselves cluster-admin.
End every audit with: counts per severity, top 3 fixes by risk-reduction-per-effort, and an explicit OUT-OF-SCOPE list (managed control-plane internals, org IAM, CNI/mesh, runtime detection content).
Rules index
| File | Read this when... |
|---|---|
| rules/01-control-plane-etcd.md | HA control plane, API server flags (anonymous-auth, authz modes, audit), etcd encryption-at-rest with KMS v2 + backup/defrag/restore, kubelet hardening, node + immutable-distro hardening (Talos no-SSH/machine-config/SecureBoot+TPM, k3s/k0s), CIS benchmark + kube-bench |
| rules/02-rbac-serviceaccounts.md | Roles/ClusterRoles least-privilege, the escalation traps (wildcards, bind/escalate/impersonate, cluster-admin bindings, aggregated roles, secret-reader chains), ServiceAccount hygiene (automount off, bound/projected/audience-scoped tokens, no long-lived token Secrets), RBAC auditing (auth can-i, rbac-tool/krane/who-can) |
| rules/03-admission-policy.md | Pod Security Admission (restricted/baseline/privileged, enforce/audit/warn) and its limits, Kyverno vs Gatekeeper/OPA vs ValidatingAdmissionPolicy/MutatingAdmissionPolicy, the AUDIT→ENFORCE rollout discipline, image verification at admission (cosign/Kyverno verifyImages), PolicyException discipline |
| rules/04-gitops-controllers.md | Argo CD / Flux security: AppProject scoping (the clusterResourceWhitelist:[{*,*}] trap), project/RBAC/SSO, the controller's own privileges and self-management, repo/SSH creds, ApplicationSet injection, auto-sync vs approval, drift, recent Argo CD CVEs, promotion/rollback as git ops |
| rules/05-operators-crds-webhooks.md | The operator privilege problem (broad RBAC → CRD-mediated escalation), vetting operator RBAC, CRD validation/security, trusted controllers (ESO, cert-manager), admission webhooks as attack surface (failurePolicy, timeout, TLS, namespaceSelector) |
| rules/06-workloads-tenancy.md | Resource requests/limits as availability+QoS, PodDisruptionBudget, topology spread, anti-affinity, priorityClass/preemption, namespace-as-SOFT-boundary reality, hard multi-tenancy (vCluster/separate clusters/node isolation), Secrets in K8s (etcd encryption + ESO/sealed-secrets pointer) |
| rules/07-supply-chain-audit.md | Helm/Kustomize review before apply (helm template, RBAC-in-charts trap, privilege-granting values), OCI chart signing/provenance, only-signed-images enforcement, digest pinning at the manifest layer, K8s audit policy (what/levels), shipping audit logs, detection + runtime-security pointers |
When a task spans layers (most do), read every matching file. For a full cluster audit, read all seven plus the referenced sibling skills.
Top 10 non-negotiables
Violations are at minimum High in AUDIT mode and must never be introduced in BUILD mode:
anonymous-auth=falseon the API server AND kubelet; kubeletread-only-port=0, kubelet authz modeWebhook(notAlwaysAllow). Anonymous or unauthenticated access to either is cluster-game-over (01).- etcd encrypted at rest with a KMS v2 provider (envelope DEK/KEK), not the default
base64. Secrets are NOT encrypted out of the box (
01,06). - No wildcard RBAC. No
*verbs/resources in Roles/ClusterRoles bound to workloads or users; nocluster-adminbound to a ServiceAccount,system:authenticated, orsystem:unauthenticated(02). bind,escalate,impersonateare privilege-escalation verbs — grant only to a named, audited admin path, never to a workload or CI SA (02).automountServiceAccountToken: falseis the default; opt in only for pods that call the API. No long-lived Secret-based SA tokens — use bound/projected tokens (02).- Pod Security Admission
restrictedENFORCED on workload namespaces (labelpod-security.kubernetes.io/enforce: restricted), not merelywarn/audit. PSA is stable; PSP is gone (03). Pod-level field internals → sota-sandboxing. - Admission policies enforce, with a documented AUDIT→ENFORCE rollout. A policy
parked in
Audit/warnindefinitely is a real, recurring finding (03). - GitOps is the only cluster write path; the controller and its AppProjects are
tightly scoped. Never
clusterResourceWhitelist: [{group:'*',kind:'*'}]with broad project access; pin Argo CD/Flux versions and patch known CVEs (04). - Operators get least-privilege RBAC; admission webhooks have correct
failurePolicy/timeoutSeconds/namespaceSelectorand TLS — a webhook is both a control and a single point of failure/attack (05). - API server audit logging enabled (RequestResponse for sensitive verbs/Secrets),
shipped to tamper-resistant storage; etcd backups taken AND restore-tested (
07,01). Detection content on the stream → sota-detection-engineering.
If the user asks for something that violates a non-negotiable, implement the secure alternative and explain the delta; comply only after they acknowledge the risk explicitly.
What ships with it: 7 files
70.4 KB alongside SKILL.md
rules/
- 01-control-plane-etcd.md14.8 KB
- 02-rbac-serviceaccounts.md10.1 KB
- 03-admission-policy.md11.1 KB
- 04-gitops-controllers.md9.2 KB
- 05-operators-crds-webhooks.md8.4 KB
- 06-workloads-tenancy.md8.0 KB
- 07-supply-chain-audit.md8.7 KB
Gives 0 of the 12 instructions most security skills give in ~2.9k tokens
Counted across 666 of the 889 authors here whose files we hold, read 2026-09-06
- Use parameterized queries for database accessin 82 of 666, across 79 files
- Hash passwords with BCryptin 55 of 666, across 39 files
- Implement rate limiting for public endpointsin 48 of 666, across 34 files
- Use environment variables for secretsin 35 of 666
- Scan dependencies for vulnerabilitiesin 35 of 666, across 24 files
- Validate and sanitize all user inputin 35 of 666, across 32 files
- Add security headers to all responsesin 34 of 666, across 20 files
- Validate all external input at the system boundaryin 26 of 666, across 25 files
- Use parameterized queries to prevent SQL injectionin 25 of 666, across 13 files
- Store secrets in Vault or environment variablesin 25 of 666, across 10 files
- Run containers as a non-root userin 21 of 666, across 18 files
- Validate all input using Bean Validationin 19 of 666, across 5 files
Said here and by no other author read
- Name the cluster topology first
- Encrypt etcd at rest with a KMS provider
- Ensure admission policies are fail-closed and enforcing
- Use GitOps as the only cluster write path
- Plan the cluster upgrade before building
- Inventory the cluster surface during audits
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.