关于 building-role-mining-for-rbac-optimization
这份技能介绍如何从现有用户—权限分配中发现并评估 RBAC 角色,面向设计或改进访问控制的安全团队。它结合聚类、形式概念分析和图方法,并强调业务方验证与最小权限。
主要功能
- 01构建用户—权限矩阵
- 02使用聚类发现候选角色
- 03通过形式概念分析挖掘角色
- 04评估覆盖率与结构复杂度
- 05组织业务方验证角色
适用场景
- 01整合过度细分的现有角色
- 02为合规控制设计角色模型
- 03检查权限分配中的异常项
- 04规划新角色模型迁移
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill building-role-mining-for-rbac-optimization安装后在 Claude Code 中输入/building-role-mining-for-rbac-optimization确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py详细介绍
为 RBAC 优化构建角色挖掘
概述
角色挖掘是分析现有用户-权限分配,以发现基于角色的访问控制(RBAC)系统最优角色的过程。组织会随着时间推移,通过岗位变动、项目分配和临时权限授予积累过多权限,导致“角色爆炸”,即存在数千个粒度很细且重叠严重的角色。角色挖掘使用数据分析——包括聚类算法、形式概念分析和基于图的方法——将权限整合为一组最小的角色,这些角色既能准确反映业务职能,又能强制执行最小权限原则。
何时使用
- 在环境中部署或配置用于 RBAC 优化的角色挖掘能力时
- 在建立与合规要求一致的安全控制时
- 在为该领域构建或改进安全架构时
- 在执行需要此实现的安全评估时
前提条件
- 当前用户-权限分配的导出文件(CSV/数据库)
- 身份治理平台或目录服务访问权限
- Python 3.9+,并安装 pandas、scikit-learn、numpy
- 理解组织结构和岗位职能
- 可用于角色验证研讨会的利益相关者访问权限
核心概念
角色挖掘方法
| 方法 | 描述 | 最适合 |
|---|---|---|
| 自下而上 | 分析现有权限以发现常见模式 | 权限自然增长的大型数据集 |
| 自上而下 | 根据业务需求和岗位描述设计角色 | 全新 RBAC 或组织重组 |
| 混合 | 将自下而上的分析与自上而下的业务验证相结合 | 大多数生产环境 |
角色挖掘算法
1. 权限聚类:使用 k-means 或层次聚类将具有相似权限集的用户分组。同一聚类中的用户共享一个共同角色。
2. 形式概念分析(FCA):一种数学框架,可从二元用户-权限矩阵中识别完整的概念集合(共享完全相同权限集的用户组)。
3. 基于图的挖掘:将用户和权限建模为二分图,然后找到表示候选角色的稠密子图。
4. 布尔矩阵分解:将用户-权限矩阵 U 分解为 U ≈ R × P,其中 R 将用户映射到角色,P 将角色映射到权限。
角色挖掘指标
| 指标 | 公式 | 目标 |
|---|---|---|
| 角色数量 | 挖掘后的不同角色总数 | 最小化 |
| 覆盖率 | 由挖掘角色解释的权限 / 总权限 | > 95% |
| 加权结构复杂度(WSC) | 角色-用户 + 角色-权限分配之和 | 最小化 |
| 偏差 | 未被已分配角色覆盖的额外权限 | < 5% |
工作流
步骤 1:提取用户-权限数据
从所有身份来源收集当前访问状态:
import pandas as pd
import numpy as np
# Load user-permission assignments
# Format: user_id, permission_id (one row per assignment)
assignments = pd.read_csv("user_permissions.csv")
# Create binary user-permission matrix (UPA matrix)
upa_matrix = assignments.pivot_table(
index="user_id",
columns="permission_id",
aggfunc="size",
fill_value=0
)
upa_matrix = (upa_matrix > 0).astype(int)
print(f"Users: {upa_matrix.shape[0]}")
print(f"Permissions: {upa_matrix.shape[1]}")
print(f"Assignments: {assignments.shape[0]}")
print(f"Density: {upa_matrix.values.sum() / upa_matrix.size:.2%}")
步骤 2:使用聚类进行自下而上的角色发现
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import silhouette_score
def find_optimal_clusters(matrix, max_k=50):
"""Find optimal number of roles using silhouette analysis."""
scores = []
for k in range(2, min(max_k, matrix.shape[0])):
clustering = AgglomerativeClustering(
n_clusters=k, metric="jaccard", linkage="average"
)
labels = clustering.fit_predict(matrix)
score = silhouette_score(matrix, labels, metric="jaccard")
scores.append((k, score))
optimal_k = max(scores, key=lambda x: x[1])[0]
return optimal_k, scores
def mine_roles_clustering(upa_matrix, n_clusters):
"""Mine roles using hierarchical clustering on Jaccard distance."""
clustering = AgglomerativeClustering(
n_clusters=n_clusters, metric="jaccard", linkage="average"
)
user_matrix = upa_matrix.values
labels = clustering.fit_predict(user_matrix)
roles = {}
for cluster_id in range(n_clusters):
cluster_users = upa_matrix.index[labels == cluster_id]
cluster_permissions = upa_matrix.loc[cluster_users]
# Core role = permissions held by >80% of cluster members
permission_frequency = cluster_permissions.mean()
core_permissions = permission_frequency[permission_frequency >= 0.8].index.tolist()
roles[f"Role_{cluster_id}"] = {
"permissions": core_permissions,
"user_count": len(cluster_users),
"users": cluster_users.tolist(),
"coverage": permission_frequency[permission_frequency >= 0.8].mean()
}
return roles, labels
步骤 3:形式概念分析
def mine_roles_fca(upa_matrix, min_support=3):
"""Mine roles using Formal Concept Analysis (frequent closed itemsets)."""
from itertools import combinations
users = upa_matrix.index.tolist()
permissions = upa_matrix.columns.tolist()
concepts = []
# Find all maximal permission sets shared by at least min_support users
for size in range(len(permissions), 0, -1):
for perm_combo in combinations(permissions, size):
perm_set = set(perm_combo)
# Find users who have ALL permissions in this set
matching_users = []
for user in users:
user_perms = set(upa_matrix.columns[upa_matrix.loc[user] == 1])
if perm_set.issubset(user_perms):
matching_users.append(user)
if len(matching_users) >= min_support:
# Check if this is a closed concept (no superset with same extent)
is_closed = True
for concept in concepts:
if set(matching_users) == set(concept["users"]) and \
perm_set.issubset(set(concept["permissions"])):
is_closed = False
break
if is_closed:
concepts.append({
"permissions": list(perm_set),
"users": matching_users,
"support": len(matching_users)
})
if len(concepts) > 100: # Limit for performance
break
return concepts
步骤 4:评估并选择角色
def evaluate_role_set(roles, upa_matrix):
"""Evaluate the quality of a mined role set."""
total_assignments = upa_matrix.values.sum()
covered_assignments = 0
extra_assignments = 0
for role_name, role_data in roles.items():
role_perms = set(role_data["permissions"])
for user in role_data["users"]:
user_perms = set(upa_matrix.columns[upa_matrix.loc[user] == 1])
covered = role_perms.intersection(user_perms)
extra = role_perms - user_perms
covered_assignments += len(covered)
extra_assignments += len(extra)
metrics = {
"total_roles": len(roles),
"total_assignments": total_assignments,
"covered_assignments": covered_assignments,
"coverage_rate": covered_assignments / total_assignments if total_assignments else 0,
"extra_permissions": extra_assignments,
"deviation_rate": extra_assignments / (covered_assignments + extra_assignments) if (covered_assignments + extra_assignments) else 0,
"avg_role_size": np.mean([len(r["permissions"]) for r in roles.values()]),
"avg_users_per_role": np.mean([r["user_count"] for r in roles.values()]),
}
return metrics
步骤 5:业务验证
在挖掘候选角色后:
- 将挖掘出的角色映射到业务职能(部门、岗位名称)
- 与业务单元经理开展研讨会以验证角色定义
- 识别表明配置错误的异常权限
- 根据反馈优化角色并重新评估指标
- 记录角色定义及业务理由
验证清单
- 从所有身份源中提取用户权限矩阵
- 比较多种挖掘算法(聚类、FCA)
- 通过轮廓分析或 WSC 确定最佳角色数量
- 覆盖率超过现有分配方案的 95%
- 偏差率低于 5%(最小化额外权限)
- 与业务相关方共同验证挖掘出的角色
- 定义角色层级(父子继承)
- 记录例外/离群权限
- 制定迁移到新角色模型的迁移计划
- 定义持续的角色治理流程
参考
评论
支持 Markdown