Skip to content

Commit 924f0fb

Browse files
authored
Merge pull request #63 from poehlerflorian/feature/add-controls-c-0268--c-0271
Add Controls C-0268, C-0269, C-0270, C-0271 to allow for more fine granular testing of cpu/mem limits/requests being set
2 parents 82ca4c5 + 8a3a894 commit 924f0fb

15 files changed

+474
-6
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ kubectl -n policy-example run nginx --image=nginx --restart=Never
7676
| [C-0076](https://hub.armosec.io/docs/c-0076) | Label usage for resources | [kubescape-c-0076-deny-resources-without-configured-list-of-labels-not-set](/docs/policies-based-on-kubescape-controls/kubescape-c-0076-deny-resources-without-configured-list-of-labels-not-set.md) | [recommendedLabels](https://hub.armosec.io/docs/configuration_parameter_recommendedlabels) |
7777
| [C-0077](https://hub.armosec.io/docs/c-0077) | K8s common labels usage | [kubescape-c-0077-deny-resources-without-configured-list-of-k8s-common-labels-not-set](/docs/policies-based-on-kubescape-controls/kubescape-c-0077-deny-resources-without-configured-list-of-k8s-common-labels-not-set.md) | [k8sRecommendedLabels](https://hub.armosec.io/docs/configuration_parameter_k8srecommendedlabels) |
7878
| [C-0078](https://hub.armosec.io/docs/c-0078) | Images from allowed registry | [kubescape-c-0078-only-allow-images-from-allowed-registry](/docs/policies-based-on-kubescape-controls/kubescape-c-0078-only-allow-images-from-allowed-registry.md) | [imageRepositoryAllowList](https://hub.armosec.io/docs/configuration_parameter_imagerepositoryallowlist) |
79+
| [C-0268](https://hub.armosec.io/docs/c-0268) | Ensure CPU requests are set | [kubescape-c-0268-deny-resources-with-cpu-request-not-set](/docs/policies-based-on-kubescape-controls/kubescape-c-0268-deny-resources-with-cpu-request-not-set.md) | [cpuRequestMin](https://hub.armosec.io/docs/configuration_parameter_cpurequestmin) |
80+
| [C-0269](https://hub.armosec.io/docs/c-0269) | Ensure memory requests are set | [kubescape-c-0269-deny-resources-with-memory-request-not-set](/docs/policies-based-on-kubescape-controls/kubescape-c-0269-deny-resources-with-memory-request-not-set.md) | [memoryRequestMin](https://hub.armosec.io/docs/configuration_parameter_memoryrequestmin) |
81+
| [C-0270](https://hub.armosec.io/docs/c-0270) | Ensure CPU limits are set | [kubescape-c-0270-deny-resources-with-cpu-limit-not-set](/docs/policies-based-on-kubescape-controls/kubescape-c-0270-deny-resources-with-cpu-limit-not-set.md) | [cpuLimitMin](https://hub.armosec.io/docs/configuration_parameter_cpulimitmin) |
82+
| [C-0271](https://hub.armosec.io/docs/c-0271) | Ensure memory limits are set | [kubescape-c-0271-deny-resources-with-memory-limit-not-set](/docs/policies-based-on-kubescape-controls/kubescape-c-0271-deny-resources-with-memory-limit-not-set.md) | [memoryLimitMin](https://hub.armosec.io/docs/configuration_parameter_memorylimitmin) |
7983

8084
## Testing Policies
8185

controls/C-0050/policy.yaml

+6-6
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,26 @@ spec:
2828
validations:
2929
- expression: >
3030
object.kind != 'Pod' || object.spec.containers.all(container, (!(!(has(container.resources)) || !(has(container.resources.requests)) || !(has(container.resources.requests.cpu))) &&
31-
params.settings.cpuLimitMin <= int(container.resources.requests.cpu) &&
32-
params.settings.cpuLimitMax >= int(container.resources.requests.cpu)) &&
31+
params.settings.cpuRequestMin <= int(container.resources.requests.cpu) &&
32+
params.settings.cpuRequestMax >= int(container.resources.requests.cpu)) &&
3333
(!(!(has(container.resources.limits)) || !(has(container.resources.limits.cpu))) &&
3434
params.settings.cpuLimitMin <= int(container.resources.limits.cpu) &&
3535
params.settings.cpuLimitMax >= int(container.resources.limits.cpu)))
3636
message: "Pods contains container/s with cpu limit or request not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0050)"
3737
3838
- expression: >
3939
['Deployment','ReplicaSet','DaemonSet','StatefulSet','Job'].all(kind, object.kind != kind) || object.spec.template.spec.containers.all(container, (!(!(has(container.resources)) || !(has(container.resources.requests)) || !(has(container.resources.requests.cpu))) &&
40-
params.settings.cpuLimitMin <= int(container.resources.requests.cpu) &&
41-
params.settings.cpuLimitMax >= int(container.resources.requests.cpu)) &&
40+
params.settings.cpuRequestMin <= int(container.resources.requests.cpu) &&
41+
params.settings.cpuRequestMax >= int(container.resources.requests.cpu)) &&
4242
(!(!(has(container.resources.limits)) || !(has(container.resources.limits.cpu))) &&
4343
params.settings.cpuLimitMin <= int(container.resources.limits.cpu) &&
4444
params.settings.cpuLimitMax >= int(container.resources.limits.cpu)))
4545
message: "Workloads contains container/s with cpu limit or request not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0050)"
4646
4747
- expression: >
4848
object.kind != 'CronJob' || object.spec.jobTemplate.spec.containers.all(container, (!(!(has(container.resources)) || !(has(container.resources.requests)) || !(has(container.resources.requests.cpu))) &&
49-
params.settings.cpuLimitMin <= int(container.resources.requests.cpu) &&
50-
params.settings.cpuLimitMax >= int(container.resources.requests.cpu)) &&
49+
params.settings.cpuRequestMin <= int(container.resources.requests.cpu) &&
50+
params.settings.cpuRequestMax >= int(container.resources.requests.cpu)) &&
5151
(!(!(has(container.resources.limits)) || !(has(container.resources.limits.cpu))) &&
5252
params.settings.cpuLimitMin <= int(container.resources.limits.cpu) &&
5353
params.settings.cpuLimitMax >= int(container.resources.limits.cpu)))

controls/C-0268/policy.yaml

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
apiVersion: admissionregistration.k8s.io/v1
2+
kind: ValidatingAdmissionPolicy
3+
metadata:
4+
name: "kubescape-c-0268-deny-resources-with-cpu-request-not-set"
5+
labels:
6+
controlId: "C-0268"
7+
annotations:
8+
controlUrl: "https://hub.armosec.io/docs/c-0268"
9+
spec:
10+
failurePolicy: Fail
11+
paramKind:
12+
apiVersion: kubescape.io/v1
13+
kind: ControlConfiguration
14+
matchConstraints:
15+
resourceRules:
16+
- apiGroups: [""]
17+
apiVersions: ["v1"]
18+
operations: ["CREATE", "UPDATE"]
19+
resources: ["pods"]
20+
- apiGroups: ["apps"]
21+
apiVersions: ["v1"]
22+
operations: ["CREATE", "UPDATE"]
23+
resources: ["deployments","replicasets","daemonsets","statefulsets"]
24+
- apiGroups: ["batch"]
25+
apiVersions: ["v1"]
26+
operations: ["CREATE", "UPDATE"]
27+
resources: ["jobs","cronjobs"]
28+
validations:
29+
- expression: >
30+
object.kind != 'Pod' || object.spec.containers.all(container,
31+
(!(!(has(container.resources)) || !(has(container.resources.requests)) || !(has(container.resources.requests.cpu))) &&
32+
params.settings.cpuRequestMin <= int(container.resources.requests.cpu) &&
33+
params.settings.cpuRequestMax >= int(container.resources.requests.cpu)))
34+
message: "Pods contains container/s with cpu request not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0268)"
35+
36+
- expression: >
37+
['Deployment','ReplicaSet','DaemonSet','StatefulSet','Job'].all(kind, object.kind != kind) || object.spec.template.spec.containers.all(container,
38+
(!(!(has(container.resources)) || !(has(container.resources.requests)) || !(has(container.resources.requests.cpu))) &&
39+
params.settings.cpuRequestMin <= int(container.resources.requests.cpu) &&
40+
params.settings.cpuRequestMax >= int(container.resources.requests.cpu)))
41+
message: "Workloads contains container/s with cpu request not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0268)"
42+
43+
- expression: >
44+
object.kind != 'CronJob' || object.spec.jobTemplate.spec.containers.all(container,
45+
(!(!(has(container.resources)) || !(has(container.resources.requests)) || !(has(container.resources.requests.cpu))) &&
46+
params.settings.cpuRequestMin <= int(container.resources.requests.cpu) &&
47+
params.settings.cpuRequestMax >= int(container.resources.requests.cpu)))
48+
message: "CronJob contains container/s with cpu request not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0268)"

controls/C-0268/tests.json

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
[
2+
{
3+
"name": "Pod with container having cpu request not set is blocked",
4+
"template": "pod.yaml",
5+
"expected": "fail",
6+
"field_change_list": [
7+
]
8+
},
9+
{
10+
"name": "Pod with container having cpu request set and value in the limit is allowed",
11+
"template": "pod.yaml",
12+
"expected": "pass",
13+
"field_change_list": [
14+
"spec.containers.[0].resources.requests.cpu=3"
15+
]
16+
},
17+
{
18+
"name": "Pod with container having cpu request set and value not in the limit is blocked",
19+
"template": "pod.yaml",
20+
"expected": "fail",
21+
"field_change_list": [
22+
"spec.containers.[0].resources.requests.cpu=6"
23+
]
24+
},
25+
{
26+
"name": "Deployment with container having cpu request not set is blocked",
27+
"template": "deployment.yaml",
28+
"expected": "fail",
29+
"field_change_list": [
30+
]
31+
},
32+
{
33+
"name": "Deployment with container having cpu request set and value in the limit is allowed",
34+
"template": "deployment.yaml",
35+
"expected": "pass",
36+
"field_change_list": [
37+
"spec.template.spec.containers.[0].resources.requests.cpu=3"
38+
]
39+
}
40+
]

controls/C-0269/policy.yaml

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
apiVersion: admissionregistration.k8s.io/v1
2+
kind: ValidatingAdmissionPolicy
3+
metadata:
4+
name: "kubescape-c-0269-deny-resources-with-memory-request-not-set"
5+
labels:
6+
controlId: "C-0269"
7+
annotations:
8+
controlUrl: "https://hub.armosec.io/docs/c-0269"
9+
spec:
10+
failurePolicy: Fail
11+
paramKind:
12+
apiVersion: kubescape.io/v1
13+
kind: ControlConfiguration
14+
matchConstraints:
15+
resourceRules:
16+
- apiGroups: [""]
17+
apiVersions: ["v1"]
18+
operations: ["CREATE", "UPDATE"]
19+
resources: ["pods"]
20+
- apiGroups: ["apps"]
21+
apiVersions: ["v1"]
22+
operations: ["CREATE", "UPDATE"]
23+
resources: ["deployments","replicasets","daemonsets","statefulsets"]
24+
- apiGroups: ["batch"]
25+
apiVersions: ["v1"]
26+
operations: ["CREATE", "UPDATE"]
27+
resources: ["jobs","cronjobs"]
28+
validations:
29+
- expression: >
30+
object.kind != 'Pod' || object.spec.containers.all(container,
31+
(!(!(has(container.resources)) || !(has(container.resources.requests)) || !(has(container.resources.requests.memory))) &&
32+
params.settings.memoryRequestMin <= int(container.resources.requests.memory) &&
33+
params.settings.memoryRequestMax >= int(container.resources.requests.memory)))
34+
message: "Pods contains container/s with memory request not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0269)"
35+
36+
- expression: >
37+
['Deployment','ReplicaSet','DaemonSet','StatefulSet','Job'].all(kind, object.kind != kind) || object.spec.template.spec.containers.all(container,
38+
(!(!(has(container.resources)) || !(has(container.resources.requests)) || !(has(container.resources.requests.memory))) &&
39+
params.settings.memoryRequestMin <= int(container.resources.requests.memory) &&
40+
params.settings.memoryRequestMax >= int(container.resources.requests.memory)))
41+
message: "Workloads contains container/s with memory request not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0269)"
42+
43+
- expression: >
44+
object.kind != 'CronJob' || object.spec.jobTemplate.spec.containers.all(container,
45+
(!(!(has(container.resources)) || !(has(container.resources.requests)) || !(has(container.resources.requests.memory))) &&
46+
params.settings.memoryRequestMin <= int(container.resources.requests.memory) &&
47+
params.settings.memoryRequestMax >= int(container.resources.requests.memory)))
48+
message: "CronJob contains container/s with memory request not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0269)"

controls/C-0269/tests.json

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
[
2+
{
3+
"name": "Pod with container having memory request not set is blocked",
4+
"template": "pod.yaml",
5+
"expected": "fail",
6+
"field_change_list": [
7+
]
8+
},
9+
{
10+
"name": "Pod with container having memory request set and value in the limit is allowed",
11+
"template": "pod.yaml",
12+
"expected": "pass",
13+
"field_change_list": [
14+
"spec.containers.[0].resources.requests.memory=128"
15+
]
16+
},
17+
{
18+
"name": "Pod with container having memory request set and value not in the limit is blocked",
19+
"template": "pod.yaml",
20+
"expected": "fail",
21+
"field_change_list": [
22+
"spec.containers.[0].resources.requests.memory=512"
23+
]
24+
},
25+
{
26+
"name": "Deployment with container having memory request not set is blocked",
27+
"template": "deployment.yaml",
28+
"expected": "fail",
29+
"field_change_list": [
30+
]
31+
},
32+
{
33+
"name": "Deployment with container having memory request set and value in the limit is allowed",
34+
"template": "deployment.yaml",
35+
"expected": "pass",
36+
"field_change_list": [
37+
"spec.template.spec.containers.[0].resources.requests.memory=128"
38+
]
39+
}
40+
]

controls/C-0270/policy.yaml

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
apiVersion: admissionregistration.k8s.io/v1
2+
kind: ValidatingAdmissionPolicy
3+
metadata:
4+
name: "kubescape-c-0270-deny-resources-with-cpu-limit-not-set"
5+
labels:
6+
controlId: "C-0270"
7+
annotations:
8+
controlUrl: "https://hub.armosec.io/docs/c-0270"
9+
spec:
10+
failurePolicy: Fail
11+
paramKind:
12+
apiVersion: kubescape.io/v1
13+
kind: ControlConfiguration
14+
matchConstraints:
15+
resourceRules:
16+
- apiGroups: [""]
17+
apiVersions: ["v1"]
18+
operations: ["CREATE", "UPDATE"]
19+
resources: ["pods"]
20+
- apiGroups: ["apps"]
21+
apiVersions: ["v1"]
22+
operations: ["CREATE", "UPDATE"]
23+
resources: ["deployments","replicasets","daemonsets","statefulsets"]
24+
- apiGroups: ["batch"]
25+
apiVersions: ["v1"]
26+
operations: ["CREATE", "UPDATE"]
27+
resources: ["jobs","cronjobs"]
28+
validations:
29+
- expression: >
30+
object.kind != 'Pod' || object.spec.containers.all(container,
31+
(!(!(has(container.resources)) || !(has(container.resources.limits)) || !(has(container.resources.limits.cpu))) &&
32+
params.settings.cpuLimitMin <= int(container.resources.limits.cpu) &&
33+
params.settings.cpuLimitMax >= int(container.resources.limits.cpu)))
34+
message: "Pods contains container/s with cpu limit not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0270)"
35+
36+
- expression: >
37+
['Deployment','ReplicaSet','DaemonSet','StatefulSet','Job'].all(kind, object.kind != kind) || object.spec.template.spec.containers.all(container,
38+
(!(!(has(container.resources)) || !(has(container.resources.limits)) || !(has(container.resources.limits.cpu))) &&
39+
params.settings.cpuLimitMin <= int(container.resources.limits.cpu) &&
40+
params.settings.cpuLimitMax >= int(container.resources.limits.cpu)))
41+
message: "Workloads contains container/s with cpu limit not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0270)"
42+
43+
- expression: >
44+
object.kind != 'CronJob' || object.spec.jobTemplate.spec.containers.all(container,
45+
(!(!(has(container.resources)) || !(has(container.resources.limits)) || !(has(container.resources.limits.cpu))) &&
46+
params.settings.cpuLimitMin <= int(container.resources.limits.cpu) &&
47+
params.settings.cpuLimitMax >= int(container.resources.limits.cpu)))
48+
message: "CronJob contains container/s with cpu limit not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0270)"

controls/C-0270/tests.json

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
[
2+
{
3+
"name": "Pod with container having cpu limits not set is blocked",
4+
"template": "pod.yaml",
5+
"expected": "fail",
6+
"field_change_list": [
7+
]
8+
},
9+
{
10+
"name": "Pod with container having cpu limits set and value in the limit is allowed",
11+
"template": "pod.yaml",
12+
"expected": "pass",
13+
"field_change_list": [
14+
"spec.containers.[0].resources.limits.cpu=3"
15+
]
16+
},
17+
{
18+
"name": "Pod with container having cpu limits set and value not in the limit is blocked",
19+
"template": "pod.yaml",
20+
"expected": "fail",
21+
"field_change_list": [
22+
"spec.containers.[0].resources.limits.cpu=6"
23+
]
24+
},
25+
{
26+
"name": "Deployment with container having cpu limits not set is blocked",
27+
"template": "deployment.yaml",
28+
"expected": "fail",
29+
"field_change_list": [
30+
]
31+
},
32+
{
33+
"name": "Deployment with container having cpu limits set and value in the limit is allowed",
34+
"template": "deployment.yaml",
35+
"expected": "pass",
36+
"field_change_list": [
37+
"spec.template.spec.containers.[0].resources.limits.cpu=3"
38+
]
39+
}
40+
]

controls/C-0271/policy.yaml

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
apiVersion: admissionregistration.k8s.io/v1
2+
kind: ValidatingAdmissionPolicy
3+
metadata:
4+
name: "kubescape-c-0271-deny-resources-with-memory-limit-not-set"
5+
labels:
6+
controlId: "C-0271"
7+
annotations:
8+
controlUrl: "https://hub.armosec.io/docs/c-0271"
9+
spec:
10+
failurePolicy: Fail
11+
paramKind:
12+
apiVersion: kubescape.io/v1
13+
kind: ControlConfiguration
14+
matchConstraints:
15+
resourceRules:
16+
- apiGroups: [""]
17+
apiVersions: ["v1"]
18+
operations: ["CREATE", "UPDATE"]
19+
resources: ["pods"]
20+
- apiGroups: ["apps"]
21+
apiVersions: ["v1"]
22+
operations: ["CREATE", "UPDATE"]
23+
resources: ["deployments","replicasets","daemonsets","statefulsets"]
24+
- apiGroups: ["batch"]
25+
apiVersions: ["v1"]
26+
operations: ["CREATE", "UPDATE"]
27+
resources: ["jobs","cronjobs"]
28+
validations:
29+
- expression: >
30+
object.kind != 'Pod' || object.spec.containers.all(container,
31+
(!(!(has(container.resources)) || !(has(container.resources.limits)) || !(has(container.resources.limits.memory))) &&
32+
params.settings.memoryLimitMin <= int(container.resources.limits.memory) &&
33+
params.settings.memoryLimitMax >= int(container.resources.limits.memory)))
34+
message: "Pods contains container/s with memory limit not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0271)"
35+
36+
- expression: >
37+
['Deployment','ReplicaSet','DaemonSet','StatefulSet','Job'].all(kind, object.kind != kind) || object.spec.template.spec.containers.all(container,
38+
(!(!(has(container.resources)) || !(has(container.resources.limits)) || !(has(container.resources.limits.memory))) &&
39+
params.settings.memoryLimitMin <= int(container.resources.limits.memory) &&
40+
params.settings.memoryLimitMax >= int(container.resources.limits.memory)))
41+
message: "Workloads contains container/s with memory limit not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0271)"
42+
43+
- expression: >
44+
object.kind != 'CronJob' || object.spec.jobTemplate.spec.containers.all(container,
45+
(!(!(has(container.resources)) || !(has(container.resources.limits)) || !(has(container.resources.limits.memory))) &&
46+
params.settings.memoryLimitMin <= int(container.resources.limits.memory) &&
47+
params.settings.memoryLimitMax >= int(container.resources.limits.memory)))
48+
message: "CronJob contains container/s with memory limit not set or they are not in the specified range! (see more at https://hub.armosec.io/docs/c-0271)"

0 commit comments

Comments
 (0)