现场是这样的。工具权限按用户角色做了过滤,但后台任务用服务账号统一调用,服务账号在角色表里是 admin,等于所有工具对批处理全开放,日志里能看到删表工具被调过。
中间走过弯路,把「批处理的工具清单与前台共用一份」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。服务账号被赋了超级角色;权限校验只在前端入口做,内部调用直接过;没有区分人调用与机器调用的审计。
先列出服务账号可用的工具清单
python -c "import json;d=json.load(open('roles.json'));print(d.get('svc_batch'))"
给服务账号单独最小权限角色
python -c "print({'role':'svc_batch','tools':['read_kb','write_report']})"
再往下在工具网关层强制校验调用方身份
python -c "print('auth=caller_identity')"
末了用服务账号尝试越权工具确认被拒
python tool_try.py --as svc_batch --tool drop_table --expect 403
恢复的判定其实很直接。服务账号的可调用工具收敛到 2 个,越权调用返回 403,审计日志里人与机器的调用分开统计。
这里还有个坑。机器身份往往比人权限更大,却最容易被忽略;服务账号要单独建角色,别复用 admin,否则前台做得再细也白费。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
