概率性出现用户无法删除的情况

问题描述

如图,17号用户在带内被删除时删除失败,查看调试日志发现:

是因为用户还在线

查看iam资源树发现

OnlineDeletable确实值为false

这个属性我看了下,【已评审】支持当前用户不可删除协作接口评审 - Interface SIG / Interface评审 - openUBMC 论坛 是去年九月份开发的功能,默认应该是true,没有设置操作日志打印,我看不到机器上属性的修改记录,定制化项文档服务器出厂定制化配置 | 文档中心 | openUBMC 里也没看到

现在的问题是:

1.这个属性是怎么被改成false的呢?我们一批生产机器有七八台里属性值为false,不可能是人为手动修改,难道是定制化项控制的,只是定制化项文档没有更新这个项的介绍?

2.我让装备的同事:带内删除用户→删除失败→收集文件,提供给了我一份收集日志,日志里

17号用户是在线状态的,但是iam资源树下session路径没有该用户创建的会话,是在哪里还残留会话呢?

环境信息

------------------- iBMC INFO -------------------
IPMC CPU: Hi1711
IPMI Version: 2.0
Active iBMC Version: 5.05.12.31
Active iBMC Build: 037
Active iBMC Built: 20:27:08 Jan 27 2026
Backup iBMC Version: 5.05.12.31
Available iBMC Version: 5.05.12.31
Available iBMC Build: 037
Active Uboot Version: 20.8.10.1 (20:54:09 Jan 27 2026)
Backup Uboot Version: 20.8.10.1 (20:54:09 Jan 27 2026)
Active Secure Bootloader Version: 20.8.10.1 (20:53:57 Jan 27 2026)
Backup Secure Bootloader Version: 20.8.10.1 (20:53:57 Jan 27 2026)
Active Secure Firmware Version: 20.8.10.1 (20:53:58 Jan 27 2026)
Backup Secure Firmware Version: 20.8.10.1 (20:53:58 Jan 27 2026)

iam/1.21.65@hw.ibmc.release/rc

HuaKunTG225B2_2102315PGMP0RB100143_20260403-0211.tar.gz.txt (5.4 MB)

答案内容由AI生成,仅供参考:

:puzzle_piece: 结论总结

问题 结论
为什么删除失败? 因 OnlineDeletable=false 且 IsOnline=true,系统策略阻止删除在线用户
为何 OnlineDeletable=false? 极可能是 生产定制化配置隐式设置,需核查生产镜像或部署脚本
为何 IsOnline=true 但无会话? 存在“会话残留”或“状态未清理”,可能因配置文件读取失败或客户端异常断开引起
如何避免此类问题? 建议加强定制项文档管理、加入配置变更日志、完善会话清理机制
点击此处查看详细分析解答

用户无法删除问题分析报告

根据您提供的详细日志和系统信息,以下是对“用户无法删除”问题的综合分析。


:magnifying_glass_tilted_left: 问题概述

在执行带内删除用户 HKZYZB(用户ID 17)操作时,系统返回 “Delete user17’s username (HKZYZB) failed”。调试日志显示关键错误信息为:

Delete account failed, account (user3) is online.
IpmDeleteAccount: AccountNotModified AccountNotModified: The account modification request failed.

进一步排查发现:

  • IAM 资源树中 /bmc/kepler/AccountService/AccountPolicies/Local 路径下的 OnlineDeletable 属性值为 false。
  • 用户资源项中的 IsOnline 为 true,表明系统认为该用户仍处于在线状态。
  • 然而,在会话管理路径下未查询到该用户的活动会话记录,疑似存在 会话残留或状态未同步 问题。

:pushpin: 核心问题定位

1. 用户未能成功删除的根本原因

用户删除失败的直接原因是:

系统策略禁止删除当前在线用户,且此限制已启用(OnlineDeletable = false)

