我一直致力于识别 Kubernetes RBAC 清单文件中授予用户、组或服务帐户广泛访问权限的角色。最初,我正在确定动词和资源对象的通配符(“*”)的用法。我的工作是自动化这个过程并检测给定清单文件中的任何通配符用法。为了更好地解释我的用例,我提供了一个示例 RBAC 角色,它允许对 pod 执行所有操作。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: sample_role
namespace: testspace
rules:
- apiGroups:
- '*'
resources:
- 'pods'
verbs:
- '*'
当这个 sample_role 与任何用户绑定时,它允许他们对 pod 执行所有操作。很容易检测到任何此类用法并将其自动化(像 kubiscan 这样的开源工具已经在这样做了)。然而,当我开始研究更多这些清单文件时,我遇到了非常具有挑战性的用例。挑战不在于角色,而在于该角色与谁相关。请查看示例代码以了解我的用例。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: sample_role
namespace: testspace
rules:
- apiGroups:
- '*'
resources:
- 'pods'
verbs:
- '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: sample_role_duplicate
namespace: testspace
rules:
- apiGroups:
- '*'
resources:
- 'pods'
verbs:
- '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: sample-role-binding
namespace: testspace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: sample_role
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: Engineer
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: sample-role-duplicate-binding
namespace: testspace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: sample_role_duplicate
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: Operations
在这个用例中,sample_role 和 sample_role_duplicate 都授予对 pod 的广泛访问权限。sample_role 绑定到 Engineers 组,sample_role_duplicate 绑定到 Operations 组。我目前的方法会标记两个角色并提醒编写此清单文件的人。但在第二个示例中,工程师组被允许广泛访问 pod,而操作组不允许广泛访问 pod。我识别任何此类异常的最初想法是创建此类角色绑定的列表并为该角色创建异常。但是,当添加任何类似的新角色和组时,这很难管理。我发现自动化这个过程更加困难。我想知道是否有更好的方法来解决这个问题?我想听听你的想法。