ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

讯维全域智能管控平台权限管理:RBAC模型与数据权限实战解析

讯维全域智能管控平台权限管理:RBAC模型与数据权限实战解析 干过全域智能管控平台项目的朋友应该都有体会大屏联动、视频调度、告警推送这些功能做起来再复杂起码逻辑是看得见摸得着的。但权限管理不一样它平时不显山不露水一出问题就是大问题——某个部门的值班员能点开另一个部门的布控页面或者一个本该只读的账号突然能动核心策略……这种事一旦在演示或实战时发生前面做得再好也白费。所以今天想专门聊聊讯维全域智能管控平台的权限管理功能从权限模型设计、功能实现到安全管控需求的落地把这块“地基工程”拆开讲透。这篇东西适合正在做平台类项目或者要对接管控平台、梳理权限体系的朋友尤其建议那些想把RBAC权限管理设计真正落到项目里的人收藏。1. 全域智能管控平台里的权限管理为什么值得单独拿来讲1.1 一个真实应用场景多部门共用一套平台时的权限矛盾全域智能管控平台往往不是给单一部门用的。指挥中心要看全局态势运维部门要管设备和链路值班员要处理告警和工单领导要看统计报表第三方厂商要进场做设备调试。这几类人的职责完全不同对平台的诉求也互相冲突。举个例子指挥中心的大屏调度员日常工作就是在几十块屏之间切换画面。他需要快速调取任意点位但绝不希望自己误触到设备配置页面把云台参数改了。运维人员正好相反他们要能改设备配置、重启服务但业务录像和数据报表这些敏感内容按内控要求不能让他们随意查看。领导要的是全局数据看板但他大概率不需要也不应该去操作具体门禁或者摄像头的转向。如果没有一套完善的权限管理机制这些矛盾就变成了一个无法调和的“人人都是超级管理员”的局面。谁都能进系统谁都能看数据谁都能操作设备——平台越大事故概率越高出了事还找不到责任人。所以权限管理不是锦上添花而是全域管控平台的刚需。1.2 权限管理本质上要回答的三个问题落到具体实现上讯维全域智能管控平台的权限管理功能核心就是在回答三个问题你是谁——身份认证。确认当前操作者是合法用户而不是冒用身份的入侵者。你能看什么——数据权限。在合法用户里再划定数据可见范围比如按组织、按区域、按项目隔离。你能做什么——操作权限。对功能模块和操作按钮做控制决定你是只读、可编辑还是可以审批、导出、删除。这三层缺一不可。很多平台只做了“能进系统”和“能开页面”把数据权限完全忽略掉结果就是A部门的人登录后能遍历出所有部门的数据。要知道权限管理的本质不是让人“进不去”而是让合适的人在合适的时间只能接触他职责范围内该接触的东西。这句话全域管控平台的权限设计要反复揣摩。2. 权限模型怎么设计RBAC是底座但不是全部2.1 用户、角色、权限三张表把复杂授权变简单现在做权限管理很少有人还傻到给每个用户单独配权限——那在几十个用户的时候还能撑住到了几百上千个用户就是灾难。讯维这类平台采用的是业界标准的RBAC权限管理设计思路也就是用户-角色-权限三层模型。这里面的核心思想非常朴素把“权限”从“用户”身上剥离开中间引入“角色”这一层。用户不再直接和权限挂钩而是先挂到角色上角色再持有权限。比如“值班员”是一个角色这个角色拥有告警查询、工单处理、画面调阅的权限新来一个值班员只需要把他的账号挂到“值班员”角色下他就自动获得了这一整套权限。不用一条一条去配也不会出现“这个老员工有导出权限、新员工却没有”这种因人而异的混乱。在数据库层面这个模型落地通常是五张表用户表、角色表、权限表、用户-角色关联表、角色-权限关联表。如果权限项本身又分目录、菜单、按钮、接口这种不同层级权限表里加一个“权限类型”字段做区分就行。做权限配置页面时管理员看到的就是一个“给某角色勾选哪些权限”的界面背后其实就是往角色-权限关联表里插入或删除记录。但这个模型在真正工程落地时有两点特别容易被忽略。第一RBAC不是简单的“三张表”它还包含角色继承和职责分离的概念。角色继承很好理解比如“高级运维”可以继承“基础运维”的所有权限这样能少配很多重复项。职责分离则是指某些互斥的角色不能被分配给同一个人典型的就是“审批人”和“经办人”不能是同一个否则审批环节就形同虚设。讯维处理这类问题时会在角色表上增加父子关系和互斥标记在用户分配角色时做校验。2.2 数据权限角色管“能不能用”数据范围管“能看哪一片”RBAC解决的是“功能权限”也就是某个用户可不可以访问某个模块、能不能点某个按钮。但全域智能管控平台还有一个更头疼的问题同一个角色下的人数据可见范围也可能不同。比如“巡查看护”这个角色张三负责A园区李四负责B园区。两个人都有“查看监控”的功能权限但张三不应该看到B园区的摄像头李四也不应该看到A园区的数据。这时候就需要在角色之外再叠加一层数据范围控制。数据权限的模型常见做法是给数据表附加组织/区域/项目属性用户或者用户所属角色再限定一个数据范围。这个范围可以是“仅本人”“本部门”“本部门及下级部门”“全部”“按自定义规则”。落到SQL层就是动态拼接过滤条件的问题。-- 原始查询查询所有告警记录 SELECT * FROM alarm_record; -- 加了数据权限之后如果用户属于XX园区则只查该园区 SELECT * FROM alarm_record WHERE area_code IN ( SELECT area_code FROM sys_user_area WHERE user_id #{currentUserId} );这里有一个容易踩的坑数据权限过滤必须放在后端不能靠前端去“隐藏数据”。否则用户直接调接口、改参数就能把别人的数据也拉出来。讯维平台的接口层统一做了这种数据范围注入任何数据查询都会自动追加当前用户的数据权限条件从源头上把越权的路堵死。2.3 从文件系统特殊权限里抄作业SUID、SGID、Sticky Bit的启发聊到权限管理最近很多人也把“文件系统特殊权限与属性管理”这个知识点翻了出来。乍一看它和平台权限管理是两码事——一个是Linux系统对文件的权限控制一个是业务平台的用户权限控制——但底层思想是高度相通的。Linux里有三个特殊权限位值得对照来看。第一个是SUID它允许普通用户在执行某个程序时临时获得文件属主的权限最典型的就是passwd命令普通用户改密码时能以root身份去写/etc/shadow。第二个是SGID它让新建的文件自动继承所在目录的属组多用于团队协作目录。第三个是Sticky Bit也叫粘滞位它保证在公共目录里只有文件属主或root才能删除文件最常见的例子就是/tmp目录任何人都能往里写但谁也不能删别人的临时文件。这三个机制映射到讯维全域智能管控平台里对应关系很有意思SUID的“临时提权”思想对应平台的临时授权/应急授权功能。比如运维人员在紧急排障时申请一个15分钟的设备控制权限审批通过后临时生效过期自动回收这就是一种可控的SUID。SGID的“属组继承”思想对应平台的角色继承和资源归属继承。比如在某个组织节点下创建的子摄像头点位自动继承父级组织的权限归属免去逐台配置的麻烦。Sticky Bit的“公共资源防误删”思想对应平台上共享大屏模板、公共告警策略这类资源的保护。任何用户都可以调用公共模板但只有模板创建者和平台管理员能修改或删除避免有人手滑把大家都依赖的公共配置给改了。Linux还有文件和目录的不可变属性chattr i设置了之后即使是root也不能随意修改或删除文件除非先移除这个属性。这个思路对应到平台里就是关键配置的防篡改。比如告警阈值、联动策略这些核心数据除了要权限控制之外还要加一道“不可变”锁——就算有配置权限的人想改也必须走二次审批并且保留完整修改记录。有了这套“权限属性管理”的双保险全域管控平台的核心配置才真正安全。3. 讯维平台的权限管理功能是如何一步步落地的3.1 认证先把“你是谁”搞清楚权限管理的第一步是认证也就是判断当前登录的人确实是平台认可的合法用户。讯维全域智能管控平台的认证体系按照部署环境的不同一般有三种形态。第一种是本地账号密码认证。这是最基础的方式密码策略、登录失败的锁定策略、密码有效期都可以配置。工程上需要注意的点是密码不能明文存储至少要做加盐哈希密码输入错误连续多次要锁定账号一段时间防止暴力猜测。第二种是统一身份认证对接。在政企项目里平台往往不是一个独立系统还有办公OA、工单系统、资产管理系统等一堆平台。这时候最合理的做法是对接统一身份源比如LDAP或AD域控。用户日常只需要记住一套账号密码从统一门户登录后跳转到讯维平台时自动完成身份信任传递不需要二次输入密码。这个在企业里体验极好也避免了多平台各建各的账号体系导致的“僵尸账号”泛滥。第三种是增强认证。涉密程度比较高的场景会要求短信验证码、动态口令或者数字证书做双因子认证。特别是领导账号和管理员账号一旦被冒用影响面太大了双因子几乎是必备。认证做完之后系统会给当前会话签发一个凭证也就是我们常说的Token。这个Token要有过期时间不能签发之后永久有效。工程实践上讯维会把Token过期时间设置成会话空闲超时和绝对超时两段——比如用户连续操作30分钟不活跃会话过期或者不管活不活跃登录满8小时强制重新认证。这样即使有人拿到了一个Token也只在有限时间内有效风险可控。3.2 授权菜单、按钮、数据三层校验缺一不可认证通过只是拿到了“进门资格”接下来才是权限管理的主战场授权。讯维的授权体系分三个层面每个层面解决一个维度的问题。第一层是菜单权限。用户登录后平台根据他所属角色渲染对应的菜单树。没有权限的菜单模块在界面上直接不展示。这一层解决的是“你能看到哪些功能入口”。实现上后端在返回用户菜单列表时就已经做了过滤前端根据返回结果渲染路由。第二层是按钮权限。很多平台的权限管理做到了菜单一级就停了结果用户进到页面里所有按钮都能点只是点了之后报错。这种体验极其糟糕。好一点的做法是按钮一级也做权限控制管理员勾选角色权限时能精确到“查询”“新增”“修改”“删除”“导出”“审批”这些操作级别。前端拿到按钮权限标识后没有权限的按钮直接隐藏或置灰。第三层是数据权限。这个我在上一节讲过是真正容易出问题的一层。菜单权限和按钮权限可以统称为“功能权限”它们回答的是“能不能进、能不能点”数据权限回答的是“进去了之后能看到哪些数据范围内的内容”。比如告警查询页面同样的查询按钮A园区的用户只能查出A园区的告警B园区的用户只能查出B园区的告警数据范围完全不同。工程落地时这三层权限全部要在后端做二次校验。前端隐藏菜单、置灰按钮都只是用户体验层面的优化不能作为安全边界。真正的安全边界在服务端——请求进来之后拦截器把这个请求需要的权限码取出来和当前用户拥有的权限码做对比不匹配就直接返回403。后端校验这一关做扎实了哪怕有人用Postman直接调接口也调不通这才叫权限管理到位了。这块的实现思路简单概括就是// 接口鉴权伪代码示例 RequiresPermission(code alarm:export) public void exportAlarmRecord(HttpServletRequest request) { // 1. 拦截器解析Token获取当前用户 // 2. 校验用户是否拥有 alarm:export 权限码 // 3. 校验数据范围注入当前用户可见的数据区域 // 4. 通过后才执行导出逻辑 }3.3 审计权限操作要留痕日志要能追溯权限管理不能只管“事前审批”和“事中控制”还要管“事后追溯”。讯维平台在审计这一块至少会记录三类日志。第一类是登录日志。谁在什么时间、用什么IP、从什么终端登录了系统登录是成功还是失败。这类日志主要用于发现异常登录行为比如凌晨三点有账号从异地IP登录就需要立刻关注是否有账号失窃风险。第二类是操作日志。用户对关键资源做了什么操作包括增删改查、设备控制、策略配置、数据导出等。操作日志要详细到“谁、何时、对哪个资源、做了什么动作、结果如何”。尤其在出事故的时候操作日志是定位问题、划定责任的最重要的依据。第三类是权限变更日志。这个往往被忽略但非常重要。权限管理系统的自身安全同样需要审计——管理员给某个账号赋予了导出权限这个操作本身要记录一个角色被授予了大范围数据权限这个变更也要记录。防止“把权限放大”成为内部数据泄露的突破口。日志本身还要考虑防篡改。比较简单的做法是把日志写入独立的日志库管理员的日志库权限与业务系统隔离开更严格的做法是采用日志签名或者哈希链每写一条日志都带上上一条日志的摘要任何人改掉历史日志都能被检测出来。在合规考核严格的项目里这个能力是硬指标。4. 这样一套权限体系能满足哪些安全管控需求4.1 防越权横向越权和纵向越权一起堵住权限管理方案设计得好不好关键看能不能防住两类越权。第一类叫横向越权通俗讲就是同级之间的越权——同是值班员A用户通过猜测或修改请求参数访问到B用户的私人数据、负责区域的数据。第二类叫纵向越权就是低权限用户尝试访问高权限功能比如普通操作员想调用管理员才能用的“系统配置”接口。讯维平台的方案里防横向越权主要靠的是数据和资源维度的归属校验。任何数据在查询、详情、修改、删除操作时系统都会校验当前用户和该数据的归属关系、数据范围是否匹配。比如一个值班员尝试把请求里的报警记录ID改成别人的后端在取数时会发现这条记录不在当前用户的数据范围内直接拒绝返回。防纵向越权靠的是前面说的接口鉴权层每个敏感接口都绑定了对应的权限码没有该权限码的用户即使知道接口地址也调不动。实际项目中横向越权是最容易被忽视的因为它的触发路径比较隐蔽光靠页面操作测试发现不了得靠专门的数据权限排查。我会在第5章把排查方法一起讲。4.2 防泄露导出管控、水印溯源、最小权限三板斧全域智能管控平台上有大量敏感数据——视频调阅记录、告警信息、人员布控名单、设备资产台账。这些数据一旦被导出后二次扩散源头往往很难追查。平台在权限管理框架下一般会叠加三层防泄露措施。第一层是导出权限控制。不是所有人都能点“导出”按钮。导出的权限码独立配置并且可以在导出前设置审批流——用户申请导出部门负责人审批审批通过后才真正生成导出文件。第二层是水印溯源。这个非常实用。导出后的文件名或文件内容里嵌入登录人账号、手机号、导出时间的水印信息。图片类内容叠加暗水印肉眼看不出来但一旦外泄技术人员提取水印就能知道是哪个人、哪个时间点导出的。水印机制本身不算权限管理但它是权限管理在数据防泄露场景里的有力补充。第三层就是最小权限原则的落地。平台在配置角色权限时遵循“默认拒绝、按需授权”的思路——新角色默认不拥有任何权限由管理员根据职责逐项勾选每个权限点都要回答“这个角色真的需要吗”而不是图省事直接给个大而全的权限模板。最小权限做扎实了很多泄露风险在源头就不存在。4.3 合规与审计身份鉴别、访问控制、操作记录的合规闭环现在政企项目对安全合规的要求越来越严格等保测评几乎是必过的一关。讯维全域智能管控平台的权限管理功能在合规层面也能对上细节。比如身份鉴别方面等保要求“用户身份鉴别信息不能明文存储”“登录失败要有处理措施”“远程管理要防暴力破解”。平台本地密码加盐存储、登录失败锁定、超时强制下线这些能力就是对应的落地。访问控制方面等保要求“授予用户所需的最小权限实现用户权限的分离”。RBAC模型加上数据范围控制正好契合这条要求。特别是“权限分离”平台在角色里增加互斥校验避免同一个人既经办又审批。安全审计方面等保要求“对用户行为进行审计审计记录要留存”。平台的登录日志、操作日志、权限变更日志把“谁在什么时间做了什么”完整记录日志留存周期支持按项目要求配置比如等保三级要求日志留存不少于6个月。有了这套闭环做等保测评时权限管理这一块基本不需要临时补作业。4.4 多租户与第三方托管的隔离需求经常被问到的还有一类场景平台是多个部门共用的或者设备运维已经外包给第三方公司。这种“多租户”形态下权限隔离比单组织时要敏感得多。不同部门之间不只是业务数据要隔离连设备分组、告警策略、操作记录都应该是独立的。讯维平台处理这种需求时会在组织维度上做深度的隔离设计。用户在哪个组织节点就天然只能看到这个组织节点及其下级的数据。第三方运维厂商则被单独放在一个“供应商”组织下并且按项目边界授权——厂商工程师进场后只能看到他们负责的那几台设备默认没有平台全局资产列表更不能跨项目查看其他设备。这种思路用一句话总结让平台上的每个主体都活在“自己的格子间”里。格子间的墙就是组织、项目、区域这些数据维度权限管理负责把这面墙砌好、守住。5. 实操实录权限配置过程中的常见坑与排查方法5.1 权限改了不生效大概率是会话和缓存的问题用得久了就会发现权限模块最多的问题就是“明明改了权限用户那边却不生效”。遇到这种情况先别急着翻代码按下面的顺序排查。第一个嫌疑是会话缓存。用户登录的时候系统把权限列表加载进了Token或者会话缓存里之后每次请求都直接从缓存里取哪怕你在后台把角色的权限改了只要用户当前的会话缓存没刷新他拿到的还是旧权限。解决方案是权限变更时主动清理相关用户的会话缓存或者强制用户重新登录。工程上讯维提供了一个“强制下线”的操作管理员调整权限后可以一键踢掉目标账号的在线会话下次登录自然加载最新的权限。第二个嫌疑是浏览器缓存和前端状态。前端有些模块会把按钮权限存在全局状态里不刷新页面就一直不更新。解决方法是权限变更后让用户重新打开前端页面或者做一次前端权限状态的重新拉取。5.2 角色越配越乱需要定期做权限收敛项目跑了一两年后权限管理最大的隐患往往是“角色爆炸”。今天给张三单独加个权限明天给李四单独加个权限后天某个领导要临时看全范围数据管理员图省事直接给他挂个管理员角色。结果角色数量越来越多权限边界越来越模糊最后到底谁有什么权限连管理员都说不清。这个问题的根源在于没有定期做权限梳理和收敛。我建议的做法是每季度做一次权限复核拉出所有角色及其权限清单重点检查三类情况一是是否存在长期不用的“僵尸角色”二是是否存在权限范围过于宽泛的角色三是是否存在一人挂多个角色后形成“权限叠加越界”的账号。排查出问题后该关停的关停该收敛的收敛。还有一个细节值得注意角色的权限变更要保留变更前的快照不然出问题时没法回滚。虽然听起来是管理问题但在系统里落实并不难——角色权限保存前生成一份变更前记录留档备查即可。5.3 数据权限出现越界多半是组织架构和历史数据的问题数据权限的坑比功能权限更隐蔽。最常见的情况是组织架构调整之后数据权限跟着出了问题。比如原来张三在A园区名下数据权限能看A园区后来张三调到了B园区账号信息更新了但历史告警数据里很多记录还挂在A园区的编码下。张三按新组织刷新权限后理论上他只看得到B园区但因为权限过滤条件是“所属区域属于当前用户可见区域”历史遗留数据如果区域编码维护得不准就会出现该看到的看不到、不该看到的却冒出来。解决这个问题要从两头入手。数据源头这一侧所有业务数据在落库的时候必须把组织/区域属性写完整不能依赖用户查询时再根据设备反推权限模型这一侧数据范围规则尽量用组织树的动态路径匹配比如“本部门及下级部门”这种规则组织树一调整权限范围自动跟着变不用重新配置。5.4 最要命的坑前端藏了按钮后端却没校验最后必须单独讲一个最容易踩、也最致命的问题。有些项目为了赶进度权限管理只做了前端控制——菜单按角色渲染按钮按角色隐藏但后端接口本身没有做任何权限校验。表面上看起来一切正常低权限用户确实看不到按钮、进不了菜单但只要他用开发者工具抓个包或者直接用Postman构造请求照样能把那些“没有权限”的接口调通。这个坑之所以常见是因为测试阶段都在界面上点点点很少有人去模拟非正常路径。我的建议是权限测试清单里必须包含“接口直连测试”这一项退掉低权限账号把高权限接口的请求参数原样拷贝过来用低权限账号的Token去调用观察是否被拦截。如果后端能正确返回403才算真正过关。另外有一点要提醒后端校验的权限码和前端按钮的权限标识必须使用同一份权限数据源不能前端一套编码、后端一套编码。否则前端显示正常后端一校验就失败或者更糟后端忘了校验静默放行这个隐患会一直埋在那里。最后说点我个人的实操体会。权限管理这个模块我在好几个项目里干过踩过的坑比写过的代码还多。最深的感受是权限设计一定要前置不要等界面做完了、接口调通了再补权限。补权限的结果往往是所有接口都加一遍校验漏一个就埋一个雷而且测试阶段很难发现。更成熟的做法是项目启动时就把权限模型定下来用户、角色、数据范围都设计好开发过程中每个接口都天然带权限校验而不是后补。另外一个很重要的建议是权限管理不要只盯着角色和按钮一定要把“数据权限”当成一等公民来设计。很多“严重越权”事故功能权限上一点问题都没有按钮该藏的藏了、菜单该过滤的过滤了但用户通过修改查询条件把全平台的数据都拉了出来。数据权限做深了权限管理才算真正过关。如果你是第一次做这种全域管控平台的权限体系建议把最小权限原则刻在脑子里默认拒绝按需授权能不给就不给能今天回收就不拖到明天。权限这个东西给出去容易收回来难。尤其是管理员账号一定不要几个人共用账号实名到人操作日志才有人可追。记住一套成熟的权限管理好的体验是让人感觉不到权限的存在坏的结果是出事的时候谁也查不到是谁干的。这套东西不复杂但需要耐心也需要敬畏心。
返回列表