block application resources in default namespace
Kube-bench CIS scan / Scan ephemeral K3s cluster (push) Failing after 3m11s
Kube-bench CIS scan / Scan ephemeral K3s cluster (push) Failing after 3m11s
This commit is contained in:
@@ -12,8 +12,8 @@ and avoids applying workload admission rules to platform namespaces.
|
|||||||
| 5.2.7 | `require-non-root` | A Pod without explicit non-root execution is rejected. | Does not prove the image cannot switch users internally. |
|
| 5.2.7 | `require-non-root` | A Pod without explicit non-root execution is rejected. | Does not prove the image cannot switch users internally. |
|
||||||
| 5.5.1 | `restrict-image-registries` | Images outside the approved registry set are rejected. | Full provenance needs signing, verification, and trusted build controls. |
|
| 5.5.1 | `restrict-image-registries` | Images outside the approved registry set are rejected. | Full provenance needs signing, verification, and trusted build controls. |
|
||||||
| 5.7.3 supplemental | `require-resource-limits` | Pods must declare CPU and memory limits. | Resource limits are a defense-in-depth control, not a direct CIS test. |
|
| 5.7.3 supplemental | `require-resource-limits` | Pods must declare CPU and memory limits. | Resource limits are a defense-in-depth control, not a direct CIS test. |
|
||||||
|
| Supplemental | `disallow-default-namespace` | Common application resources in `default` are rejected. | Namespace hygiene is defense in depth, not a one-to-one CIS test. |
|
||||||
|
|
||||||
The Kubernetes CIS Benchmark is broader than admission policy. kube-bench
|
The Kubernetes CIS Benchmark is broader than admission policy. kube-bench
|
||||||
covers node, control-plane, RBAC, audit, network policy, and manual review
|
covers node, control-plane, RBAC, audit, network policy, and manual review
|
||||||
areas that these Kyverno policies do not implement.
|
areas that these Kyverno policies do not implement.
|
||||||
|
|
||||||
|
|||||||
+7
-6
@@ -1,11 +1,12 @@
|
|||||||
# Kyverno policy baseline
|
# Kyverno policy baseline
|
||||||
|
|
||||||
These policies are `ClusterPolicy` resources, but they intentionally select
|
These policies are `ClusterPolicy` resources. The workload hardening policies
|
||||||
only namespaces labeled `security-baseline/open: "true"`. That keeps the
|
select only namespaces labeled `security-baseline/open: "true"`. The separate
|
||||||
portfolio demo enforceable without blocking Kyverno, Falco, ArgoCD, or other
|
`disallow-default-namespace` policy specifically protects the Kubernetes
|
||||||
platform components. Expand the label scope deliberately for a real cluster.
|
`default` namespace. This keeps the portfolio demo enforceable without
|
||||||
|
blocking Kyverno, Falco, ArgoCD, or other platform components.
|
||||||
|
|
||||||
All five policies use `validationFailureAction: Enforce`, so a matching Pod is
|
All six policies use `validationFailureAction: Enforce`, so a matching resource is
|
||||||
rejected at admission time. The policies use `background: false` because the
|
rejected at admission time. The policies use `background: false` because the
|
||||||
goal is to demonstrate admission enforcement, not retroactively evaluate
|
goal is to demonstrate admission enforcement, not retroactively evaluate
|
||||||
existing objects.
|
existing objects.
|
||||||
@@ -16,9 +17,9 @@ existing objects.
|
|||||||
| `require-non-root` | 5.2.7 | Requires `runAsNonRoot: true` on containers and init containers. |
|
| `require-non-root` | 5.2.7 | Requires `runAsNonRoot: true` on containers and init containers. |
|
||||||
| `require-resource-limits` | 5.7.3 supplemental | Requires CPU and memory limits. This is a supplemental control, not a one-to-one CIS test. |
|
| `require-resource-limits` | 5.7.3 supplemental | Requires CPU and memory limits. This is a supplemental control, not a one-to-one CIS test. |
|
||||||
| `restrict-image-registries` | 5.5.1 supplemental | Allows only approved registries. Full image provenance requires signing and verification as well. |
|
| `restrict-image-registries` | 5.5.1 supplemental | Allows only approved registries. Full image provenance requires signing and verification as well. |
|
||||||
|
| `disallow-default-namespace` | Supplemental | Blocks common application resources from being created in `default`, which makes namespace ownership explicit. |
|
||||||
| `disallow-host-network` | 5.2.3 and 5.2.5 | Rejects host PID, host network, and host IPC access. |
|
| `disallow-host-network` | 5.2.3 and 5.2.5 | Rejects host PID, host network, and host IPC access. |
|
||||||
|
|
||||||
The CIS benchmark includes manual checks and platform-specific exceptions.
|
The CIS benchmark includes manual checks and platform-specific exceptions.
|
||||||
The mapping above describes the control objective each policy supports, not a
|
The mapping above describes the control objective each policy supports, not a
|
||||||
claim that one Kyverno rule implements the entire benchmark control.
|
claim that one Kyverno rule implements the entire benchmark control.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
apiVersion: kyverno.io/v1
|
||||||
|
kind: ClusterPolicy
|
||||||
|
metadata:
|
||||||
|
name: disallow-default-namespace
|
||||||
|
annotations:
|
||||||
|
policies.kyverno.io/title: Disallow application workloads in default
|
||||||
|
policies.kyverno.io/category: Namespace hygiene
|
||||||
|
policies.kyverno.io/severity: medium
|
||||||
|
# Supplemental namespace-isolation control. This is not a one-to-one CIS control.
|
||||||
|
policies.kyverno.io/cis-control: "supplemental"
|
||||||
|
spec:
|
||||||
|
validationFailureAction: Enforce
|
||||||
|
background: false
|
||||||
|
failurePolicy: Fail
|
||||||
|
rules:
|
||||||
|
- name: application-resources-not-in-default
|
||||||
|
match:
|
||||||
|
any:
|
||||||
|
- resources:
|
||||||
|
kinds:
|
||||||
|
- Pod
|
||||||
|
- Deployment
|
||||||
|
- StatefulSet
|
||||||
|
- DaemonSet
|
||||||
|
- Job
|
||||||
|
- CronJob
|
||||||
|
- ReplicaSet
|
||||||
|
- ReplicationController
|
||||||
|
- Service
|
||||||
|
- Ingress
|
||||||
|
namespaceSelector:
|
||||||
|
matchLabels:
|
||||||
|
kubernetes.io/metadata.name: default
|
||||||
|
validate:
|
||||||
|
message: Application resources must be deployed into an explicitly named namespace.
|
||||||
|
deny:
|
||||||
|
conditions:
|
||||||
|
any:
|
||||||
|
- key: "{{ request.namespace }}"
|
||||||
|
operator: Equals
|
||||||
|
value: default
|
||||||
@@ -7,3 +7,4 @@ resources:
|
|||||||
- require-resource-limits.yaml
|
- require-resource-limits.yaml
|
||||||
- restrict-image-registries.yaml
|
- restrict-image-registries.yaml
|
||||||
- disallow-host-network.yaml
|
- disallow-host-network.yaml
|
||||||
|
- disallow-default-namespace.yaml
|
||||||
|
|||||||
Reference in New Issue
Block a user