Skip to content

Commit 177405c

Browse files
committed
Refactor namespace checks for workload connections in gateway rules
1 parent 31c1dfb commit 177405c

File tree

3 files changed

+64
-17
lines changed
  • rules

3 files changed

+64
-17
lines changed

rules/exposure-to-internet-via-gateway-api/raw.rego

+44-10
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ deny[msga] {
1717
not is_exposed_service(svc)
1818

1919
wl := input[_]
20-
wl.metadata.namespace == svc.metadata.namespace
20+
is_same_namespace(wl.metadata, svc.metadata)
2121
spec_template_spec_patterns := {"Deployment", "ReplicaSet", "DaemonSet", "StatefulSet", "Pod", "Job", "CronJob"}
2222
spec_template_spec_patterns[wl.kind]
23-
wl_connected_to_service(wl, svc)
23+
pod := get_pod_spec(wl)["spec"]
24+
wl_connected_to_service(pod, svc)
2425

2526
result := svc_connected_to_httproute(svc, httproute)
2627

@@ -56,23 +57,56 @@ is_exposed_service(svc) {
5657
svc.spec.type == "LoadBalancer"
5758
}
5859

60+
wl_connected_to_service(wl, svc) {
61+
5962

60-
wl_connected_to_service(wl, svc) {
61-
wl.metadata.namespace == svc.metadata.namespace
63+
count({x | svc.spec.selector[x] == wl.metadata.labels[x]}) == count(svc.spec.selector)
6264
}
6365

64-
wl_connected_to_service(wl, svc) {
65-
count({x | svc.spec.selector[x] == wl.metadata.labels[x]}) == count(svc.spec.selector)
66+
67+
is_same_namespace(metadata1, metadata2) {
68+
metadata1.namespace == metadata2.namespace
69+
}
70+
71+
is_same_namespace(metadata1, metadata2) {
72+
not metadata1.namespace
73+
not metadata2.namespace
74+
}
75+
76+
is_same_namespace(metadata1, metadata2) {
77+
not metadata2.namespace
78+
metadata1.namespace == "default"
79+
}
80+
81+
is_same_namespace(metadata1, metadata2) {
82+
not metadata1.namespace
83+
metadata2.namespace == "default"
84+
}
85+
86+
87+
88+
# get_volume - get resource spec paths for {"Deployment","ReplicaSet","DaemonSet","StatefulSet","Job"}
89+
get_pod_spec(resources) := result {
90+
resources_kinds := {"Deployment","ReplicaSet","DaemonSet","StatefulSet","Job"}
91+
resources_kinds[resources.kind]
92+
result = {"spec": resources.spec.template, "start_of_path": "spec.template."}
6693
}
6794

68-
wl_connected_to_service(wl, svc) {
69-
wl.spec.selector.matchLabels == svc.spec.selector
95+
# get_volume - get resource spec paths for "Pod"
96+
get_pod_spec(resources) := result {
97+
resources.kind == "Pod"
98+
result = {"spec": resources, "start_of_path": ""}
7099
}
71100

72-
wl_connected_to_service(wl, svc) {
73-
count({x | svc.spec.selector[x] == wl.spec.template.metadata.labels[x]}) == count(svc.spec.selector)
101+
# get_volume - get resource spec paths for "CronJob"
102+
get_pod_spec(resources) := result {
103+
resources.kind == "CronJob"
104+
result = {"spec": resources.spec.jobTemplate.spec.template.spec, "start_of_path": "spec.jobTemplate.spec.template.spec."}
74105
}
75106

107+
108+
109+
76110
svc_connected_to_httproute(svc, httproute) = result {
77111
rule := httproute.spec.rules[i]
78112
ref := rule.backendRefs[j]

rules/exposure-to-internet-via-istio-ingress/raw.rego

-4
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,6 @@ is_exposed_service(svc) {
142142
}
143143

144144

145-
wl_connected_to_service(wl, svc) {
146-
wl.metadata.namespace == svc.metadata.namespace
147-
}
148-
149145
wl_connected_to_service(wl, svc) {
150146
count({x | svc.spec.selector[x] == wl.metadata.labels[x]}) == count(svc.spec.selector)
151147
}

rules/exposure-to-internet/raw.rego

+20-3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ deny[msga] {
4646
wl := input[_]
4747
spec_template_spec_patterns := {"Deployment", "ReplicaSet", "DaemonSet", "StatefulSet", "Pod", "Job", "CronJob"}
4848
spec_template_spec_patterns[wl.kind]
49+
is_same_namespace(wl.metadata, svc.metadata)
4950
wl_connected_to_service(wl, svc)
5051

5152
result := svc_connected_to_ingress(svc, ingress)
@@ -82,9 +83,6 @@ is_exposed_service(svc) {
8283
svc.spec.type == "LoadBalancer"
8384
}
8485

85-
wl_connected_to_service(wl, svc) {
86-
wl.metadata.namespace == svc.metadata.namespace
87-
}
8886

8987
wl_connected_to_service(wl, svc) {
9088
count({x | svc.spec.selector[x] == wl.metadata.labels[x]}) == count(svc.spec.selector)
@@ -107,3 +105,22 @@ svc_connected_to_ingress(svc, ingress) = result {
107105
}
108106

109107

108+
109+
is_same_namespace(metadata1, metadata2) {
110+
metadata1.namespace == metadata2.namespace
111+
}
112+
113+
is_same_namespace(metadata1, metadata2) {
114+
not metadata1.namespace
115+
not metadata2.namespace
116+
}
117+
118+
is_same_namespace(metadata1, metadata2) {
119+
not metadata2.namespace
120+
metadata1.namespace == "default"
121+
}
122+
123+
is_same_namespace(metadata1, metadata2) {
124+
not metadata1.namespace
125+
metadata2.namespace == "default"
126+
}

0 commit comments

Comments
 (0)