diagnose.rego
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# diagnose.rego — Diagnostic reporting entrypoint ==============================
#
# Classifies active policies (data.policies) as compliant or non-compliant
# using evaluate's deny/warn output. If a policy has both, deny wins. 
# Compliant includes not-applicable policies as well as genuine passes.
# Query (structured): data.diagnose.results
# Query (console)   : data.diagnose.summary

package diagnose

import data.common.policydoc as policydoc

# Policy Counter Helpers -------------------------------------------------------

policy_ids_total := {id | some id, p in data.policies; p.status == "active"}
policy_ids_non_compliant_deny := {id |
	some msg in data.evaluate.deny
	id := split(msg.rule_id, " ")[0]
}
policy_ids_non_compliant_warn := {id |
	some msg in data.evaluate.warn
	id := split(msg.rule_id, " ")[0]
} - policy_ids_non_compliant_deny
policy_ids_compliant := policy_ids_total - policy_ids_non_compliant_deny - policy_ids_non_compliant_warn

# Outputs (structured & console formatted) -------------------------------------

results := {
	"policies_in_catalog": count(policy_ids_total),
	"compliant": count(policy_ids_compliant),
	"non_compliant_deny": count(policy_ids_non_compliant_deny),
	"non_compliant_warn": count(policy_ids_non_compliant_warn),
	"compliant_ids": policy_ids_compliant,
	"non_compliant_deny_ids": policy_ids_non_compliant_deny,
	"non_compliant_warn_ids": policy_ids_non_compliant_warn,
}

summary_message := `Catalog contains %d active policies
Found %d compliant policies: %s
Found %d non-compliant policies (deny level): %s
Found %d non-compliant policies (warn level): %s
`

summary := sprintf(summary_message, [
	count(policy_ids_total),
	count(policy_ids_compliant), policydoc.concat_array(sort(policy_ids_compliant), "NA"),
	count(policy_ids_non_compliant_deny), policydoc.concat_array(sort(policy_ids_non_compliant_deny), "NA"),
	count(policy_ids_non_compliant_warn), policydoc.concat_array(sort(policy_ids_non_compliant_warn), "NA"),
])