Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: add system authenticate bind protection policy #65

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions avd_docs/kubernetes/gke/AVD-KSV-01011/docs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

Binding to system:authenticate group to any clusterrole or role is a security risk.

### Impact
<!-- Add Impact here -->

<!-- DO NOT CHANGE -->
{{ remediationActions }}


39 changes: 39 additions & 0 deletions checks/kubernetes/gke/authenticate_group_bind.rego
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# METADATA
# title: "system:authenticate group access binding"
# description: "Binding to system:authenticate group to any clusterrole or role is a security risk."
# scope: package
# schemas:
# - input: schema["kubernetes"]
# related_resources:
# - https://orca.security/resources/blog/sys-all-google-kubernetes-engine-risk/
# custom:
# id: KSV01011
# avd_id: AVD-KSV-01011
# severity: CRITICAL
# short_code: no-system-authenticated-group-bind
# recommended_action: "Remove system:authenticated group binding from clusterrolebinding or rolebinding."
# input:
# selector:
# - type: kubernetes
# subtypes:
# - kind: rolebinding
# - kind: clusterrolebinding

package appshield.kubernetes.KSV01011

import data.lib.kubernetes

readRoleRefs := ["system:authenticated"]

readKinds := ["RoleBinding", "ClusterRolebinding"]

authenticatedGroupBind(roleBinding) {
kubernetes.kind == readKinds[_]
kubernetes.object.subjects[_].name == readRoleRefs[_]
}

deny[res] {
authenticatedGroupBind(input)
msg := kubernetes.format(sprintf("%s '%s' should not bind to roles %s", [kubernetes.kind, kubernetes.name, readRoleRefs]))
res := result.new(msg, input.metadata)
}
111 changes: 111 additions & 0 deletions checks/kubernetes/gke/authenticate_group_bind_test.rego
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package appshield.kubernetes.KSV01011

# Test case for a RoleBinding with system_authenticated user binding
test_role_binding_with_system_authenticated_group_binding {
r := deny with input as {
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "RoleBinding",
"metadata": {
"name": "roleGroup",
"namespace": "default",
},
"subjects": [
{
"kind": "Group",
"name": "system:authenticated",
"apiGroup": "rbac.authorization.k8s.io",
},
{
"kind": "User",
"name": "system:anonymous",
"apiGroup": "rbac.authorization.k8s.io",
},
],
"roleRef": {
"kind": "Role",
"name": "some-role",
"apiGroup": "rbac.authorization.k8s.io",
},
}

count(r) == 1
}

#Test case for a ClusterRoleBinding with system:authenticated group binding
test_cluster_role_binding_with_system_authenticate_binding {
r := deny with input as {
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "ClusterRolebinding",
"metadata": {
"name": "clusterRoleGroup",
"namespace": "default",
},
"subjects": [
{
"kind": "Group",
"name": "system:authenticated",
"apiGroup": "rbac.authorization.k8s.io",
},
{
"kind": "User",
"name": "system:anonymous",
"apiGroup": "rbac.authorization.k8s.io",
},
],
"roleRef": {
"kind": "ClusterRole",
"name": "clusterrole",
"apiGroup": "rbac.authorization.k8s.io",
},
}

count(r) == 1
}

# Test case for a RoleBinding with non system_authenticated group binding
test_role_binding_with_non_system_authenticated_binding {
r := deny with input as {
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "RoleBinding",
"metadata": {
"name": "nonRole",
"namespace": "default",
},
"subjects": {
"kind": "Group",
"name": "system:unauthenticated",
"apiGroup": "rbac.authorization.k8s.io",
},
"roleRef": {
"kind": "Role",
"name": "role",
"apiGroup": "rbac.authorization.k8s.io",
},
}

count(r) == 0
}

# Test case for a ClusterRoleBinding with non system_authenticated group binding
test_cluster_role_binding_with_non_system_authenticated_group_binding {
r := deny with input as {
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "ClusterRoleBinding",
"metadata": {
"name": "non_anonymous_user",
"namespace": "default",
},
"subjects": {
"kind": "Group",
"name": "system:unauthenticated",
"apiGroup": "rbac.authorization.k8s.io",
},
"roleRef": {
"kind": "ClusterRole",
"name": "clusterrole",
"apiGroup": "rbac.authorization.k8s.io",
},
}

count(r) == 0
}