:white_check_mark: 相关证据:

  • 日志明确提示:Delete account failed, account (user3) is online.(参考文档中的搜索结果 #1)
  • 用户资源属性 IsOnline 显示为 true
  • OnlineDeletable=false 表示:不允许删除在线用户
  • 删除请求最终以 AccountNotModified 错误码返回,符合设计规范

此行为由 IAM 组件控制,用于防止正在使用的账户被意外删除。


2. OnlineDeletable 属性被设为 false 的可能来源

:small_blue_diamond: 背景说明:

根据评审文档【[已评审]支持当前用户不可删除协作接口评审】:

  • 新增了资源协作接口:
    path: /bmc/kepler/AccountService/AccountPolicies/:AccountType
    interface: bmc.kepler.AccountService.AccountPolicy
  • 新增属性:OnlineDeletable,类型为 Boolean
  • 默认值应为 true(即允许删除在线用户),false 为显式关闭

:red_question_mark: 您的疑问:一批机器上该值为 false,非手动设置,是否由定制化项控制?文档未更新?

:white_check_mark: 可能原因分析:

可能来源 分析结论
出厂定制化配置(OEM定制) :warning: 极高可能性。
尽管当前公开文档未列出 OnlineDeletable 作为可配项,但很多安全增强型定制会默认关闭“删除在线用户”功能,以避免运维事故。
建议检查生产侧是否有隐藏的“安全模式”或“客户定制模板”中包含此项设置。
自动化脚本/部署流程修改 :warning: 可能。
若存在带内自动初始化脚本(如 oms、persistence 模块参与),可能通过 BMCSet 或资源协作接口动态设定策略。
可检查日志中是否调用类似 busctl set-property 修改该属性。
配置导入文件(如 JSON 策略包) :white_check_mark: 支持。
如搜索结果所述:“可以通过配置导入 LocalAccountNamePattern 清除”或使用接口设置。
若使用 import-config 导入策略包,其中可能包含 AccountPolicy 配置片段。
持久化机制异常导致旧值残留 :repeat_button: 低概率。
除非系统在某次升级中加载了错误的持久化数据,否则正常流程不会产生统一偏移。

:white_check_mark: 建议排查方向:

  1. 检查是否有 BMCSet_OEM... 类型定制接口调用了 AccountPolicy 设置
  2. 审查生产镜像构建流程中是否注入了默认禁止删除在线用户的策略
  3. 查看 mdb_info.log 或 account 组件日志中是否有 OnlineDeletable 属性变更记录
  4. 确认是否存在 BMC.cfg、custom_policy.json 等配置文件中定义该字段

3. 用户显示“在线”但无会话记录的原因分析

资源树中 IsOnline=true,但在 /session 路径下查无对应会话 —— 这是一种典型的“僵尸会话(Zombie Session)”或“状态滞留”问题。

:magnifying_glass_tilted_left: 可能原因如下:

原因 说明
1. 客户端异常断开未触发登出流程 若 SSH、Redfish 或 Web 客户端强制关闭(如断网、kill进程),服务器端未能及时清理状态,可能导致 IsOnline 未置为 false
2. 会话超时机制未生效 若系统 SessionTimeout 设置不合理或服务(如 webserver)未正常广播登出事件,状态无法及时清理
3. IAM 与各服务模块通信中断 例如 webui、ipmi、redfish 模块在登出时未能向 IAM 发送注销通知
4. 数据库/状态持久化异常 如 SQLite 或 MDB 数据库写入失败,造成状态未同步(见 bios ERROR: get /data/opt/setting.json json fail!)

:pushpin: 关键日志线索:

bios ERROR: file_service.lua(65): get /data/opt/setting.json json fail!
bios ERROR: file_service.lua(101): construct_setting_service: get SettingName json fail!

此错误说明 配置文件读取失败,可能影响多个模块的状态维护与持久化,极有可能导致 IsOnline 状态无法正确更新或清除。

:white_check_mark: 建议排查:

  1. 检查 setting.json 文件是否存在、权限是否正确、属主是否为 secbox(沙箱安全要求)
  2. 使用 busctl introspect /bmc/kepler/AccountService/Accounts/17 查看完整状态
  3. 检查 webserver、ipmi、redfish 服务是否有异常重启或连接断开日志
  4. 查看 mdbctl list-sessions(如有)或类似命令输出

:hammer_and_wrench: 解决方案与建议

:white_check_mark: 一、临时恢复方案(当前机器修复)

方法1:手动登出用户后再删除

# 先强制登出用户(若有接口支持)
ipmitool session close <session_id>
# 或通过 Redfish POST /redfish/v1/SessionService/Sessions/<id>/Actions/Session.Terminate

方法2:临时开启删除权限(测试用)

busctl set-property bmc.kepler.AccountService.AccountPolicy \
  /bmc/kepler/AccountService/AccountPolicies/Local \
  bmc.kepler.AccountService.AccountPolicy OnlineDeletable b true

:warning: 注意:仅限调试,生产环境慎用

方法3:重启 account 或 iam 服务清理状态

systemctl restart iam account

:white_check_mark: 二、长期根因解决建议

措施 说明
:pushpin: 更新定制化文档 将 OnlineDeletable 加入《出厂定制化配置》文档,明确其作用与默认值
:pushpin: 增加属性变更日志 在 account-collection.lua 中为 OnlineDeletable 变更添加审计日志(如 operation_logger 记录)
:pushpin: 修复配置文件读取异常 排查 setting.json 读取失败问题,确保存在且可访问,修复权限问题
:pushpin: 增强会话健康检查机制 引入定时任务扫描 IsOnline=true 但无对应会话的对象,自动清理(如超时30分钟)
:pushpin: 开发诊断工具 提供 bmc-debug check-online-users 工具,一键列出所有疑似“僵尸在线”用户

:puzzle_piece: 结论总结

问题 结论
为什么删除失败? 因 OnlineDeletable=false 且 IsOnline=true,系统策略阻止删除在线用户
为何 OnlineDeletable=false? 极可能是 生产定制化配置隐式设置,需核查生产镜像或部署脚本
为何 IsOnline=true 但无会话? 存在“会话残留”或“状态未清理”,可能因配置文件读取失败或客户端异常断开引起
如何避免此类问题? 建议加强定制项文档管理、加入配置变更日志、完善会话清理机制

:paperclip: 附录参考

  • 相关资源协作接口路径:

    /bmc/kepler/AccountService/AccountPolicies/Local
      └─ OnlineDeletable (Boolean, 默认 true)
    /bmc/kepler/AccountService/Accounts/17
      └─ IsOnline (Boolean)
    
  • 相关错误码:

    • AccountNotModified:账户未被修改(复用错误码)
    • AuthorizationFailed:认证失败或账户被锁定(见日志示例)
  • 相关模块:

    • iam:身份与访问管理核心
    • account:用户账户服务
    • mdb:持久化数据库
    • busctl:资源协作接口调试工具

:white_check_mark: 建议下一步:
请协调生产/定制团队确认是否存在未公开的 AccountPolicy 定制策略,并对 setting.json 文件路径进行权限与完整性检查。

是不是开了 CMCC 定制化,这个我记得开了 CMCC 定制化就会生效此功能

这个IsOnline属性是在CMCC定制仓设置的src/lualib/cmcc_config.lua,会话创建设置为false,会话删除设置为true

会话创建设置为false,会话删除设置为true

这是有什么背景么?和IsOnline的名字完全相反呀,以及,这个问题是偶现的,只有一部分机器出现了

不好意思,我写的逻辑反了,应该是 会话创建设置为true,会话删除设置为false,偶现原因需要进一步定位了