Back to Checks
iac

Manage all resources

KSV-0046
Service: kubernetesSeverity: critical
OfficialBuilt-inVerified

Full control of the cluster resources, and therefore also root on all nodes where workloads can run and has access to all pods, secrets, and data.

Run this check with Prowler

Run in Prowler Cloud
Run
prowler iac --checks KSV-0046

Check Code

# METADATA
# title: "Manage all resources"
# description: "Full control of the cluster resources, and therefore also root on all nodes where workloads can run and has access to all pods, secrets, and data."
# scope: package
# schemas:
# - input: schema["kubernetes"]
# related_resources:
# - https://kubernetes.io/docs/concepts/security/rbac-good-practices/
# custom:
#   id: KSV-0046
#   long_id: kubernetes-no-wildcard-resource-clusterrole
#   aliases:
#     - AVD-KSV-0046
#     - KSV046
#     - no-wildcard-resource-clusterrole
#     - kubernetes-no-wildcard-resource-clusterrole
#   severity: CRITICAL
#   recommended_actions: "Remove '*' from 'rules.resources'. Provide specific list of resources to be managed by cluster role"
#   input:
#     selector:
#     - type: kubernetes
#       subtypes:
#         - kind: clusterrole
package builtin.kubernetes.KSV046

import rego.v1

import data.lib.kubernetes

readVerbs := ["create", "update", "delete", "deletecollection", "impersonate", "*", "list", "get"]

readKinds := ["ClusterRole"]

resourceAllowSpecificVerbOnAnyResource contains input.rules[ru] if {
	some ru, r, v
	input.kind == readKinds[_]
	input.rules[ru].resources[r] == "*"
	input.rules[ru].verbs[v] == readVerbs[_]
}

deny contains res if {
	badRule := resourceAllowSpecificVerbOnAnyResource[_]
	msg := kubernetes.format(sprintf("%s '%s' shouldn't manage all resources", [kubernetes.kind, kubernetes.name]))
	res := result.new(msg, badRule)
}