Azure Cosmos DB仅追加访问配置及事件溯源事件不可变性方案咨询
1. Azure Cosmos DB 仅追加访问权限配置
首先给出明确结论:容器层面完全可以实现仅允许新增的访问权限,不需要上升到数据库层面,具体实现方式如下:
- 优先使用Azure Cosmos DB 数据平面自定义RBAC角色:你可以自行创建自定义角色,仅给角色分配以下必要权限:
- 基础元数据读取权限:
Microsoft.DocumentDB/databaseAccounts/readMetadata - 容器项创建权限:
Microsoft.DocumentDB/databaseAccounts/containers/items/create
把该角色的赋值范围指定到目标容器,关联对应的服务账号、AAD主体后,对应主体就只能向该容器新增数据,无法执行更新、删除、替换等修改操作。
- 基础元数据读取权限:
- 如果你的环境还没有启用AAD RBAC,也可以用存储过程兜底实现:关闭容器的直接写入权限,所有写入请求必须调用你预先编写的仅追加逻辑的存储过程,存储过程内部仅执行插入操作、不处理任何修改/删除逻辑,仅给访问主体分配存储过程执行权限即可。
如果你需要给整个数据库下的所有容器都配置仅追加权限,直接把上述自定义RBAC角色的赋值范围设为数据库级别即可,所有子容器会默认继承该权限规则。
2. 基于Azure Cosmos DB的事件溯源系统保障事件不可变性的成熟方案
业内常用的可行方案如下,可根据业务场景组合使用:
- 权限层拦截:采用上一问题提到的细粒度自定义RBAC配置,给业务服务账号仅分配事件容器的创建权限,完全移除所有修改、删除类权限。如果需要做事件补偿等特殊操作,走单独的权限审批流程,临时分配高权限操作,全程留痕。
- 数据结构+索引约束:事件主键设计为
聚合根ID+事件版本号/事件序号的组合,同时为该组合字段创建唯一索引,避免同一个聚合根的同一个版本重复插入事件,也从结构上避免篡改(Cosmos DB 主键不可修改,要修改主键只能删除原项重新插入,删除权限已经被禁用的情况下无法实现篡改)。同时事件内容中内置创建时间戳、内容哈希值两个不可修改字段,写入后固定,可用于后续校验。 - 备份兜底校验:开启Cosmos DB的连续备份与时间点恢复功能,最长可保留30天的全量备份数据,即使出现极端权限泄露导致的数据篡改,也可以快速恢复到篡改前的状态,同时可对比备份数据与当前数据识别篡改内容。
- 多副本交叉校验:通过Cosmos DB 变更 feed 实时把事件数据同步到另一个不可篡改存储,定期跑校验任务对比两边数据的哈希值,不一致时立即触发告警。
- 业务层统一收口:所有事件写入请求不允许直接操作Cosmos DB,统一走封装好的事件写入SDK/中间件,中间件内置拦截逻辑,直接拒绝所有更新、删除类请求,同时自动校验事件版本、生成内容哈希,从业务入口避免非法修改。
内容的提问来源于stack exchange,提问作者dbardakov
相关产品推荐
相关产品推荐

