4. 访问控制基础:主体、客体、操作、权限模型的三要素
聊 HSM 的细粒度权限之前,得先把最底层的概念理清楚。你想想看,不管多复杂的权限系统,拆到底就是三个东西:谁?对什么?干什么?谁在操作、操作哪个对象、执行什么行为——这就是主体、客体和操作。我在给银行做 HSM 密钥管理体系设计时,一开始光盯着策略配,结果安全审计被卡在了“谁是谁”的定义上……说白了,基础没打牢,上层全是窟窿。
4.1 主体:动作的发起者
主体,就是那个发起访问请求的实体。在 HSM 场景下,主体不一定是人。可能是:
- 管理员用户:登录 HSM 管理界面的人,通常拥有最高权限。
- 应用服务:比如支付系统、CA 系统,通过 API 调用 HSM 功能。
- 进程或线程:运行在安全域内的程序模块,甚至 HSM 内部的微引擎。
- 角色或组:实际项目中我们经常把一组权限赋给“审计员”、“密钥管理员”这类角色。
我踩过的坑: 曾经有个客户把主体当成“用户ID”来管,结果应用服务换了机器,IP变了,主体失效。后来我要求所有主体必须绑定 数字证书或安全令牌,不依赖网络位置。记住:HSM 里主体标识要硬件锚定。
大部分 HSM 产品用 安全域 这个概念来组织主体。每个主体在注册时会分配一个唯一标识符(比如在 PKCS#11 里的 slot 用户)。设计时我建议区分“操作者”和“审批者”,这在后面做双人控制时用得上。
4.2 客体:受保护的资源
客体就是被访问的“东西”。HSM 里的客体大部分是密码学对象,但也包括配置文件和日志。常见客体有:
| 客体类型 | 示例 | 敏感性 |
|---|---|---|
| 密钥 | RSA 私钥、AES 密钥 | 极高(明文从不离开 HSM) |
| 证书 | X.509 证书公钥对 | 中(公钥可导出,私钥不可) |
| 令牌对象 | PIN 码、认证 | 高 |
| 配置策略 | 访问控制策略文件 | 高 |
| 审计日志 | 操作记录 | 中(只读追加) |
核心原则: 客体必须有一个不可伪造的 句柄。我习惯在每个密钥创建时附加元数据标签(用途、有效期、所属域),审计时一眼就能看出哪个客体被碰过。
4.3 操作:被允许的行为
操作定义了主体能对客体做什么。HSM 的操作粒度比通用操作系统细很多,因为每一种密码算法都可能对应单独权限。比如:
- 生成:创建密钥对或者对称密钥。
- 签名/验签:使用私钥签名数据,或用公钥验证。
- 加密/解密:用密钥执行加解密运算。
- 导出/包装:把密钥加密后输出到外部(危险操作,通常需要双人授权)。
- 删除:销毁密钥。
- 读取属性:查看密钥长度、算法类型等元信息。
你可能会问:为什么操作要分这么细?我举个例子:之前有个金融项目,开发人员想用 HSM 做数据加密,但他们申请了“全部操作”权限。结果有人误调用了密钥导出函数,把私钥包装出去……幸好是测试环境。之后我强制每个操作类型独立授权,哪怕先麻烦点。
千万不要 把“管理员”权限等同于“能做任何操作”。HSM 最佳实践是:最小权限 + 职责分离。比如“密钥生成”和“密钥删除”必须分配给不同主体。你想想看,一个人又能创建又能删除,安全防线就形同虚设了。
4.4 权限模型的三要素
把上面三个东西组合起来,就形成了经典的 主体-客体-操作 三元组。每个权限本质上就是:允许/拒绝 某个主体 对某个客体 执行某个操作。市面上常见的 HSM 权限模型有:
- DAC(自主访问控制):客体所有者授权给其他主体。但 HSM 里很少用,因为密钥不归单个用户“所有”。
- MAC(强制访问控制):根据安全标签(如机密/秘密/绝密)强制规则。某些政府用 HSM 会用到。
- RBAC(基于角色的访问控制):最常用。主体属于角色,角色有权限。我90%的项目选这个。
- ABAC(基于属性的访问控制):根据主体、客体、环境的属性动态计算。HSM 里较少原生支持,但可通过外部策略引擎实现。
以 PKCS#11 标准为例,它的权限模型是“ 用户”(用户角色、安全官角色)加“对象属性”。每个对象有 CKA_PRIVATE(个人用户才可操作)、CKA_MODIFIABLE(是否可改)等属性——实际上就是一种简化版的三要素组合。
我个人最喜欢的组合是 RBAC + 属性约束。 比如:“密钥管理员”角色可以对所有密钥加密,但额外限制:只有超过2048位的RSA密钥才能执行签名操作。这样既清晰又灵活,审计时也好解释。
上面这张图把三个要素和决策引擎串起来了。你看到中间那个紫色的大框——那就是 HSM 内部的核心权限规则引擎。它每次做检查时读三样东西:主体身份、操作请求、客体句柄,然后去策略库里找匹配的规则。匹配到了就放行,没匹配到就拒绝。
4.5 实践中的粒度设计
知道了三要素,怎么落地到 HSM 里呢?我通常按这几个步骤来:
- 穷举主体角色:列出所有可能使用 HSM 的角色,哪怕临时运维也要考虑。
- 清单客体分类:把密钥、证书、配置文件按敏感度分级。
- 矩阵化操作:画一个主体×客体的表格,在交叉格子里填允许的操作。
- 最小化默认权限:默认全部拒绝,只开放明确需要的。
- 添加约束条件:比如“只能在工作时间操作”、“必须双人认证”。
避坑指南: 我曾经在一个大型支付系统里照搬了通用 RBAC,结果审计发现密钥管理员居然能修改审计策略——因为角色权限是“管理员”,太粗了。后来我把“管理员”拆成“密钥管理员”、“策略管理员”、“审计管理员”三个角色,各自只能操作对应客体。细粒度设计不嫌麻烦,出事更麻烦。
好了,这一章把访问控制最基础的三个概念讲透了。主体、客体、操作,加上把它们组合起来的权限模型(RBAC、ABAC 等)。你只要记住那个三要素关系图,后面所有细粒度控制方法都在这三个碗里打转。设计 HSM 权限时,从这三个维度去调粒度,肯定不会跑偏。