account
版本信息
| 项目 | 内容 |
|---|---|
| 组件版本 | 1.120.42 |
| 首发版本 | 1.70.19 |
| 文档作者 | dowantgo |
| 最后更新 | 2026-08-25 |
1. 组件概述
1.1 组件简介
account 是 openUBMC 的用户与用户服务管理核心组件,负责 BMC 上所有用户及用户相关服务的管理。提供用户查询、创建、删除、用户密码策略配置、用户类型管理等功能。
在系统中,account 组件通过资源协作接口对外暴露用户、角色、登录规则、SNMP 团体名、密码策略等对象,提供本地认证、VNC 认证、RMCP 认证等RPC服务。
组件整体采用领域驱动设计(DDD)架构,分为四层:
- 接口层(interface):作为组件级的对外统一出口,处理北向映射器、IPMI 通道下发的属性/方法变化,统一记录操作日志。
- 服务层(service):完成多个领域对象与外部服务之间协调性、组合性的交互逻辑,作为各业务模块的出口。
- 领域层(domain):提供相关实体类定义,承载核心业务逻辑,包括管理与备份用户、管理登录规则、管理权限角色等。
- 基础设施层(infrastructure):提供供其他层调用的底层功能与公用处理方法的封装。
1.2 解决什么问题
account 组件为 BMC 的安全访问控制提供了统一的用户管理底座:
- 统一管理所有“用户”:IPMI 用户、本地用户、定制(OEM)用户,以及被视为用户管理的 SNMP 团体名、VNC 密码、SNMPv3 trap 用户、框内通信用户,权限与策略一致生效。
- 提供整套密码安全体系:密码复杂度检查、弱口令字典、历史密码检查、密码有效期/最短使用期、用户名密码前缀比对、首次登录强制改密。
- 提供登录访问控制:用户与权限关联、三条登录规则(IP/MAC/时间)、角色权限九大权限及自定义角色,登录接口管理
1.3 核心功能
- 核心功能一:用户生命周期管理 —— 新建、查询、修改、删除本地用户(ID 2~17)与 OEM 用户(内部 ID 101~115),含用户名、密码、登录接口、角色权限、首次登录策略、用户使能/禁用、手动锁定/解锁等属性管理。
- 核心功能二:密码策略与安全服务 —— 密码复杂度检查、弱口令字典导入导出与检查、历史密码检查、密码最大/最短有效期、用户名密码前缀比对、首次登录强制改密策略。
- 核心功能三:登录访问控制 —— 登录接口(Web/SNMP/IPMI/SSH/SFTP/Local/Redfish)管理、三条登录规则(IP 规则、MAC 规则、时间规则)、紧急登录用户(不受登录规则/接口/有效期限制)、角色权限九大权限管理及自定义角色。
- 核心功能四:特殊账户管理 —— VNC 密码、SNMP 团体名(ro/rw,支持长团体名)、SNMPv3 用户鉴权/加密算法与密码、SSH 公钥导入删除、SNMP trapv3 用户、框内通信账户管理。
1.4 关键术语表
| 术语 | 解释 |
|---|---|
| 本地用户 | 由 BMC 自身维护、存储在 BMC 数据库中的用户,ID 2~17,密码存储于 Linux shadow 文件 |
| OEM 用户 | 定制用户,内部 ID 101~115,满足定制场景使用 |
| 紧急登录用户 | 不受登录规则、登录接口、密码有效期限制的管理员用户,避免所有用户被限制后无法登陆 |
| 登录规则 | 从 IP / MAC / 时间三个维度限制用户可登录的规则) |
| 弱口令字典 | 预先导入的弱密码清单,密码命中字典(字典使能时)不允许被设置 |
1.5 外部交互边界图
2. API 使用说明与示例
调用约定与安全提示:文中
a{ss}为调用上下文字典,示例中的Interface、UserName、ClientAddr、Privilege应替换为实际调用环境 可用的上下文;<账号ID>、<用户名>等尖括号内容均为占位符。busctl输出开头的y、u、b、s、ss等是 D-Bus 类型标记,属于成功响应 的一部分。涉及账号删除、改密、锁定、策略、SNMP 团体名或公钥的示例会改变 设备状态,验证前应记录原值并在结束后恢复;密码、私钥和 SNMP Ku 等敏感值 不应写入文档、工单或普通日志。
2.1 用户集合对象(ManagerAccounts)
提供新建用户、按用户名查ID、设置用户可修改属性与锁定用户等能力。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.New method a{ss}ysayiaii y -
.NewOEMAccount method a{ss}yssa{ss} y -
.GetIdByUserName method a{ss}s y -
.GetUidGidByUserName method a{ss}s uu -
.SetAccountWritable method a{ss}ya{sb} - -
.GetAccountWritable method a{ss}y a{sb} -
.SetAccountLockState method a{ss}yb - -功能说明
通过该对象完成用户集合级的管理操作:新建本地用户(New)、新建 OEM 用户(NewOEMAccount)、按用户名查询用户 ID(GetIdByUserName)与 UID/GID(GetUidGidByUserName)、设置/查询用户属性的可修改性(Set/GetAccountWritable,用于制造定制化)、设置用户手动锁定状态(SetAccountLockState)。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.ManagerAccounts |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| New | ysayiaii | y | 新建用户 | 入参: y: 用户 ID,0(由系统从未占用的2~17中选择)或2~17 s: 用户名,1~32 字符;创建时还受当前账号类型的 NamePattern 策略及其他业务校验限制ay: 密码字节数组,接口最大长度为 512 字节;实际密码要求还受当前密码策略限制 i: 角色ID:0 或2~20,枚举值见下方表格 ai: 登录接口数组,登录接口枚举值见下方表格 i: 首次登录策略:1-提示修改密码;2-强制修改密码 出参: y: 新建用户 ID |
| NewOEMAccount | yssa{ss} | y | 新建 OEM 用户 | y: 用户ID,101~115 s: 用户名,1~32 字符;创建时还受当前账号类型的 NamePattern 策略及其他业务校验限制s: 密码,1~1024 字符;实际密码要求还受当前密码策略限制 a{ss}: 额外信息:operation(操作类型,取值:New-新建或Verify-校验)、role_id(角色ID,枚举值见下方表格)、interface(登录接口集合,枚举值见下方表格)、first_login_policy(首次登录策略:1-提示修改密码;2-强制修改密码)、is_pwd_encrypted(是否为密文密码,取值:2-是,其他-否) 出参: y: 新建用户 ID |
| GetIdByUserName | s | y | 通过用户名获取用户 ID | s: 用户名,1~32 字符(<root> 会被映射为 root)出参: y: 用户 ID,0~255 |
| GetUidGidByUserName | s | uu | 通过用户名查找用户 UID/GID | s: 用户名,1~32 字符 出参: u: UID(非负整数),u: GID(非负整数) |
| SetAccountWritable | ya{sb} | - | 设置用户某属性是否可修改 | y: 用户 ID,2~115 a{sb}: 属性可修改性字典( *Writable 属性名→是否可修改),例如 UserNameWritable→false |
| GetAccountWritable | y | a{sb} | 获取用户属性可修改性 | y: 用户 ID,2~115 出参: a{sb}: 属性可修改性字典,例如 UserNameWritable→true/false |
| SetAccountLockState | yb | - | 设置用户锁定状态 | y: 用户 ID,2~115 b: 锁定状态(true 锁定 / false 解锁) |
角色类型:
| 类型 | 枚举值 | 描述 |
|---|---|---|
| NoAccess | 0 | 无权限 |
| CommonUser | 2 | 普通用户 |
| Operator | 3 | 操作员 |
| Administrator | 4 | 管理员 |
| CustomRole1~4 | 5~8 | 自定义用户1~4 |
| CustomRole5~16 | 9~20 | 自定义用户5~16 (定制开启) |
登录接口类型:
| 类型 | 枚举值 | 描述 |
|---|---|---|
| Web | 1 | 使用浏览器登录BMC Web界面 |
| SNMP | 2 | 使用符合SNMP协议的终端工具登录BMC |
| IPMI | 4 | 使用符合IPMI协议的终端工具登录BMC |
| SSH | 8 | 使用符合SSH协议的终端工具登录BMC命令行 |
| SFTP | 16 | 使用符合SFTP协议的终端工具登录BMC文件系统 |
| Local | 64 | 通过服务器的串口登录BMC命令行 |
| Redfish | 128 | 使用符合Redfish协议的工具登录BMC |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.UserFull | 新建用户失败 | 用户数量已达上限 | 删除无用用户后再新建 |
| kepler.account.InvalidAccountId | 新建/操作失败 | 用户 ID 非法(如指定为 1) | 使用合法用户 ID |
| kepler.account.UserNameInvalid | 新建用户失败 | 用户名不符合命名规则 | 按 AccountPolicy.NamePattern 规则命名 |
| ResourceAlreadyExists | 新建用户失败 | 用户名已存在 | 更换用户名 |
| PropertyValueOutOfRange | 新建OEM用户失败 | 用户ID超出范围 | 使用范围内的OEM用户ID |
| y | 新建用户成功返回用户 ID | NA | NA |
应用场景
- Web/CLI/Redfish 接口新建本地用户、配置角色与登录接口
- 制造定制化批量下发 OEM 用户
- 按用户名查询用户 ID 以定位后续操作方法
- 用户找回、登录失败锁定后的解锁操作(SetAccountLockState)
限制条件
New中 AccountId 取值范围 0~17,0 表示由系统自动选择,1 为内置管理员不允许指定New密码为ay字节数组,不会在总线上明文透传;NewOEMAccount密码为字符串(1~1024 字符)SetAccountWritable/GetAccountWritable中属性可修改性为字符串键字典;键名使用*Writable形式,例如UserNameWritable。修改前应先读取并记录原值,验证后恢复原值- 通过 SNMP 接口调用
New时,组件内部走account_service_snmp分支,仅设置用户名
调试示例
命令行调试
# 新建本地用户(不指定用户 ID,角色=管理员(4),1个登录接口=Web(1),强制首次改密(2))
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
New a{ss}ysayiaii 3 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 \
0 <用户名> <密码长度> <字节数组形式的密码> 4 1 1 2
响应示例:
成功:y <系统自动分配的账号 ID>
失败:Call failed: {"registry_prefix":"<注册表前缀>","name":"ResourceAlreadyExists","format":"The requested resource already exists."}
适用版本
1.70.19 及以上
# 新建oem用户(指定用户 ID(102),角色=管理员(4),登录接口 9=Web(1)+SSH(8),强制首次改密(2))
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
NewOEMAccount a{ss}yssa{ss} 3 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 \
102 <用户名> <密码> 4 operation New role_id 4 interface 9 first_login_policy 2
响应示例:
成功:y 102
失败:Call failed: {"name":"PropertyValueOutOfRange","params":["162","AccountId"],"args_with_index":["%1:162","%1"],"registry_prefix":"<注册表前缀>","format":"The value '%s' for the property %s is not in the supported range of acceptable values."}
适用版本
1.70.19 及以上
# 按用户名查询用户 ID
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
GetIdByUserName a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 user01
响应示例:
成功:y <该用户名对应的账号 ID>
失败:Call failed: {“registry_prefix”:“<注册表前缀>”,“format”:“UserName not exist.”,“name”:“UserNameNotExist”}
适用版本
1.70.19 及以上
# 按用户名查询 UID/GID(用户名必须是当前环境中已存在的测试账号)
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
GetUidGidByUserName a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <测试用户名>
响应示例:
成功:uu <UID> <GID>
适用版本
1.70.19 及以上
# 查询指定账号的属性可修改性;先记录 UserNameWritable 的原值
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
GetAccountWritable a{ss}y 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <账号ID>
响应示例:
成功:`a{sb} <属性数量> "UserNameWritable" <true|false> ...`
适用版本
1.70.19 及以上
# 设置指定账号的用户名可修改性为 false;验证后必须恢复为上一步读取的原值
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
SetAccountWritable a{ss}ya{sb} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <账号ID> 1 UserNameWritable false
响应示例:
`SetAccountWritable` 成功:无输出。
随后再次调用 `GetAccountWritable`,预期:
`a{sb} <属性数量> "UserNameWritable" false ...`
# 恢复 UserNameWritable 原值(将 <原值> 替换为查询时记录的 true 或 false)
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
SetAccountWritable a{ss}ya{sb} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <账号ID> 1 UserNameWritable <原值>
# 预期响应:无输出。恢复后再次调用 GetAccountWritable,
# UserNameWritable 应回到 <原值>。
适用版本
1.70.19 及以上
# 锁定指定账号(先通过 get-property 记录 Locked 原值;验证后用原值恢复)
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount Locked
# 预期响应:b <原Locked值>
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
SetAccountLockState a{ss}yb 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <账号ID> true
# 预期响应:无输出。
# 再次查询 Locked,确认输出为 b true;最后调用 SetAccountLockState 并传入原值恢复
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount Locked
# 预期响应:b true
# 恢复 Locked 原值(将 <原Locked值> 替换为首次查询时记录的 true 或 false)
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
SetAccountLockState a{ss}yb 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <账号ID> <原Locked值>
响应示例:
成功:无
适用版本
1.70.19 及以上调试安全提示:上述方法可操作任意有权限的目标账号。验证接口时建议使用可删除的测试账号;对真实业务账号操作前应记录原值,并在验证后恢复配置。
2.2 用户对象(ManagerAccount)
用户对象位于 /bmc/kepler/AccountService/Accounts/:Id,提供对单个用户的操作(删用户、改密码、导入/删除 SSH 公钥、记录上次登录、校验密码)。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.Delete method a{ss} - -
.ChangePwd method a{ss}ay - -
.ChangeSnmpPwd method a{ss}ay - -
.ImportSSHPublicKey method a{ss}ss u -
.DeleteSSHPublicKey method a{ss} - -
.SetLastLogin method a{ss}ss y -
.VerifyPassword method a{ss}s - -功能说明
针对单个用户提供完整的管理能力:删除用户、修改用户密码/SNMP 加密密码(ChangePwd/ChangeSnmpPwd,密码以 ay 字节数组传入,不做回显)、导入/删除 SSH 公钥(ImportSSHPublicKey 支持 URI 远程上传与文本两种方式)、记录用户上次登录 IP 与接口(SetLastLogin,供第三方认证使用)、校验密码正确性(VerifyPassword)。对象还通过属性暴露该用户的状态(Enabled/Locked/RoleId/Privileges/LoginInterface 等)。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.ManagerAccount |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| Delete | - | - | 删除账户 | 无(对象路径中的 Id 即待删除用户 ID) |
| ChangePwd | ay | - | 修改账户密码 | ay: 待设置密码字节数组,1~512 字节(需满足密码复杂度/弱口令/历史密码策略) |
| ChangeSnmpPwd | ay | - | 修改本地用户 SNMP 加密密码 | ay: 待设置密码字节数组,1~512 字节 |
| ImportSSHPublicKey | ss | u | 导入 SSH 公钥 | s: 类型,URI 或 Texts: 内容, URI 为远程/本地路径;Text 为公钥文本出参: u: 任务 ID(远程上传时有效,否则为 0) |
| DeleteSSHPublicKey | - | - | 删除 SSH 公钥 | 无 |
| SetLastLogin | ss | y | 记录用户上次登录信息(第三方认证调用) | s: 上次登录 IP s: 上次登录接口 出参: y: 处理结果(0 成功) |
| VerifyPassword | s | - | 校验用户密码 | s: 需要校验的密码字符串,最长 512 字符 |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.PasswordComplexityCheckFail | 修改密码失败 | 新密码不满足复杂度要求 | 使用满足复杂度要求的密码 |
| kepler.account.InvalidPasswordSameWithHistory | 修改密码失败 | 新密码与历史密码相同 | 更换新密码 |
| kepler.account.PasswordNeedReset | 修改密码失败 | 用户首次登录需强制改密 | 先完成强制改密 |
| kepler.account.IncorrectPublicKeyFormat | 导入公钥失败 | 公钥格式不正确 | 使用正确的 SSH 公钥文件 |
| - | 操作成功 | NA | NA |
应用场景
- Web 端修改用户密码、删除用户、管理 SSH 公钥
- CDN/第三方认证登录后回写用户上次登录 IP 与接口
- Web 前端登录时校验密码(VerifyPassword)
限制条件
ChangePwd/ChangeSnmpPwd的密码为ay字节数组,总线上不出现明文- 修改密码会触发密码复杂度、弱口令字典、历史密码、用户名密码前缀比对等全量策略校验
- 删除用户时,若用户为
内置用户(如管理员、trapv3 用户、OEM 存储的底层用户等)会根据AccountPolicy.Deletable与删除保护规则失败 ImportSSHPublicKey的URI参数支持远程地址或本地绝对.pub文件路径;本地文件应置于/tmp目录。Text参数必须是完整的 OpenSSH 公钥文本(例如以ssh-rsa开头的单行公钥),不能使用截断示例或私钥内容
调试示例
命令行调试
# 参数说明:<账号ID> 为待操作的目标账号 ID;<当前密码> 与 <新密码> 替换为该账号的实际密码。
# 1. VerifyPassword:校验指定账号的当前密码。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
VerifyPassword a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <当前密码>
# 预期响应:无输出。
# 2. SetLastLogin:记录最后登录 IP 与接口。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
SetLastLogin a{ss}ss 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 127.0.0.1 Web
# 预期响应:y 0
# 3. ChangePwd:设置新密码 Xyz@2026AB;ay 长度为 10。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
ChangePwd a{ss}ay 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 10 88 121 122 64 50 48 50 54 65 66
# 预期响应:无输出。
# 3.1 VerifyPassword:用新密码回读确认 ChangePwd 生效。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
VerifyPassword a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 Xyz@2026AB
# 预期响应:无输出。
# 4. ChangeSnmpPwd:设置 SNMP 密码 Snmp@2026AB;ay 长度为 11。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
ChangeSnmpPwd a{ss}ay 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 11 83 110 109 112 64 50 48 50 54 65 66
# 预期响应:无输出。
# 5. ImportSSHPublicKey:将完整 OpenSSH 测试公钥预先传至远程 /tmp/account_it_pem_key.pub,再按 URI 导入。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
ImportSSHPublicKey a{ss}ss 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 URI /tmp/account_it_pem_key.pub
# 预期响应:u 0
# 5.1 读取摘要,确认导入结果非空。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
SshPublicKeyHash
# 预期响应:s "<非空公钥摘要>"
# 6. DeleteSSHPublicKey:删除刚导入的公钥。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
DeleteSSHPublicKey a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:无输出。
# 6.1 再读摘要,确认输出为空字符串。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
SshPublicKeyHash
# 预期响应:s ""
# 7. Delete:删除指定账号。验证时可在测试结束后删除测试账号。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
Delete a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:无输出。适用版本 1.70.19 及以上
调试安全提示:改密、导入/删除公钥和删除账号均会改变目标账号。验证时建议创建可删除的测试账号;生产操作应使用实际目标账号 ID,并遵循相应变更流程。
2.3 用户 SNMP 接口(ManagerAccount.SnmpUser)
该接口挂载在账号对象 /bmc/kepler/AccountService/Accounts/:Id 上,接口名为 bmc.kepler.AccountService.ManagerAccount.SnmpUser;它不是 /SnmpUser 子路径。该接口提供 SNMPv3 用户的鉴权/加密算法与密钥管理。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.SetAuthenticationProtocol method a{ss}yss - -
.SetEncryptionProtocol method a{ss}y - -
.GetSnmpKeys method a{ss} ss -功能说明
配置本地用户的 SNMPv3 鉴权算法与鉴权密码、加密算法与加密密码(SetAuthenticationProtocol 一次设置算法+两个密码,SetEncryptionProtocol 单独设置加密算法),并支持获取用户当前鉴权 key 与加密 key(GetSnmpKeys,返回 Ku)。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.ManagerAccount.SnmpUser |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| SetAuthenticationProtocol | yss | - | 设置 SNMP 鉴权算法、鉴权密码和加密密码 | y: 鉴权算法:0 None / 1 MD5 / 2 SHA96 / 3 SHA224 / 4 SHA256 / 5 SHA384 / 6 SHA512 s: 鉴权密码,1~512 字符 s: 加密密码,1~512 字符 |
| SetEncryptionProtocol | y | - | 设置 SNMP 加密算法 | y: 加密算法:0 None / 1 DES / 2 AES128 / 3 AES256 |
| GetSnmpKeys | - | ss | 获取鉴权 key 和加密 key(Ku) | 出参: s: 鉴权密码 Ku s: 加密密码 Ku |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.PasswordComplexityCheckFail | 设置鉴权/加密密码失败 | 密码不满足 SNMP 密码策略 | 使用满足策略的密码 |
| kepler.account.EncryptFail | 获取密钥失败 | 密钥加密解密异常 | 检查环境数据库/密钥是否损坏 |
| - | 操作成功 | NA | NA |
应用场景
- Web 端配置用户 SNMPv3 鉴权/加密算法与密码
- SNMP 下发前校验用户算法与密码是否与脚本一致(避免 "Authentication failure")
限制条件
- 密码长度 1~512 字符,受 SNMP 密码策略(
SnmpCommunityPasswordRulePolicy)约束 - 算法枚举为平台定义的 SNMP 算法值,需与
SNMPAuthenticationProtocols/SNMPEncryptionProtocols定义一致 - 用户未设置密码时 SNMP 下发会失败,需先设置鉴权密码
GetSnmpKeys会返回实际 Ku 密钥材料;仅应在受控调试环境使用,输出不得写入文档、工单或普通日志
调试示例
命令行调试
# 参数说明:<账号ID> 为待操作的目标账号 ID;SnmpUser 是接口名,路径始终为 /Accounts/<账号ID>。
# 1. SetAuthenticationProtocol:设置 SHA256(4)、鉴权密码 Auth@2026AB、加密密码 Encry@2026AB。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount.SnmpUser \
SetAuthenticationProtocol a{ss}yss 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 4 Auth@2026AB Encry@2026AB
# 预期响应:无输出。
# 1.1 回读鉴权算法。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount.SnmpUser \
AuthenticationProtocol
# 预期响应:y 4(SHA256)
# 2. SetEncryptionProtocol:设置 AES256(3)。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount.SnmpUser \
SetEncryptionProtocol a{ss}y 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 3
# 预期响应:无输出。
# 2.1 回读加密算法。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount.SnmpUser \
EncryptionProtocol
# 预期响应:y 3(AES256)
# 3. GetSnmpKeys:返回两个非空 Ku 字符串。实际返回值属于敏感信息,不得复制到文档或普通日志。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount.SnmpUser \
GetSnmpKeys a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:ss "<脱敏鉴权Ku>" "<脱敏加密Ku>"适用版本 1.70.19 及以上
调试安全提示:上述方法会修改指定账号的 SNMP 配置。验证时建议使用可删除的测试账号;生产操作应使用实际目标账号 ID,并遵循相应变更流程。
2.4 全局配置对象(AccountService)
全局配置对象位于 /bmc/kepler/AccountService,负责安全策略等全局属性的修改(属性直接通过 Set 修改),以及弱口令字典的导入导出、Web 公钥获取、用户恢复还原点操作。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.ImportWeakPasswordDictionary method a{ss}s u -
.ExportWeakPasswordDictionary method a{ss}s u -
.GetRequestedPublicKey method a{ss}y s -
.RecoverAccount method a{ss}yy - -功能说明
该对象承载所有全局安全策略属性(详见下表)与四个方法:导入/导出弱口令字典(Import/ExportWeakPasswordDictionary,支持本地路径与远程 URI 上传,返回任务 ID)、获取 Web 前端登录加密公钥(GetRequestedPublicKey)、根据用户 ID 恢复到还原点(RecoverAccount)。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
属性参数说明
| 属性名 | 类型 | 默认值 | 描述 | 取值范围 |
|---|---|---|---|---|
| AccountLockoutCounterResetAfter | S32 | 0 | 账号锁定失败计数重置时间配置 | 当前接口未声明数值范围 |
| AccountLockoutCounterResetEnabled | Boolean | false | 账号锁定失败计数重置使能 | true/false |
| AuthFailureLoggingThreshold | S32 | 0 | 认证失败日志阈值配置 | 当前接口未声明数值范围 |
| ServiceEnabled | Boolean | true | 账号服务使能状态 | true/false |
| MinPasswordLength | S32 | 8 | 密码最短长度 | 单位:字符 |
| MaxPasswordLength | S32 | 20 | 密码最长长度(只读) | 单位:字符 |
| PasswordComplexityEnable | Boolean | true | 密码复杂度检查开关 | true/false |
| InitialPasswordPromptEnable | Boolean | true | 首次登录修改密码提示 | true/false |
| InitialAccountPrivilegeRestrictEnabled | Boolean | false | 初始账户权限限制开关 | true/false |
| MinPasswordValidDays | U32 | 0 | 密码最短有效期 | 单位:天,与 MaxPasswordValidDays 差值不大于 10 |
| MaxPasswordValidDays | U32 | 0 | 密码最长有效期 | 单位:天,0 表示不限制 |
| EmergencyLoginAccountId | U8 | 0 | 逃生用户 | 0~17 |
| SNMPv3TrapAccountId | U8 | 2 | SNMPv3Trap 用户 | 用户 ID |
| InactiveDaysThreshold | U32 | 0 | 用户不活跃阈值 | 单位:天 |
| WeakPasswordDictionaryEnabled | Boolean | true | 弱口令字典使能开关 | true/false |
| HistoryPasswordCount | U8 | 5 | 检查历史密码数 | 0~MaxHistoryPasswordCount |
| MaxHistoryPasswordCount | U8 | 5 | 历史密码设置的最大范围 | 单位:条 |
| InitialPasswordNeedModify | Boolean | true | 初始密码需要强制修改 | true/false |
| HostUserManagementEnabled | Boolean | true | 业务侧用户管理使能 | true/false |
| OSAdministratorPrivilegeEnabled | Boolean | true | 业务侧管理员权限使能 | true/false |
| SNMPv3TrapAccountLimitPolicy | U8 | 2 | trap 用户修改策略 | 0 Modifiable / 1 NameModifiable / 2 NotModifiable |
| UserNamePasswordPrefixCompareEnabled | Boolean | false | 密码与用户名前 n 字节比较使能 | true/false |
| UserNamePasswordPrefixCompareLength | U8 | 4 | 密码与用户名前 n 字节比较长度 | 单位:字节 |
| SNMPv3TrapAccountChangePolicy | U8 | 0 | snmpv3trap 用户修改策略 | 0 保持原有 / 1 可重命名删除 |
| RequireChangePasswordAction | Boolean | false | 是否要求仅可通过 ChangePwd 修改密码 | true/false |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| ImportWeakPasswordDictionary | s | u | 导入弱口令字典 | s: 本地文件使用 /tmp/<文件名>;也可传入远程 URL文件大小不超过 1MB,行数不超过 1000 行,单行长度不超过密码最大长度 出参: u: 本地导入返回 0,远程导入返回任务 ID |
| ExportWeakPasswordDictionary | s | u | 导出弱口令字典 | s: 本地导出文件使用 /tmp/<文件名>,长度不超过 256 字符;也可传入远程 URL出参: u: 本地导出返回 0,远程导出返回任务 ID |
| GetRequestedPublicKey | y | s | 获取 Web 登录加密公钥 | y: 公钥用途,当前支持 web 前端加密公钥:1 出参: s: 公钥字符串 |
| RecoverAccount | yy | - | 根据用户传入 ID 恢复还原点用户信息 | y: 用户 ID,2~17 y: 恢复策略,0:强制恢复(当前支持的策略) |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.WeakPWDDictImportFailed | 导入弱口令字典失败 | 文件为空、大小/行数超限或内容不合法 | 检查字典文件格式与限制 |
| kepler.account.InvalidPath | 导入/导出失败 | 本地路径不在 /tmp 或路径格式不合法 | 使用 /tmp/<文件名> |
| kepler.account.OperationInProcess | 导入/导出失败 | 字典导入/导出操作进行中 | 等待上一次操作完成 |
| kepler.account.ValueOutOfRange | 属性设置失败 | 属性值超出取值范围 | 使用合法取值 |
| kepler.account.PasswordForbidSetComplexityCheck | 设置失败 | 密码复杂度检查被锁定 | 见 FAQ Q1 |
应用场景
- Web/CLI 修改全局安全策略(密码复杂度、有效期、历史密码数、逃生用户、trap 用户等)
- 制造定制化/恢复出厂时导入导出弱口令字典
- Web 前端登录获取加密公钥
- 用户数据备份还原点恢复
限制条件
- 弱口令字典本地导入/导出路径使用
/tmp/<文件名>,文件最大 1MB、最多 1000 行,行内不允许存在不可见 ASCII 字符 - 弱口令字典的导入/导出使用 IN_PROCESS 状态锁,同一时间只允许一个导入/导出操作
- 密码复杂度检查(PasswordComplexityIsLock)被 IPMI 置位后,非制造模式下不可关闭(
PasswordForbidSetComplexityCheck),详见 FAQ Q1 Set属性修改全局策略时,属性间存在联动约束(如MaxPasswordValidDays与MinPasswordValidDays差值不大于 10)RecoverAccount依赖设备中已存在的持久账号备份,且会覆盖目标账号数据;当前未在普通调试环境验证成功恢复场景,不能对业务账号直接执行
调试示例
命令行调试
# 1. ExportWeakPasswordDictionary:先导出当前字典作为备份。
# 后续导入临时字典后,必须用该备份恢复。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService bmc.kepler.AccountService \
ExportWeakPasswordDictionary a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 /tmp/account_weakpwd_backup
# 预期响应:u 0
# 预期失败响应(路径不在 /tmp):
# Call failed: {"format":"The value %s of the property %s does not contain the file name or does not exist in the tmp directory.","name":"InvalidPath","params":["******","Export Path"],"registry_prefix":"<注册表前缀>"}
# 前置:创建一份临时弱口令字典文件;该步骤不调用 AccountService 方法。
printf 'DocWeak2026\n' > /tmp/account_weakpwd_test
# 2. ImportWeakPasswordDictionary:导入临时字典。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService bmc.kepler.AccountService \
ImportWeakPasswordDictionary a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 /tmp/account_weakpwd_test
# 预期响应:u 0
# 预期失败响应(路径不在 /tmp):
# Call failed: {"format":"The value %s of the property %s does not contain the file name or does not exist in the tmp directory.","name":"InvalidPath","params":["******","Import Path"],"registry_prefix":"<注册表前缀>"}
# 清理:重新导入第 1 步备份,恢复测试前的弱口令字典。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService bmc.kepler.AccountService \
ImportWeakPasswordDictionary a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 /tmp/account_weakpwd_backup
# 预期响应:u 0
# 3. GetRequestedPublicKey:获取 Web 登录加密公钥,用途值为 1。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService bmc.kepler.AccountService \
GetRequestedPublicKey a{ss}y 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 1
# 预期响应:s "<公钥字符串>"
# 环境未配置该用途密钥时,允许响应:s ""
# 预期失败响应(用途值为 0):
# Call failed: {"format":"The value %s for the property %s is of a different type than the property can accept.","name":"PropertyValueTypeError","params":[0,"PublicKeyUsageType"],"registry_prefix":"<注册表前缀>"}
# 查询全局策略属性示例:用户名密码前缀比对使能状态。
busctl --user get-property bmc.kepler.account /bmc/kepler/AccountService bmc.kepler.AccountService \
UserNamePasswordPrefixCompareEnabled
# 预期响应:b true 或 b false(取决于设备当前配置)。适用版本 1.70.19 及以上
2.5 角色对象与角色集合(Role / Roles)
角色对象位于 /bmc/kepler/AccountService/Roles/:Id,角色集合位于 /bmc/kepler/AccountService/Roles,提供九大权限的管理与自定义角色的新增删除。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.New method a{ss}yasas - -
.SetRolePrivilege method a{ss}yb - -
.Delete method a{ss} - -功能说明
角色集合对象(bmc.kepler.AccountService.Roles)提供 New 新增自定义角色;角色对象(bmc.kepler.AccountService.Role)提供 SetRolePrivilege 设置角色九大权限、Delete 删除角色。角色对象的 Name/RolePrivilege 属性为只读,展示角色名称与权限列表。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.Roles / bmc.kepler.AccountService.Role |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| New(Roles) | yasas | - | 新增扩展自定义角色 | y: 角色 ID,仅支持 CustomRole5~16(9~20) as: 标准权限列表,仅接受 ReadOnly、UserMgmt、ConfigureSelf、BasicSetting as: OEM 权限列表,仅接受 PowerMgmt、SecurityMgmt、KVMMgmt、VMMMgmt、DiagnoseMgmt |
| SetRolePrivilege | yb | - | 设置角色权限 | y: 权限类型(PrivilegeType):0 UserMgmt / 1 BasicSetting / 2 KVMMgmt / 3 VMMMgmt / 4 SecurityMgmt / 5 PowerMgmt / 6 DiagnoseMgmt / 7 ReadOnly / 8 ConfigureSelf b: 是否开启该权限。UserMgmt、ReadOnly、ConfigureSelf 不允许修改 |
| Delete | - | - | 删除扩展自定义角色 | 无;仅支持删除 CustomRole5~16(9~20) |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| PropertyValueNotInList | 新增或删除角色失败 | RoleId 不在支持范围,或设置了无效权限类型 | 使用支持的 RoleId、PrivilegeType |
| ResourceAlreadyExists | 新增角色失败 | 指定的扩展自定义角色已存在 | 选择尚未创建的角色 ID |
| PropertyMissing | 新增角色失败 | 标准权限未同时包含 ReadOnly、ConfigureSelf | 在标准权限列表中同时传入二者 |
| InsufficientPrivilege | 修改角色权限失败 | 尝试修改 UserMgmt、ReadOnly 或 ConfigureSelf | 仅修改允许调整的权限类型 |
| ActionNotSupported | 新增或删除角色失败 | ExtendedCustomRoleEnabled 未开启 | 先开启扩展自定义角色功能 |
| - | 操作成功 | NA | NA |
应用场景
- 新建扩展自定义角色(CustomRole5~16)并配置其权限
- 为用户分配角色实现最小权限管理
- 角色权限调整(如临时关闭某用户组的部分权限)
限制条件
New与Delete仅支持 CustomRole5~16(ID 9~20);CustomRole1~4 与内置角色不能通过这两个方法新增或删除- 调试前需开启
ExtendedCustomRoleEnabled;结束后应恢复其原始值 - UserMgmt、ReadOnly、ConfigureSelf 是不可修改的权限类型
Name/RolePrivilege为只读属性,角色名称不可修改
调试示例
命令行调试
# 前置:记录并开启扩展自定义角色功能;完成调试后,将该属性恢复为记录的原始值。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Roles bmc.kepler.AccountService.Roles \
ExtendedCustomRoleEnabled
# 预期响应:b true 或 b false(记录该值)。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Roles bmc.kepler.AccountService.Roles \
ExtendedCustomRoleEnabled b true
# 预期响应:成功时无输出。
# 新增临时扩展自定义角色 CustomRole5(示例角色 ID 为 9)。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles bmc.kepler.AccountService.Roles \
New a{ss}yasas 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <角色ID> 2 ReadOnly ConfigureSelf 0
# 预期响应:成功时无输出。
# 构造失败:RoleId=5 不在 New 支持的 9~20 范围内。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles bmc.kepler.AccountService.Roles \
New a{ss}yasas 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 5 2 ReadOnly ConfigureSelf 0
# 预期失败响应:
# Call failed: {"format":"The value %s for the property %s is not in the list of acceptable values.","name":"PropertyValueNotInList","params":[5,"RoleId"],"registry_prefix":"<注册表前缀>"}
# 回读角色名称;若上一步使用角色 ID 9,预期为 CustomRole5。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Roles/<角色ID> bmc.kepler.AccountService.Role \
Name
# 预期响应:s "CustomRole<N>"
# 设置该角色的 BasicSetting 权限为开启(PrivilegeType=1)。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles/<角色ID> bmc.kepler.AccountService.Role \
SetRolePrivilege a{ss}yb 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 1 true
# 预期响应:成功时无输出。
# 构造失败:ReadOnly(PrivilegeType=7)为不可修改权限。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles/<角色ID> bmc.kepler.AccountService.Role \
SetRolePrivilege a{ss}yb 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 7 false
# 预期失败响应:
# Call failed: {"format":"There are insufficient privileges for the account or credentials associated with the current session to perform the requested operation.","name":"InsufficientPrivilege","registry_prefix":"<注册表前缀>"}
# 回读权限列表,确认其中包含 BasicSetting、ReadOnly、ConfigureSelf;字符串顺序不保证固定。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Roles/<角色ID> bmc.kepler.AccountService.Role \
RolePrivilege
# 预期响应:as <数量> ... "BasicSetting" ... "ReadOnly" ... "ConfigureSelf" ...
# 删除临时扩展自定义角色。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles/<角色ID> bmc.kepler.AccountService.Role \
Delete a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:成功时无输出。
# 构造失败:内置 Administrator 角色 ID=4 不在 Delete 支持的 9~20 范围内。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles/4 bmc.kepler.AccountService.Role \
Delete a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期失败响应:
# Call failed: {"format":"The value %s for the property %s is not in the list of acceptable values.","name":"PropertyValueNotInList","params":[4,"RoleId"],"registry_prefix":"<注册表前缀>"}
# 清理:将 ExtendedCustomRoleEnabled 恢复为前置步骤记录的 true 或 false。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Roles bmc.kepler.AccountService.Roles \
ExtendedCustomRoleEnabled b <记录的原始值>
# 预期响应:成功时无输出。适用版本 1.70.19 及以上
2.6 登录规则对象(Rule)
登录规则对象位于 /bmc/kepler/AccountService/Rules/:RuleId(规则 ID 1~3),提供 IP/MAC/时间三个维度的登录限制(仅属性,无方法)。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
Enabled property b - -
.IpRule property s - -
.MacRule property s - -
.TimeRule property s - -功能说明
每条登录规则包含使能状态 Enabled、源 IP 规则 IpRule、源 MAC 规则 MacRule、时间规则 TimeRule 四个可读写属性。用户可通过用户对象的 LoginRuleIds 属性绑定规则;规则生效时会参与登录准入校验。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.Rule |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
属性参数说明
| 属性名 | 类型 | 默认值 | 描述 | 取值范围 |
|---|---|---|---|---|
| Enabled | Boolean | false | 登录规则使能状态 | true/false |
| IpRule | String | 空字符串 | IP 登录规则 | IPv4/IPv6 地址,或带掩码的地址;IPv4 掩码范围 1~32,IPv6 掩码范围 1~128 |
| MacRule | String | 空字符串 | MAC 地址登录规则 | XX:XX:XX:XX:XX:XX 或三段前缀 XX:XX:XX,每段为两位十六进制数 |
| TimeRule | String | 空字符串 | 时间登录规则 | HH:MM/HH:MM、YYYY-MM-DD/YYYY-MM-DD 或 YYYY-MM-DD HH:MM/YYYY-MM-DD HH:MM |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| PropertyValueFormatError | 设置规则失败 | IP、MAC 或时间规则表达式非法 | 使用合法格式;错误参数会标识 IP、MAC 或 StartTime/EndTime |
| org.freedesktop.DBus.Error.UnknownProperty | 查询或设置失败 | 属性名称不存在或拼写错误 | 使用 Enabled、IpRule、MacRule、TimeRule 中的准确名称 |
| - | 操作成功 | NA | NA |
应用场景
- 限制某类用户仅在办公网段、特定时间段内允许登录
- 绑定规则到用户实现细粒度登录准入
限制条件
- Rule 是纯属性对象,没有业务方法;属性写入需要 SecurityMgmt 权限
- 固定提供规则 ID 1~3;调试时应记录并恢复被修改规则的原始值
- 启用带限制条件的规则可能影响后续登录;建议先保持 Enabled=false 完成格式验证
调试示例
命令行调试
# 以下以规则 3 为例。开始前先读取四个属性并记录原值;不要假定其他环境的规则为空或关闭。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
Enabled
# 预期响应:b true 或 b false
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
IpRule
# 预期响应:s "<当前IP规则>"
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
MacRule
# 预期响应:s "<当前MAC规则>"
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
TimeRule
# 预期响应:s "<当前时间规则>"
# 设置并回读 IP 规则;保持 Enabled=false,不会启用登录限制。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
IpRule s "192.0.2.0/24"
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
IpRule
# 预期响应:s "192.0.2.0/24"
# 构造失败:IPv4 掩码 33 超出支持范围。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
IpRule s "192.0.2.0/33"
# 预期失败响应:Call failed: {..."name":"PropertyValueFormatError","params":["192.0.2.0/33","IP"],"registry_prefix":"<注册表前缀>"...}
# 设置并回读 MAC 规则。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
MacRule s "02:00:00:00:00:01"
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
MacRule
# 预期响应:s "02:00:00:00:00:01"
# 设置并回读全天时间规则。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
TimeRule s "00:00/23:59"
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
TimeRule
# 预期响应:s "00:00/23:59"
# 清理:将三个规则属性替换为前置步骤记录的原始值;Enabled 在本示例中未修改。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
IpRule s "<记录的原始IpRule>"
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
MacRule s "<记录的原始MacRule>"
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
TimeRule s "<记录的原始TimeRule>"
# 预期响应:各命令成功时无输出。适用版本 1.70.19 及以上
2.7 SNMP 团体名对象(SnmpCommunity)
SNMP 团体名对象位于 /bmc/kepler/Managers/1/SnmpService/SnmpCommunity,提供 SNMP 团体名与团体登录规则的管理。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.SetRwCommunity method a{ss}s - -
.SetRoCommunity method a{ss}s - -
.GetSnmpCommunity method a{ss} ss -
.SetSnmpCommunityLoginRule method a{ss}as - -功能说明
设置/获取 SNMP 读写团体名(SetRwCommunity/SetRoCommunity/GetSnmpCommunity)。模型中还声明了 SetSnmpCommunityLoginRule,但当前服务未注册其回调,运行时调用会返回“method SetSnmpCommunityLoginRule not implemented”。团体名支持普通与长团体名(由 LongCommunityEnabled 控制)。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.SnmpService.SnmpCommunity |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| SetRwCommunity | s | - | 设置 rw SNMP 团体名 | s: rw 团体名字符串(空字符串表示删除) |
| SetRoCommunity | s | - | 设置 ro SNMP 团体名 | s: ro 团体名字符串(空字符串表示删除) |
| GetSnmpCommunity | - | ss | 获取 snmp 团体名 | 出参: s: rw 团体名 s: ro 团体名 |
| SetSnmpCommunityLoginRule | as | - | 设置 SNMP 团体名登录规则 | as: 登录规则 ID 字符串列表。当前版本仅在模型中声明,服务端未实现,调用会失败 |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.InvalidCommunityStringLength | 设置团体名失败 | 团体名长度超出范围 | 使用合法长度的团体名 |
| kepler.account.CommunityStringContainSpace | 设置团体名失败 | 团体名含空格 | 移除空格 |
| SameROCommunityName | 设置 ro 团体名失败 | ro 团体名与当前 rw 团体名相同 | 使用不同的 ro、rw 团体名 |
| SameRWCommunityName | 设置 rw 团体名失败 | rw 团体名与当前 ro 团体名相同 | 使用不同的 ro、rw 团体名 |
| BMC.Error.Unknow | 设置团体名登录规则失败 | 当前服务未注册 SetSnmpCommunityLoginRule 回调 | 当前版本不可使用该接口;需服务端补充实现后再调用 |
| - | 操作成功 | NA | NA |
应用场景
- 配置 SNMP 读写团体名(ro/rw)
- 在 SNMP 客户端与设备侧保持团体名一致
限制条件
- ro 与 rw 团体名不能相同;空字符串表示删除对应团体名
- 团体名不允许包含空格,长度受 SNMP 配置约束
- 调试前必须读取并记录原始团体名;团体名属于敏感凭据,日志和文档中应脱敏
SetSnmpCommunityLoginRule在当前服务中未实现,不能作为可用 API 示例
调试示例
命令行调试
# 先读取并记录当前 rw、ro 团体名;返回值包含敏感凭据,请勿写入日志或文档。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
GetSnmpCommunity a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:ss "<当前rw团体名>" "<当前ro团体名>"
# 设置临时 rw、ro 团体名;两者必须不同。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetRwCommunity a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <临时rw团体名>
# 预期响应:成功时无输出。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetRoCommunity a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <临时ro团体名>
# 预期响应:成功时无输出。
# 回读确认;返回顺序为 rw、ro。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
GetSnmpCommunity a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:ss "<临时rw团体名>" "<临时ro团体名>"
# 构造失败:将 ro 设置为与 rw 相同的团体名。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetRoCommunity a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <临时rw团体名>
# 预期失败响应:Call failed: {"format":"The property ReadOnlyCommunity is the same as another community name.","name":"SameROCommunityName","registry_prefix":"<注册表前缀>"}
# SetSnmpCommunityLoginRule 在模型中声明但当前服务未实现;以空数组调用不会修改配置。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetSnmpCommunityLoginRule a{ss}as 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 0
# 预期失败响应:Call failed: {"format":"... method SetSnmpCommunityLoginRule not implemented","name":"BMC.Error.Unknow"}
# 清理:将 rw、ro 团体名恢复为前置步骤记录的原始值。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetRwCommunity a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 "<记录的原始rw团体名>"
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetRoCommunity a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 "<记录的原始ro团体名>"
# 预期响应:各命令成功时无输出。适用版本 1.70.19 及以上
2.8 本地认证对象(LocalAccountAuthN)
本地认证对象位于 /bmc/kepler/AccountService/LocalAccountAuthN,供 session 等组件进行本地用户、VNC 用户与 RMCP(IPMI)认证。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.LocalAuthenticate method a{ss}saya{sb} a{ss} -
.VncAuthenticate method a{ss}ss a{ss} -
.GenRmcp20Code method a{ss}ysuuayayayys ayayay -
.GenRmcp15Code method a{ss}yayyuu ay -功能说明
提供本地用户认证(LocalAuthenticate,通过 Config 字典可切换到 TestPassword/IpmiLocalAuth/RecordOnly 模式)、VNC 认证(VncAuthenticate,密文+挑战码)、IPMI 2.0(GenRmcp20Code)与 IPMI 1.5(GenRmcp15Code)的认证码生成。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.LocalAccountAuthN |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| LocalAuthenticate | saya{sb} | a{ss} | 本地用户认证 | s: 用户名,1~32 字符 ay: 密码字节数组 a{sb}: 扩展配置字典(IsAuthPassword / TestPassword / IpmiLocalAuth / RecordOnly / RecordLoginInfo / UpdateActiveTime 等开关) 出参: a{ss}: 账户信息 |
| VncAuthenticate | ss | a{ss} | VNC 用户认证 | s: 密文 s: 挑战码 出参: a{ss}: 账户信息 |
| GenRmcp20Code | ysuuayayayys | ayayay | IPMI 2.0 认证码生成 | y: 加密算法 s: 用户名,1~32 字符 u: 控制台端会话 ID u: 服务端系统身份 ID ay: 控制随机数(16 字节) ay: BMC 随机数(16 字节) ay: 服务端设备身份 ID(16 字节) y: 角色权限 s: IP 地址 出参: ay: RAKP2 认证码 ay: SIK ay: RAKP3 认证码 |
| GenRmcp15Code | yayyuu | ay | IPMI 1.5 版本用户认证 | y: 加密算法 ay: 有效负载,1~255 字节 y: 用户 ID u: 会话 ID u: RMCP 会话的序列号 出参: ay: 认证码 |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| AuthorizationFailed | 认证失败 | 用户不存在、密码错误、账号被禁用、接口未开放或登录规则不通过 | 检查账号、密码和接口配置 |
| UserLocked | 认证失败 | 用户被手动锁定 | 解锁用户后重试 |
| NoAccess | 本地认证失败 | 角色为 NoAccess | 调整用户角色 |
| AuthorizationUserRestricted | VNC 认证失败 | 命中登录规则限制 | 检查 VNC 用户的登录规则 |
| - | 认证成功返回账户信息 | NA | NA |
应用场景
- session 组件创建本地用户会话时调用
LocalAuthenticate - VNC 认证(远程窗口)
- IPMI LAN 会话建立时的 RMCP2.0/RMCP1.5 认证码生成
限制条件
LocalAuthenticate的 Config 类型为a{sb},不是a{ss};可通过 RecordLoginInfo、UpdateActiveTime 关闭测试产生的登录记录- GenRmcp20Code、GenRmcp15Code 均要求目标账号开启 IPMI 登录接口;二者会记录该账号的 IPMI 登录信息
- VNC 认证失败会计入 VNC 账号的 PAM 失败次数,可能导致账号锁定;没有真实 VNC 密码和匹配挑战码时,不应构造失败请求
- 建议使用临时 Web+IPMI 账号验证前三个方法,完成后删除该账号
调试示例
命令行调试
# 前置:创建一个临时 Web+IPMI 账号。以下示例中用户名为 itauth20260825、账号 ID 为 <临时账号ID>。
# LocalAuthenticate:使用正确密码认证,关闭登录记录和活跃时间更新。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/LocalAccountAuthN bmc.kepler.AccountService.LocalAccountAuthN \
LocalAuthenticate a{ss}saya{sb} 4 Interface Web UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 itauth20260825 11 65 117 116 104 64 50 48 50 54 88 89 3 IsAuthPassword true RecordLoginInfo false UpdateActiveTime false
# 预期响应:a{ss} <数量>,其中包含 "Id" "<临时账号ID>" 与 "UserName" "itauth20260825"。
# 构造失败:以错误密码认证临时账号。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/LocalAccountAuthN bmc.kepler.AccountService.LocalAccountAuthN \
LocalAuthenticate a{ss}saya{sb} 4 Interface Web UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 itauth20260825 10 66 97 100 64 50 48 50 54 88 89 3 IsAuthPassword true RecordLoginInfo false UpdateActiveTime false
# 预期失败响应:Call failed: {"format":"Authorization failed because the user name or password is incorrect, or your account is locked.","name":"AuthorizationFailed","registry_prefix":"<注册表前缀>"}
# GenRmcp20Code:使用 HmacSha1(1) 和三个固定 16 字节输入生成 RAKP2、SIK、RAKP3。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/LocalAccountAuthN bmc.kepler.AccountService.LocalAccountAuthN \
GenRmcp20Code a{ss}ysuuayayayys 4 Interface IPMI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 1 itauth20260825 1 1 16 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 16 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 16 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 4 127.0.0.1
# 预期响应:ay 20 <RAKP2字节> ay 20 <SIK字节> ay 20 <RAKP3字节>。
# 构造失败:使用不存在的用户名生成 RMCP 2.0 认证码。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/LocalAccountAuthN bmc.kepler.AccountService.LocalAccountAuthN \
GenRmcp20Code a{ss}ysuuayayayys 4 Interface IPMI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 1 itauth_not_exist 1 1 16 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 16 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 16 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 4 127.0.0.1
# 预期失败响应:Call failed: {"format":"Authorization failed because the user name or password is incorrect, or your account is locked.","name":"AuthorizationFailed","registry_prefix":"<注册表前缀>"}
# GenRmcp15Code:使用 HmacMd5(2) 和临时账号 ID 生成认证码。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/LocalAccountAuthN bmc.kepler.AccountService.LocalAccountAuthN \
GenRmcp15Code a{ss}yayyuu 4 Interface IPMI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 2 4 1 2 3 4 <临时账号ID> 1 1
# 预期响应:ay 16 <认证码字节>。
# VncAuthenticate:不提供通用伪造调用。该方法必须使用真实 VNC 密码生成的密文和匹配挑战码;错误调用会累计 VNC 账号失败次数。
# 清理:删除临时账号,清除本轮 RMCP 登录记录与认证失败次数。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<临时账号ID> bmc.kepler.AccountService.ManagerAccount \
Delete a{ss} 4 Interface Web UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:成功时无输出。适用版本 1.70.19 及以上
2.9 密码策略对象与账户策略对象(PasswordPolicy / AccountPolicy)
密码策略对象位于 /bmc/kepler/AccountService/PasswordPolicys/:AccountType,账户策略对象位于 /bmc/kepler/AccountService/AccountPolicies/:AccountType,提供按账户类型(Local/OEM/SNMPCommunity/VNC 等)的密码与账户策略。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
Policy property u - -
.Pattern property s - -
.MaxPasswordLength property u - -
.AccountType property s - -功能说明
PasswordPolicy 按账户类型配置密码校验策略(Policy 位图:bit0 默认开关、bit1 指定开关)、密码正则 Pattern、最大密码长度 MaxPasswordLength;AccountPolicy 按账户类型配置用户名正则 NamePattern、允许的登录接口集合 AllowedLoginInterfaces、前端是否呈现 Visible、是否可删除 Deletable/OnlineDeletable。策略与 IPMI 0x30/0x93 的 Set/Get PasswordRulePolicy(0x77/0x76-07)与 Set/Get PasswordPattern(0x77/0x76-08)对应。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.PasswordPolicy / bmc.kepler.AccountService.AccountPolicy |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
属性参数说明
| 属性名 | 类型 | 默认值 | 描述 | 取值范围 |
|---|---|---|---|---|
| Policy(PasswordPolicy) | U8 | - | 密码校验策略 | 以 bit 位区分,bit0 默认开关,bit1 指定开关,取值不可为 0 |
| Pattern(PasswordPolicy) | String | - | 密码校验正则表达式 | 0~255 字符 |
| MaxPasswordLength(PasswordPolicy) | U32 | - | 本账户类型可支持的密码最大长度 | 1~512 |
| AccountType(PasswordPolicy) | String | - | 账户类型(只读) | Local / OEM / SNMPCommunity / VNC 等 |
| NamePattern(AccountPolicy) | String | "" | 用户名正则规则 | 0~255 字符,如 `^[a-zA-Z_][a-zA-Z0-9_]{0,15}# account |
版本信息
| 项目 | 内容 |
|---|---|
| 组件版本 | 1.120.42 |
| 首发版本 | 1.70.19 |
| 文档作者 | dowantgo |
| 最后更新 | 2026-08-25 |
1. 组件概述
1.1 组件简介
account 是 openUBMC 的用户与用户服务管理核心组件,负责 BMC 上所有用户及用户相关服务的管理。提供用户查询、创建、删除、用户密码策略配置、用户类型管理等功能。
在系统中,account 组件通过资源协作接口对外暴露用户、角色、登录规则、SNMP 团体名、密码策略等对象,提供本地认证、VNC 认证、RMCP 认证等RPC服务。
组件整体采用领域驱动设计(DDD)架构,分为四层:
- 接口层(interface):作为组件级的对外统一出口,处理北向映射器、IPMI 通道下发的属性/方法变化,统一记录操作日志。
- 服务层(service):完成多个领域对象与外部服务之间协调性、组合性的交互逻辑,作为各业务模块的出口。
- 领域层(domain):提供相关实体类定义,承载核心业务逻辑,包括管理与备份用户、管理登录规则、管理权限角色等。
- 基础设施层(infrastructure):提供供其他层调用的底层功能与公用处理方法的封装。
1.2 解决什么问题
account 组件为 BMC 的安全访问控制提供了统一的用户管理底座:
- 统一管理所有“用户”:IPMI 用户、本地用户、定制(OEM)用户,以及被视为用户管理的 SNMP 团体名、VNC 密码、SNMPv3 trap 用户、框内通信用户,权限与策略一致生效。
- 提供整套密码安全体系:密码复杂度检查、弱口令字典、历史密码检查、密码有效期/最短使用期、用户名密码前缀比对、首次登录强制改密。
- 提供登录访问控制:用户与权限关联、三条登录规则(IP/MAC/时间)、角色权限九大权限及自定义角色,登录接口管理
1.3 核心功能
- 核心功能一:用户生命周期管理 —— 新建、查询、修改、删除本地用户(ID 2~17)与 OEM 用户(内部 ID 101~115),含用户名、密码、登录接口、角色权限、首次登录策略、用户使能/禁用、手动锁定/解锁等属性管理。
- 核心功能二:密码策略与安全服务 —— 密码复杂度检查、弱口令字典导入导出与检查、历史密码检查、密码最大/最短有效期、用户名密码前缀比对、首次登录强制改密策略。
- 核心功能三:登录访问控制 —— 登录接口(Web/SNMP/IPMI/SSH/SFTP/Local/Redfish)管理、三条登录规则(IP 规则、MAC 规则、时间规则)、紧急登录用户(不受登录规则/接口/有效期限制)、角色权限九大权限管理及自定义角色。
- 核心功能四:特殊账户管理 —— VNC 密码、SNMP 团体名(ro/rw,支持长团体名)、SNMPv3 用户鉴权/加密算法与密码、SSH 公钥导入删除、SNMP trapv3 用户、框内通信账户管理。
1.4 关键术语表
| 术语 | 解释 |
|---|---|
| 本地用户 | 由 BMC 自身维护、存储在 BMC 数据库中的用户,ID 2~17,密码存储于 Linux shadow 文件 |
| OEM 用户 | 定制用户,内部 ID 101~115,满足定制场景使用 |
| 紧急登录用户 | 不受登录规则、登录接口、密码有效期限制的管理员用户,避免所有用户被限制后无法登陆 |
| 登录规则 | 从 IP / MAC / 时间三个维度限制用户可登录的规则) |
| 弱口令字典 | 预先导入的弱密码清单,密码命中字典(字典使能时)不允许被设置 |
1.5 外部交互边界图
2. API 使用说明与示例
调用约定与安全提示:文中
a{ss}为调用上下文字典,示例中的Interface、UserName、ClientAddr、Privilege应替换为实际调用环境 可用的上下文;<账号ID>、<用户名>等尖括号内容均为占位符。busctl输出开头的y、u、b、s、ss等是 D-Bus 类型标记,属于成功响应 的一部分。涉及账号删除、改密、锁定、策略、SNMP 团体名或公钥的示例会改变 设备状态,验证前应记录原值并在结束后恢复;密码、私钥和 SNMP Ku 等敏感值 不应写入文档、工单或普通日志。
2.1 用户集合对象(ManagerAccounts)
提供新建用户、按用户名查ID、设置用户可修改属性与锁定用户等能力。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.New method a{ss}ysayiaii y -
.NewOEMAccount method a{ss}yssa{ss} y -
.GetIdByUserName method a{ss}s y -
.GetUidGidByUserName method a{ss}s uu -
.SetAccountWritable method a{ss}ya{sb} - -
.GetAccountWritable method a{ss}y a{sb} -
.SetAccountLockState method a{ss}yb - -功能说明
通过该对象完成用户集合级的管理操作:新建本地用户(New)、新建 OEM 用户(NewOEMAccount)、按用户名查询用户 ID(GetIdByUserName)与 UID/GID(GetUidGidByUserName)、设置/查询用户属性的可修改性(Set/GetAccountWritable,用于制造定制化)、设置用户手动锁定状态(SetAccountLockState)。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.ManagerAccounts |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| New | ysayiaii | y | 新建用户 | 入参: y: 用户 ID,0(由系统从未占用的2~17中选择)或2~17 s: 用户名,1~32 字符;创建时还受当前账号类型的 NamePattern 策略及其他业务校验限制ay: 密码字节数组,接口最大长度为 512 字节;实际密码要求还受当前密码策略限制 i: 角色ID:0 或2~20,枚举值见下方表格 ai: 登录接口数组,登录接口枚举值见下方表格 i: 首次登录策略:1-提示修改密码;2-强制修改密码 出参: y: 新建用户 ID |
| NewOEMAccount | yssa{ss} | y | 新建 OEM 用户 | y: 用户ID,101~115 s: 用户名,1~32 字符;创建时还受当前账号类型的 NamePattern 策略及其他业务校验限制s: 密码,1~1024 字符;实际密码要求还受当前密码策略限制 a{ss}: 额外信息:operation(操作类型,取值:New-新建或Verify-校验)、role_id(角色ID,枚举值见下方表格)、interface(登录接口集合,枚举值见下方表格)、first_login_policy(首次登录策略:1-提示修改密码;2-强制修改密码)、is_pwd_encrypted(是否为密文密码,取值:2-是,其他-否) 出参: y: 新建用户 ID |
| GetIdByUserName | s | y | 通过用户名获取用户 ID | s: 用户名,1~32 字符(<root> 会被映射为 root)出参: y: 用户 ID,0~255 |
| GetUidGidByUserName | s | uu | 通过用户名查找用户 UID/GID | s: 用户名,1~32 字符 出参: u: UID(非负整数),u: GID(非负整数) |
| SetAccountWritable | ya{sb} | - | 设置用户某属性是否可修改 | y: 用户 ID,2~115 a{sb}: 属性可修改性字典( *Writable 属性名→是否可修改),例如 UserNameWritable→false |
| GetAccountWritable | y | a{sb} | 获取用户属性可修改性 | y: 用户 ID,2~115 出参: a{sb}: 属性可修改性字典,例如 UserNameWritable→true/false |
| SetAccountLockState | yb | - | 设置用户锁定状态 | y: 用户 ID,2~115 b: 锁定状态(true 锁定 / false 解锁) |
角色类型:
| 类型 | 枚举值 | 描述 |
|---|---|---|
| NoAccess | 0 | 无权限 |
| CommonUser | 2 | 普通用户 |
| Operator | 3 | 操作员 |
| Administrator | 4 | 管理员 |
| CustomRole1~4 | 5~8 | 自定义用户1~4 |
| CustomRole5~16 | 9~20 | 自定义用户5~16 (定制开启) |
登录接口类型:
| 类型 | 枚举值 | 描述 |
|---|---|---|
| Web | 1 | 使用浏览器登录BMC Web界面 |
| SNMP | 2 | 使用符合SNMP协议的终端工具登录BMC |
| IPMI | 4 | 使用符合IPMI协议的终端工具登录BMC |
| SSH | 8 | 使用符合SSH协议的终端工具登录BMC命令行 |
| SFTP | 16 | 使用符合SFTP协议的终端工具登录BMC文件系统 |
| Local | 64 | 通过服务器的串口登录BMC命令行 |
| Redfish | 128 | 使用符合Redfish协议的工具登录BMC |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.UserFull | 新建用户失败 | 用户数量已达上限 | 删除无用用户后再新建 |
| kepler.account.InvalidAccountId | 新建/操作失败 | 用户 ID 非法(如指定为 1) | 使用合法用户 ID |
| kepler.account.UserNameInvalid | 新建用户失败 | 用户名不符合命名规则 | 按 AccountPolicy.NamePattern 规则命名 |
| ResourceAlreadyExists | 新建用户失败 | 用户名已存在 | 更换用户名 |
| PropertyValueOutOfRange | 新建OEM用户失败 | 用户ID超出范围 | 使用范围内的OEM用户ID |
| y | 新建用户成功返回用户 ID | NA | NA |
应用场景
- Web/CLI/Redfish 接口新建本地用户、配置角色与登录接口
- 制造定制化批量下发 OEM 用户
- 按用户名查询用户 ID 以定位后续操作方法
- 用户找回、登录失败锁定后的解锁操作(SetAccountLockState)
限制条件
New中 AccountId 取值范围 0~17,0 表示由系统自动选择,1 为内置管理员不允许指定New密码为ay字节数组,不会在总线上明文透传;NewOEMAccount密码为字符串(1~1024 字符)SetAccountWritable/GetAccountWritable中属性可修改性为字符串键字典;键名使用*Writable形式,例如UserNameWritable。修改前应先读取并记录原值,验证后恢复原值- 通过 SNMP 接口调用
New时,组件内部走account_service_snmp分支,仅设置用户名
调试示例
命令行调试
# 新建本地用户(不指定用户 ID,角色=管理员(4),1个登录接口=Web(1),强制首次改密(2))
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
New a{ss}ysayiaii 3 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 \
0 <用户名> <密码长度> <字节数组形式的密码> 4 1 1 2
响应示例:
成功:y <系统自动分配的账号 ID>
失败:Call failed: {"registry_prefix":"<注册表前缀>","name":"ResourceAlreadyExists","format":"The requested resource already exists."}
适用版本
1.70.19 及以上
# 新建oem用户(指定用户 ID(102),角色=管理员(4),登录接口 9=Web(1)+SSH(8),强制首次改密(2))
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
NewOEMAccount a{ss}yssa{ss} 3 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 \
102 <用户名> <密码> 4 operation New role_id 4 interface 9 first_login_policy 2
响应示例:
成功:y 102
失败:Call failed: {"name":"PropertyValueOutOfRange","params":["162","AccountId"],"args_with_index":["%1:162","%1"],"registry_prefix":"<注册表前缀>","format":"The value '%s' for the property %s is not in the supported range of acceptable values."}
适用版本
1.70.19 及以上
# 按用户名查询用户 ID
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
GetIdByUserName a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 user01
响应示例:
成功:y <该用户名对应的账号 ID>
失败:Call failed: {“registry_prefix”:“<注册表前缀>”,“format”:“UserName not exist.”,“name”:“UserNameNotExist”}
适用版本
1.70.19 及以上
# 按用户名查询 UID/GID(用户名必须是当前环境中已存在的测试账号)
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
GetUidGidByUserName a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <测试用户名>
响应示例:
成功:uu <UID> <GID>
适用版本
1.70.19 及以上
# 查询指定账号的属性可修改性;先记录 UserNameWritable 的原值
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
GetAccountWritable a{ss}y 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <账号ID>
响应示例:
成功:`a{sb} <属性数量> "UserNameWritable" <true|false> ...`
适用版本
1.70.19 及以上
# 设置指定账号的用户名可修改性为 false;验证后必须恢复为上一步读取的原值
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
SetAccountWritable a{ss}ya{sb} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <账号ID> 1 UserNameWritable false
响应示例:
`SetAccountWritable` 成功:无输出。
随后再次调用 `GetAccountWritable`,预期:
`a{sb} <属性数量> "UserNameWritable" false ...`
# 恢复 UserNameWritable 原值(将 <原值> 替换为查询时记录的 true 或 false)
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
SetAccountWritable a{ss}ya{sb} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <账号ID> 1 UserNameWritable <原值>
# 预期响应:无输出。恢复后再次调用 GetAccountWritable,
# UserNameWritable 应回到 <原值>。
适用版本
1.70.19 及以上
# 锁定指定账号(先通过 get-property 记录 Locked 原值;验证后用原值恢复)
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount Locked
# 预期响应:b <原Locked值>
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
SetAccountLockState a{ss}yb 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <账号ID> true
# 预期响应:无输出。
# 再次查询 Locked,确认输出为 b true;最后调用 SetAccountLockState 并传入原值恢复
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount Locked
# 预期响应:b true
# 恢复 Locked 原值(将 <原Locked值> 替换为首次查询时记录的 true 或 false)
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts bmc.kepler.AccountService.ManagerAccounts \
SetAccountLockState a{ss}yb 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <账号ID> <原Locked值>
响应示例:
成功:无
适用版本
1.70.19 及以上调试安全提示:上述方法可操作任意有权限的目标账号。验证接口时建议使用可删除的测试账号;对真实业务账号操作前应记录原值,并在验证后恢复配置。
2.2 用户对象(ManagerAccount)
用户对象位于 /bmc/kepler/AccountService/Accounts/:Id,提供对单个用户的操作(删用户、改密码、导入/删除 SSH 公钥、记录上次登录、校验密码)。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.Delete method a{ss} - -
.ChangePwd method a{ss}ay - -
.ChangeSnmpPwd method a{ss}ay - -
.ImportSSHPublicKey method a{ss}ss u -
.DeleteSSHPublicKey method a{ss} - -
.SetLastLogin method a{ss}ss y -
.VerifyPassword method a{ss}s - -功能说明
针对单个用户提供完整的管理能力:删除用户、修改用户密码/SNMP 加密密码(ChangePwd/ChangeSnmpPwd,密码以 ay 字节数组传入,不做回显)、导入/删除 SSH 公钥(ImportSSHPublicKey 支持 URI 远程上传与文本两种方式)、记录用户上次登录 IP 与接口(SetLastLogin,供第三方认证使用)、校验密码正确性(VerifyPassword)。对象还通过属性暴露该用户的状态(Enabled/Locked/RoleId/Privileges/LoginInterface 等)。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.ManagerAccount |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| Delete | - | - | 删除账户 | 无(对象路径中的 Id 即待删除用户 ID) |
| ChangePwd | ay | - | 修改账户密码 | ay: 待设置密码字节数组,1~512 字节(需满足密码复杂度/弱口令/历史密码策略) |
| ChangeSnmpPwd | ay | - | 修改本地用户 SNMP 加密密码 | ay: 待设置密码字节数组,1~512 字节 |
| ImportSSHPublicKey | ss | u | 导入 SSH 公钥 | s: 类型,URI 或 Texts: 内容, URI 为远程/本地路径;Text 为公钥文本出参: u: 任务 ID(远程上传时有效,否则为 0) |
| DeleteSSHPublicKey | - | - | 删除 SSH 公钥 | 无 |
| SetLastLogin | ss | y | 记录用户上次登录信息(第三方认证调用) | s: 上次登录 IP s: 上次登录接口 出参: y: 处理结果(0 成功) |
| VerifyPassword | s | - | 校验用户密码 | s: 需要校验的密码字符串,最长 512 字符 |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.PasswordComplexityCheckFail | 修改密码失败 | 新密码不满足复杂度要求 | 使用满足复杂度要求的密码 |
| kepler.account.InvalidPasswordSameWithHistory | 修改密码失败 | 新密码与历史密码相同 | 更换新密码 |
| kepler.account.PasswordNeedReset | 修改密码失败 | 用户首次登录需强制改密 | 先完成强制改密 |
| kepler.account.IncorrectPublicKeyFormat | 导入公钥失败 | 公钥格式不正确 | 使用正确的 SSH 公钥文件 |
| - | 操作成功 | NA | NA |
应用场景
- Web 端修改用户密码、删除用户、管理 SSH 公钥
- CDN/第三方认证登录后回写用户上次登录 IP 与接口
- Web 前端登录时校验密码(VerifyPassword)
限制条件
ChangePwd/ChangeSnmpPwd的密码为ay字节数组,总线上不出现明文- 修改密码会触发密码复杂度、弱口令字典、历史密码、用户名密码前缀比对等全量策略校验
- 删除用户时,若用户为
内置用户(如管理员、trapv3 用户、OEM 存储的底层用户等)会根据AccountPolicy.Deletable与删除保护规则失败 ImportSSHPublicKey的URI参数支持远程地址或本地绝对.pub文件路径;本地文件应置于/tmp目录。Text参数必须是完整的 OpenSSH 公钥文本(例如以ssh-rsa开头的单行公钥),不能使用截断示例或私钥内容
调试示例
命令行调试
# 参数说明:<账号ID> 为待操作的目标账号 ID;<当前密码> 与 <新密码> 替换为该账号的实际密码。
# 1. VerifyPassword:校验指定账号的当前密码。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
VerifyPassword a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <当前密码>
# 预期响应:无输出。
# 2. SetLastLogin:记录最后登录 IP 与接口。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
SetLastLogin a{ss}ss 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 127.0.0.1 Web
# 预期响应:y 0
# 3. ChangePwd:设置新密码 Xyz@2026AB;ay 长度为 10。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
ChangePwd a{ss}ay 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 10 88 121 122 64 50 48 50 54 65 66
# 预期响应:无输出。
# 3.1 VerifyPassword:用新密码回读确认 ChangePwd 生效。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
VerifyPassword a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 Xyz@2026AB
# 预期响应:无输出。
# 4. ChangeSnmpPwd:设置 SNMP 密码 Snmp@2026AB;ay 长度为 11。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
ChangeSnmpPwd a{ss}ay 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 11 83 110 109 112 64 50 48 50 54 65 66
# 预期响应:无输出。
# 5. ImportSSHPublicKey:将完整 OpenSSH 测试公钥预先传至远程 /tmp/account_it_pem_key.pub,再按 URI 导入。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
ImportSSHPublicKey a{ss}ss 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 URI /tmp/account_it_pem_key.pub
# 预期响应:u 0
# 5.1 读取摘要,确认导入结果非空。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
SshPublicKeyHash
# 预期响应:s "<非空公钥摘要>"
# 6. DeleteSSHPublicKey:删除刚导入的公钥。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
DeleteSSHPublicKey a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:无输出。
# 6.1 再读摘要,确认输出为空字符串。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
SshPublicKeyHash
# 预期响应:s ""
# 7. Delete:删除指定账号。验证时可在测试结束后删除测试账号。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount \
Delete a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:无输出。适用版本 1.70.19 及以上
调试安全提示:改密、导入/删除公钥和删除账号均会改变目标账号。验证时建议创建可删除的测试账号;生产操作应使用实际目标账号 ID,并遵循相应变更流程。
2.3 用户 SNMP 接口(ManagerAccount.SnmpUser)
该接口挂载在账号对象 /bmc/kepler/AccountService/Accounts/:Id 上,接口名为 bmc.kepler.AccountService.ManagerAccount.SnmpUser;它不是 /SnmpUser 子路径。该接口提供 SNMPv3 用户的鉴权/加密算法与密钥管理。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.SetAuthenticationProtocol method a{ss}yss - -
.SetEncryptionProtocol method a{ss}y - -
.GetSnmpKeys method a{ss} ss -功能说明
配置本地用户的 SNMPv3 鉴权算法与鉴权密码、加密算法与加密密码(SetAuthenticationProtocol 一次设置算法+两个密码,SetEncryptionProtocol 单独设置加密算法),并支持获取用户当前鉴权 key 与加密 key(GetSnmpKeys,返回 Ku)。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.ManagerAccount.SnmpUser |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| SetAuthenticationProtocol | yss | - | 设置 SNMP 鉴权算法、鉴权密码和加密密码 | y: 鉴权算法:0 None / 1 MD5 / 2 SHA96 / 3 SHA224 / 4 SHA256 / 5 SHA384 / 6 SHA512 s: 鉴权密码,1~512 字符 s: 加密密码,1~512 字符 |
| SetEncryptionProtocol | y | - | 设置 SNMP 加密算法 | y: 加密算法:0 None / 1 DES / 2 AES128 / 3 AES256 |
| GetSnmpKeys | - | ss | 获取鉴权 key 和加密 key(Ku) | 出参: s: 鉴权密码 Ku s: 加密密码 Ku |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.PasswordComplexityCheckFail | 设置鉴权/加密密码失败 | 密码不满足 SNMP 密码策略 | 使用满足策略的密码 |
| kepler.account.EncryptFail | 获取密钥失败 | 密钥加密解密异常 | 检查环境数据库/密钥是否损坏 |
| - | 操作成功 | NA | NA |
应用场景
- Web 端配置用户 SNMPv3 鉴权/加密算法与密码
- SNMP 下发前校验用户算法与密码是否与脚本一致(避免 "Authentication failure")
限制条件
- 密码长度 1~512 字符,受 SNMP 密码策略(
SnmpCommunityPasswordRulePolicy)约束 - 算法枚举为平台定义的 SNMP 算法值,需与
SNMPAuthenticationProtocols/SNMPEncryptionProtocols定义一致 - 用户未设置密码时 SNMP 下发会失败,需先设置鉴权密码
GetSnmpKeys会返回实际 Ku 密钥材料;仅应在受控调试环境使用,输出不得写入文档、工单或普通日志
调试示例
命令行调试
# 参数说明:<账号ID> 为待操作的目标账号 ID;SnmpUser 是接口名,路径始终为 /Accounts/<账号ID>。
# 1. SetAuthenticationProtocol:设置 SHA256(4)、鉴权密码 Auth@2026AB、加密密码 Encry@2026AB。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount.SnmpUser \
SetAuthenticationProtocol a{ss}yss 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 4 Auth@2026AB Encry@2026AB
# 预期响应:无输出。
# 1.1 回读鉴权算法。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount.SnmpUser \
AuthenticationProtocol
# 预期响应:y 4(SHA256)
# 2. SetEncryptionProtocol:设置 AES256(3)。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount.SnmpUser \
SetEncryptionProtocol a{ss}y 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 3
# 预期响应:无输出。
# 2.1 回读加密算法。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount.SnmpUser \
EncryptionProtocol
# 预期响应:y 3(AES256)
# 3. GetSnmpKeys:返回两个非空 Ku 字符串。实际返回值属于敏感信息,不得复制到文档或普通日志。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<账号ID> bmc.kepler.AccountService.ManagerAccount.SnmpUser \
GetSnmpKeys a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:ss "<脱敏鉴权Ku>" "<脱敏加密Ku>"适用版本 1.70.19 及以上
调试安全提示:上述方法会修改指定账号的 SNMP 配置。验证时建议使用可删除的测试账号;生产操作应使用实际目标账号 ID,并遵循相应变更流程。
2.4 全局配置对象(AccountService)
全局配置对象位于 /bmc/kepler/AccountService,负责安全策略等全局属性的修改(属性直接通过 Set 修改),以及弱口令字典的导入导出、Web 公钥获取、用户恢复还原点操作。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.ImportWeakPasswordDictionary method a{ss}s u -
.ExportWeakPasswordDictionary method a{ss}s u -
.GetRequestedPublicKey method a{ss}y s -
.RecoverAccount method a{ss}yy - -功能说明
该对象承载所有全局安全策略属性(详见下表)与四个方法:导入/导出弱口令字典(Import/ExportWeakPasswordDictionary,支持本地路径与远程 URI 上传,返回任务 ID)、获取 Web 前端登录加密公钥(GetRequestedPublicKey)、根据用户 ID 恢复到还原点(RecoverAccount)。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
属性参数说明
| 属性名 | 类型 | 默认值 | 描述 | 取值范围 |
|---|---|---|---|---|
| AccountLockoutCounterResetAfter | S32 | 0 | 账号锁定失败计数重置时间配置 | 当前接口未声明数值范围 |
| AccountLockoutCounterResetEnabled | Boolean | false | 账号锁定失败计数重置使能 | true/false |
| AuthFailureLoggingThreshold | S32 | 0 | 认证失败日志阈值配置 | 当前接口未声明数值范围 |
| ServiceEnabled | Boolean | true | 账号服务使能状态 | true/false |
| MinPasswordLength | S32 | 8 | 密码最短长度 | 单位:字符 |
| MaxPasswordLength | S32 | 20 | 密码最长长度(只读) | 单位:字符 |
| PasswordComplexityEnable | Boolean | true | 密码复杂度检查开关 | true/false |
| InitialPasswordPromptEnable | Boolean | true | 首次登录修改密码提示 | true/false |
| InitialAccountPrivilegeRestrictEnabled | Boolean | false | 初始账户权限限制开关 | true/false |
| MinPasswordValidDays | U32 | 0 | 密码最短有效期 | 单位:天,与 MaxPasswordValidDays 差值不大于 10 |
| MaxPasswordValidDays | U32 | 0 | 密码最长有效期 | 单位:天,0 表示不限制 |
| EmergencyLoginAccountId | U8 | 0 | 逃生用户 | 0~17 |
| SNMPv3TrapAccountId | U8 | 2 | SNMPv3Trap 用户 | 用户 ID |
| InactiveDaysThreshold | U32 | 0 | 用户不活跃阈值 | 单位:天 |
| WeakPasswordDictionaryEnabled | Boolean | true | 弱口令字典使能开关 | true/false |
| HistoryPasswordCount | U8 | 5 | 检查历史密码数 | 0~MaxHistoryPasswordCount |
| MaxHistoryPasswordCount | U8 | 5 | 历史密码设置的最大范围 | 单位:条 |
| InitialPasswordNeedModify | Boolean | true | 初始密码需要强制修改 | true/false |
| HostUserManagementEnabled | Boolean | true | 业务侧用户管理使能 | true/false |
| OSAdministratorPrivilegeEnabled | Boolean | true | 业务侧管理员权限使能 | true/false |
| SNMPv3TrapAccountLimitPolicy | U8 | 2 | trap 用户修改策略 | 0 Modifiable / 1 NameModifiable / 2 NotModifiable |
| UserNamePasswordPrefixCompareEnabled | Boolean | false | 密码与用户名前 n 字节比较使能 | true/false |
| UserNamePasswordPrefixCompareLength | U8 | 4 | 密码与用户名前 n 字节比较长度 | 单位:字节 |
| SNMPv3TrapAccountChangePolicy | U8 | 0 | snmpv3trap 用户修改策略 | 0 保持原有 / 1 可重命名删除 |
| RequireChangePasswordAction | Boolean | false | 是否要求仅可通过 ChangePwd 修改密码 | true/false |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| ImportWeakPasswordDictionary | s | u | 导入弱口令字典 | s: 本地文件使用 /tmp/<文件名>;也可传入远程 URL文件大小不超过 1MB,行数不超过 1000 行,单行长度不超过密码最大长度 出参: u: 本地导入返回 0,远程导入返回任务 ID |
| ExportWeakPasswordDictionary | s | u | 导出弱口令字典 | s: 本地导出文件使用 /tmp/<文件名>,长度不超过 256 字符;也可传入远程 URL出参: u: 本地导出返回 0,远程导出返回任务 ID |
| GetRequestedPublicKey | y | s | 获取 Web 登录加密公钥 | y: 公钥用途,当前支持 web 前端加密公钥:1 出参: s: 公钥字符串 |
| RecoverAccount | yy | - | 根据用户传入 ID 恢复还原点用户信息 | y: 用户 ID,2~17 y: 恢复策略,0:强制恢复(当前支持的策略) |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.WeakPWDDictImportFailed | 导入弱口令字典失败 | 文件为空、大小/行数超限或内容不合法 | 检查字典文件格式与限制 |
| kepler.account.InvalidPath | 导入/导出失败 | 本地路径不在 /tmp 或路径格式不合法 | 使用 /tmp/<文件名> |
| kepler.account.OperationInProcess | 导入/导出失败 | 字典导入/导出操作进行中 | 等待上一次操作完成 |
| kepler.account.ValueOutOfRange | 属性设置失败 | 属性值超出取值范围 | 使用合法取值 |
| kepler.account.PasswordForbidSetComplexityCheck | 设置失败 | 密码复杂度检查被锁定 | 见 FAQ Q1 |
应用场景
- Web/CLI 修改全局安全策略(密码复杂度、有效期、历史密码数、逃生用户、trap 用户等)
- 制造定制化/恢复出厂时导入导出弱口令字典
- Web 前端登录获取加密公钥
- 用户数据备份还原点恢复
限制条件
- 弱口令字典本地导入/导出路径使用
/tmp/<文件名>,文件最大 1MB、最多 1000 行,行内不允许存在不可见 ASCII 字符 - 弱口令字典的导入/导出使用 IN_PROCESS 状态锁,同一时间只允许一个导入/导出操作
- 密码复杂度检查(PasswordComplexityIsLock)被 IPMI 置位后,非制造模式下不可关闭(
PasswordForbidSetComplexityCheck),详见 FAQ Q1 Set属性修改全局策略时,属性间存在联动约束(如MaxPasswordValidDays与MinPasswordValidDays差值不大于 10)RecoverAccount依赖设备中已存在的持久账号备份,且会覆盖目标账号数据;当前未在普通调试环境验证成功恢复场景,不能对业务账号直接执行
调试示例
命令行调试
# 1. ExportWeakPasswordDictionary:先导出当前字典作为备份。
# 后续导入临时字典后,必须用该备份恢复。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService bmc.kepler.AccountService \
ExportWeakPasswordDictionary a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 /tmp/account_weakpwd_backup
# 预期响应:u 0
# 预期失败响应(路径不在 /tmp):
# Call failed: {"format":"The value %s of the property %s does not contain the file name or does not exist in the tmp directory.","name":"InvalidPath","params":["******","Export Path"],"registry_prefix":"<注册表前缀>"}
# 前置:创建一份临时弱口令字典文件;该步骤不调用 AccountService 方法。
printf 'DocWeak2026\n' > /tmp/account_weakpwd_test
# 2. ImportWeakPasswordDictionary:导入临时字典。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService bmc.kepler.AccountService \
ImportWeakPasswordDictionary a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 /tmp/account_weakpwd_test
# 预期响应:u 0
# 预期失败响应(路径不在 /tmp):
# Call failed: {"format":"The value %s of the property %s does not contain the file name or does not exist in the tmp directory.","name":"InvalidPath","params":["******","Import Path"],"registry_prefix":"<注册表前缀>"}
# 清理:重新导入第 1 步备份,恢复测试前的弱口令字典。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService bmc.kepler.AccountService \
ImportWeakPasswordDictionary a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 /tmp/account_weakpwd_backup
# 预期响应:u 0
# 3. GetRequestedPublicKey:获取 Web 登录加密公钥,用途值为 1。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService bmc.kepler.AccountService \
GetRequestedPublicKey a{ss}y 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 1
# 预期响应:s "<公钥字符串>"
# 环境未配置该用途密钥时,允许响应:s ""
# 预期失败响应(用途值为 0):
# Call failed: {"format":"The value %s for the property %s is of a different type than the property can accept.","name":"PropertyValueTypeError","params":[0,"PublicKeyUsageType"],"registry_prefix":"<注册表前缀>"}
# 查询全局策略属性示例:用户名密码前缀比对使能状态。
busctl --user get-property bmc.kepler.account /bmc/kepler/AccountService bmc.kepler.AccountService \
UserNamePasswordPrefixCompareEnabled
# 预期响应:b true 或 b false(取决于设备当前配置)。适用版本 1.70.19 及以上
2.5 角色对象与角色集合(Role / Roles)
角色对象位于 /bmc/kepler/AccountService/Roles/:Id,角色集合位于 /bmc/kepler/AccountService/Roles,提供九大权限的管理与自定义角色的新增删除。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.New method a{ss}yasas - -
.SetRolePrivilege method a{ss}yb - -
.Delete method a{ss} - -功能说明
角色集合对象(bmc.kepler.AccountService.Roles)提供 New 新增自定义角色;角色对象(bmc.kepler.AccountService.Role)提供 SetRolePrivilege 设置角色九大权限、Delete 删除角色。角色对象的 Name/RolePrivilege 属性为只读,展示角色名称与权限列表。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.Roles / bmc.kepler.AccountService.Role |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| New(Roles) | yasas | - | 新增扩展自定义角色 | y: 角色 ID,仅支持 CustomRole5~16(9~20) as: 标准权限列表,仅接受 ReadOnly、UserMgmt、ConfigureSelf、BasicSetting as: OEM 权限列表,仅接受 PowerMgmt、SecurityMgmt、KVMMgmt、VMMMgmt、DiagnoseMgmt |
| SetRolePrivilege | yb | - | 设置角色权限 | y: 权限类型(PrivilegeType):0 UserMgmt / 1 BasicSetting / 2 KVMMgmt / 3 VMMMgmt / 4 SecurityMgmt / 5 PowerMgmt / 6 DiagnoseMgmt / 7 ReadOnly / 8 ConfigureSelf b: 是否开启该权限。UserMgmt、ReadOnly、ConfigureSelf 不允许修改 |
| Delete | - | - | 删除扩展自定义角色 | 无;仅支持删除 CustomRole5~16(9~20) |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| PropertyValueNotInList | 新增或删除角色失败 | RoleId 不在支持范围,或设置了无效权限类型 | 使用支持的 RoleId、PrivilegeType |
| ResourceAlreadyExists | 新增角色失败 | 指定的扩展自定义角色已存在 | 选择尚未创建的角色 ID |
| PropertyMissing | 新增角色失败 | 标准权限未同时包含 ReadOnly、ConfigureSelf | 在标准权限列表中同时传入二者 |
| InsufficientPrivilege | 修改角色权限失败 | 尝试修改 UserMgmt、ReadOnly 或 ConfigureSelf | 仅修改允许调整的权限类型 |
| ActionNotSupported | 新增或删除角色失败 | ExtendedCustomRoleEnabled 未开启 | 先开启扩展自定义角色功能 |
| - | 操作成功 | NA | NA |
应用场景
- 新建扩展自定义角色(CustomRole5~16)并配置其权限
- 为用户分配角色实现最小权限管理
- 角色权限调整(如临时关闭某用户组的部分权限)
限制条件
New与Delete仅支持 CustomRole5~16(ID 9~20);CustomRole1~4 与内置角色不能通过这两个方法新增或删除- 调试前需开启
ExtendedCustomRoleEnabled;结束后应恢复其原始值 - UserMgmt、ReadOnly、ConfigureSelf 是不可修改的权限类型
Name/RolePrivilege为只读属性,角色名称不可修改
调试示例
命令行调试
# 前置:记录并开启扩展自定义角色功能;完成调试后,将该属性恢复为记录的原始值。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Roles bmc.kepler.AccountService.Roles \
ExtendedCustomRoleEnabled
# 预期响应:b true 或 b false(记录该值)。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Roles bmc.kepler.AccountService.Roles \
ExtendedCustomRoleEnabled b true
# 预期响应:成功时无输出。
# 新增临时扩展自定义角色 CustomRole5(示例角色 ID 为 9)。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles bmc.kepler.AccountService.Roles \
New a{ss}yasas 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <角色ID> 2 ReadOnly ConfigureSelf 0
# 预期响应:成功时无输出。
# 构造失败:RoleId=5 不在 New 支持的 9~20 范围内。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles bmc.kepler.AccountService.Roles \
New a{ss}yasas 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 5 2 ReadOnly ConfigureSelf 0
# 预期失败响应:
# Call failed: {"format":"The value %s for the property %s is not in the list of acceptable values.","name":"PropertyValueNotInList","params":[5,"RoleId"],"registry_prefix":"<注册表前缀>"}
# 回读角色名称;若上一步使用角色 ID 9,预期为 CustomRole5。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Roles/<角色ID> bmc.kepler.AccountService.Role \
Name
# 预期响应:s "CustomRole<N>"
# 设置该角色的 BasicSetting 权限为开启(PrivilegeType=1)。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles/<角色ID> bmc.kepler.AccountService.Role \
SetRolePrivilege a{ss}yb 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 1 true
# 预期响应:成功时无输出。
# 构造失败:ReadOnly(PrivilegeType=7)为不可修改权限。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles/<角色ID> bmc.kepler.AccountService.Role \
SetRolePrivilege a{ss}yb 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 7 false
# 预期失败响应:
# Call failed: {"format":"There are insufficient privileges for the account or credentials associated with the current session to perform the requested operation.","name":"InsufficientPrivilege","registry_prefix":"<注册表前缀>"}
# 回读权限列表,确认其中包含 BasicSetting、ReadOnly、ConfigureSelf;字符串顺序不保证固定。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Roles/<角色ID> bmc.kepler.AccountService.Role \
RolePrivilege
# 预期响应:as <数量> ... "BasicSetting" ... "ReadOnly" ... "ConfigureSelf" ...
# 删除临时扩展自定义角色。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles/<角色ID> bmc.kepler.AccountService.Role \
Delete a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:成功时无输出。
# 构造失败:内置 Administrator 角色 ID=4 不在 Delete 支持的 9~20 范围内。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Roles/4 bmc.kepler.AccountService.Role \
Delete a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期失败响应:
# Call failed: {"format":"The value %s for the property %s is not in the list of acceptable values.","name":"PropertyValueNotInList","params":[4,"RoleId"],"registry_prefix":"<注册表前缀>"}
# 清理:将 ExtendedCustomRoleEnabled 恢复为前置步骤记录的 true 或 false。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Roles bmc.kepler.AccountService.Roles \
ExtendedCustomRoleEnabled b <记录的原始值>
# 预期响应:成功时无输出。适用版本 1.70.19 及以上
2.6 登录规则对象(Rule)
登录规则对象位于 /bmc/kepler/AccountService/Rules/:RuleId(规则 ID 1~3),提供 IP/MAC/时间三个维度的登录限制(仅属性,无方法)。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
Enabled property b - -
.IpRule property s - -
.MacRule property s - -
.TimeRule property s - -功能说明
每条登录规则包含使能状态 Enabled、源 IP 规则 IpRule、源 MAC 规则 MacRule、时间规则 TimeRule 四个可读写属性。用户可通过用户对象的 LoginRuleIds 属性绑定规则;规则生效时会参与登录准入校验。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.Rule |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
属性参数说明
| 属性名 | 类型 | 默认值 | 描述 | 取值范围 |
|---|---|---|---|---|
| Enabled | Boolean | false | 登录规则使能状态 | true/false |
| IpRule | String | 空字符串 | IP 登录规则 | IPv4/IPv6 地址,或带掩码的地址;IPv4 掩码范围 1~32,IPv6 掩码范围 1~128 |
| MacRule | String | 空字符串 | MAC 地址登录规则 | XX:XX:XX:XX:XX:XX 或三段前缀 XX:XX:XX,每段为两位十六进制数 |
| TimeRule | String | 空字符串 | 时间登录规则 | HH:MM/HH:MM、YYYY-MM-DD/YYYY-MM-DD 或 YYYY-MM-DD HH:MM/YYYY-MM-DD HH:MM |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| PropertyValueFormatError | 设置规则失败 | IP、MAC 或时间规则表达式非法 | 使用合法格式;错误参数会标识 IP、MAC 或 StartTime/EndTime |
| org.freedesktop.DBus.Error.UnknownProperty | 查询或设置失败 | 属性名称不存在或拼写错误 | 使用 Enabled、IpRule、MacRule、TimeRule 中的准确名称 |
| - | 操作成功 | NA | NA |
应用场景
- 限制某类用户仅在办公网段、特定时间段内允许登录
- 绑定规则到用户实现细粒度登录准入
限制条件
- Rule 是纯属性对象,没有业务方法;属性写入需要 SecurityMgmt 权限
- 固定提供规则 ID 1~3;调试时应记录并恢复被修改规则的原始值
- 启用带限制条件的规则可能影响后续登录;建议先保持 Enabled=false 完成格式验证
调试示例
命令行调试
# 以下以规则 3 为例。开始前先读取四个属性并记录原值;不要假定其他环境的规则为空或关闭。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
Enabled
# 预期响应:b true 或 b false
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
IpRule
# 预期响应:s "<当前IP规则>"
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
MacRule
# 预期响应:s "<当前MAC规则>"
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
TimeRule
# 预期响应:s "<当前时间规则>"
# 设置并回读 IP 规则;保持 Enabled=false,不会启用登录限制。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
IpRule s "192.0.2.0/24"
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
IpRule
# 预期响应:s "192.0.2.0/24"
# 构造失败:IPv4 掩码 33 超出支持范围。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
IpRule s "192.0.2.0/33"
# 预期失败响应:Call failed: {..."name":"PropertyValueFormatError","params":["192.0.2.0/33","IP"],"registry_prefix":"<注册表前缀>"...}
# 设置并回读 MAC 规则。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
MacRule s "02:00:00:00:00:01"
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
MacRule
# 预期响应:s "02:00:00:00:00:01"
# 设置并回读全天时间规则。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
TimeRule s "00:00/23:59"
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
TimeRule
# 预期响应:s "00:00/23:59"
# 清理:将三个规则属性替换为前置步骤记录的原始值;Enabled 在本示例中未修改。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
IpRule s "<记录的原始IpRule>"
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
MacRule s "<记录的原始MacRule>"
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/Rules/3 bmc.kepler.AccountService.Rule \
TimeRule s "<记录的原始TimeRule>"
# 预期响应:各命令成功时无输出。适用版本 1.70.19 及以上
2.7 SNMP 团体名对象(SnmpCommunity)
SNMP 团体名对象位于 /bmc/kepler/Managers/1/SnmpService/SnmpCommunity,提供 SNMP 团体名与团体登录规则的管理。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.SetRwCommunity method a{ss}s - -
.SetRoCommunity method a{ss}s - -
.GetSnmpCommunity method a{ss} ss -
.SetSnmpCommunityLoginRule method a{ss}as - -功能说明
设置/获取 SNMP 读写团体名(SetRwCommunity/SetRoCommunity/GetSnmpCommunity)。模型中还声明了 SetSnmpCommunityLoginRule,但当前服务未注册其回调,运行时调用会返回“method SetSnmpCommunityLoginRule not implemented”。团体名支持普通与长团体名(由 LongCommunityEnabled 控制)。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.SnmpService.SnmpCommunity |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| SetRwCommunity | s | - | 设置 rw SNMP 团体名 | s: rw 团体名字符串(空字符串表示删除) |
| SetRoCommunity | s | - | 设置 ro SNMP 团体名 | s: ro 团体名字符串(空字符串表示删除) |
| GetSnmpCommunity | - | ss | 获取 snmp 团体名 | 出参: s: rw 团体名 s: ro 团体名 |
| SetSnmpCommunityLoginRule | as | - | 设置 SNMP 团体名登录规则 | as: 登录规则 ID 字符串列表。当前版本仅在模型中声明,服务端未实现,调用会失败 |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.InvalidCommunityStringLength | 设置团体名失败 | 团体名长度超出范围 | 使用合法长度的团体名 |
| kepler.account.CommunityStringContainSpace | 设置团体名失败 | 团体名含空格 | 移除空格 |
| SameROCommunityName | 设置 ro 团体名失败 | ro 团体名与当前 rw 团体名相同 | 使用不同的 ro、rw 团体名 |
| SameRWCommunityName | 设置 rw 团体名失败 | rw 团体名与当前 ro 团体名相同 | 使用不同的 ro、rw 团体名 |
| BMC.Error.Unknow | 设置团体名登录规则失败 | 当前服务未注册 SetSnmpCommunityLoginRule 回调 | 当前版本不可使用该接口;需服务端补充实现后再调用 |
| - | 操作成功 | NA | NA |
应用场景
- 配置 SNMP 读写团体名(ro/rw)
- 在 SNMP 客户端与设备侧保持团体名一致
限制条件
- ro 与 rw 团体名不能相同;空字符串表示删除对应团体名
- 团体名不允许包含空格,长度受 SNMP 配置约束
- 调试前必须读取并记录原始团体名;团体名属于敏感凭据,日志和文档中应脱敏
SetSnmpCommunityLoginRule在当前服务中未实现,不能作为可用 API 示例
调试示例
命令行调试
# 先读取并记录当前 rw、ro 团体名;返回值包含敏感凭据,请勿写入日志或文档。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
GetSnmpCommunity a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:ss "<当前rw团体名>" "<当前ro团体名>"
# 设置临时 rw、ro 团体名;两者必须不同。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetRwCommunity a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <临时rw团体名>
# 预期响应:成功时无输出。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetRoCommunity a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <临时ro团体名>
# 预期响应:成功时无输出。
# 回读确认;返回顺序为 rw、ro。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
GetSnmpCommunity a{ss} 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:ss "<临时rw团体名>" "<临时ro团体名>"
# 构造失败:将 ro 设置为与 rw 相同的团体名。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetRoCommunity a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 <临时rw团体名>
# 预期失败响应:Call failed: {"format":"The property ReadOnlyCommunity is the same as another community name.","name":"SameROCommunityName","registry_prefix":"<注册表前缀>"}
# SetSnmpCommunityLoginRule 在模型中声明但当前服务未实现;以空数组调用不会修改配置。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetSnmpCommunityLoginRule a{ss}as 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 0
# 预期失败响应:Call failed: {"format":"... method SetSnmpCommunityLoginRule not implemented","name":"BMC.Error.Unknow"}
# 清理:将 rw、ro 团体名恢复为前置步骤记录的原始值。
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetRwCommunity a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 "<记录的原始rw团体名>"
busctl --user call bmc.kepler.account \
/bmc/kepler/Managers/1/SnmpService/SnmpCommunity bmc.kepler.Managers.SnmpService.SnmpCommunity \
SetRoCommunity a{ss}s 4 Interface CLI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 "<记录的原始ro团体名>"
# 预期响应:各命令成功时无输出。适用版本 1.70.19 及以上
2.8 本地认证对象(LocalAccountAuthN)
本地认证对象位于 /bmc/kepler/AccountService/LocalAccountAuthN,供 session 等组件进行本地用户、VNC 用户与 RMCP(IPMI)认证。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.LocalAuthenticate method a{ss}saya{sb} a{ss} -
.VncAuthenticate method a{ss}ss a{ss} -
.GenRmcp20Code method a{ss}ysuuayayayys ayayay -
.GenRmcp15Code method a{ss}yayyuu ay -功能说明
提供本地用户认证(LocalAuthenticate,通过 Config 字典可切换到 TestPassword/IpmiLocalAuth/RecordOnly 模式)、VNC 认证(VncAuthenticate,密文+挑战码)、IPMI 2.0(GenRmcp20Code)与 IPMI 1.5(GenRmcp15Code)的认证码生成。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.LocalAccountAuthN |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| LocalAuthenticate | saya{sb} | a{ss} | 本地用户认证 | s: 用户名,1~32 字符 ay: 密码字节数组 a{sb}: 扩展配置字典(IsAuthPassword / TestPassword / IpmiLocalAuth / RecordOnly / RecordLoginInfo / UpdateActiveTime 等开关) 出参: a{ss}: 账户信息 |
| VncAuthenticate | ss | a{ss} | VNC 用户认证 | s: 密文 s: 挑战码 出参: a{ss}: 账户信息 |
| GenRmcp20Code | ysuuayayayys | ayayay | IPMI 2.0 认证码生成 | y: 加密算法 s: 用户名,1~32 字符 u: 控制台端会话 ID u: 服务端系统身份 ID ay: 控制随机数(16 字节) ay: BMC 随机数(16 字节) ay: 服务端设备身份 ID(16 字节) y: 角色权限 s: IP 地址 出参: ay: RAKP2 认证码 ay: SIK ay: RAKP3 认证码 |
| GenRmcp15Code | yayyuu | ay | IPMI 1.5 版本用户认证 | y: 加密算法 ay: 有效负载,1~255 字节 y: 用户 ID u: 会话 ID u: RMCP 会话的序列号 出参: ay: 认证码 |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| AuthorizationFailed | 认证失败 | 用户不存在、密码错误、账号被禁用、接口未开放或登录规则不通过 | 检查账号、密码和接口配置 |
| UserLocked | 认证失败 | 用户被手动锁定 | 解锁用户后重试 |
| NoAccess | 本地认证失败 | 角色为 NoAccess | 调整用户角色 |
| AuthorizationUserRestricted | VNC 认证失败 | 命中登录规则限制 | 检查 VNC 用户的登录规则 |
| - | 认证成功返回账户信息 | NA | NA |
应用场景
- session 组件创建本地用户会话时调用
LocalAuthenticate - VNC 认证(远程窗口)
- IPMI LAN 会话建立时的 RMCP2.0/RMCP1.5 认证码生成
限制条件
LocalAuthenticate的 Config 类型为a{sb},不是a{ss};可通过 RecordLoginInfo、UpdateActiveTime 关闭测试产生的登录记录- GenRmcp20Code、GenRmcp15Code 均要求目标账号开启 IPMI 登录接口;二者会记录该账号的 IPMI 登录信息
- VNC 认证失败会计入 VNC 账号的 PAM 失败次数,可能导致账号锁定;没有真实 VNC 密码和匹配挑战码时,不应构造失败请求
- 建议使用临时 Web+IPMI 账号验证前三个方法,完成后删除该账号
调试示例
命令行调试
# 前置:创建一个临时 Web+IPMI 账号。以下示例中用户名为 itauth20260825、账号 ID 为 <临时账号ID>。
# LocalAuthenticate:使用正确密码认证,关闭登录记录和活跃时间更新。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/LocalAccountAuthN bmc.kepler.AccountService.LocalAccountAuthN \
LocalAuthenticate a{ss}saya{sb} 4 Interface Web UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 itauth20260825 11 65 117 116 104 64 50 48 50 54 88 89 3 IsAuthPassword true RecordLoginInfo false UpdateActiveTime false
# 预期响应:a{ss} <数量>,其中包含 "Id" "<临时账号ID>" 与 "UserName" "itauth20260825"。
# 构造失败:以错误密码认证临时账号。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/LocalAccountAuthN bmc.kepler.AccountService.LocalAccountAuthN \
LocalAuthenticate a{ss}saya{sb} 4 Interface Web UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 itauth20260825 10 66 97 100 64 50 48 50 54 88 89 3 IsAuthPassword true RecordLoginInfo false UpdateActiveTime false
# 预期失败响应:Call failed: {"format":"Authorization failed because the user name or password is incorrect, or your account is locked.","name":"AuthorizationFailed","registry_prefix":"<注册表前缀>"}
# GenRmcp20Code:使用 HmacSha1(1) 和三个固定 16 字节输入生成 RAKP2、SIK、RAKP3。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/LocalAccountAuthN bmc.kepler.AccountService.LocalAccountAuthN \
GenRmcp20Code a{ss}ysuuayayayys 4 Interface IPMI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 1 itauth20260825 1 1 16 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 16 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 16 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 4 127.0.0.1
# 预期响应:ay 20 <RAKP2字节> ay 20 <SIK字节> ay 20 <RAKP3字节>。
# 构造失败:使用不存在的用户名生成 RMCP 2.0 认证码。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/LocalAccountAuthN bmc.kepler.AccountService.LocalAccountAuthN \
GenRmcp20Code a{ss}ysuuayayayys 4 Interface IPMI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 1 itauth_not_exist 1 1 16 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 16 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 16 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 4 127.0.0.1
# 预期失败响应:Call failed: {"format":"Authorization failed because the user name or password is incorrect, or your account is locked.","name":"AuthorizationFailed","registry_prefix":"<注册表前缀>"}
# GenRmcp15Code:使用 HmacMd5(2) 和临时账号 ID 生成认证码。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/LocalAccountAuthN bmc.kepler.AccountService.LocalAccountAuthN \
GenRmcp15Code a{ss}yayyuu 4 Interface IPMI UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16 2 4 1 2 3 4 <临时账号ID> 1 1
# 预期响应:ay 16 <认证码字节>。
# VncAuthenticate:不提供通用伪造调用。该方法必须使用真实 VNC 密码生成的密文和匹配挑战码;错误调用会累计 VNC 账号失败次数。
# 清理:删除临时账号,清除本轮 RMCP 登录记录与认证失败次数。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/<临时账号ID> bmc.kepler.AccountService.ManagerAccount \
Delete a{ss} 4 Interface Web UserName <当前登录管理员> ClientAddr 127.0.0.1 Privilege 16
# 预期响应:成功时无输出。适用版本 1.70.19 及以上
2.9 密码策略对象与账户策略对象(PasswordPolicy / AccountPolicy)
密码策略对象位于 /bmc/kepler/AccountService/PasswordPolicys/:AccountType,账户策略对象位于 /bmc/kepler/AccountService/AccountPolicies/:AccountType,提供按账户类型(Local/OEM/SNMPCommunity/VNC 等)的密码与账户策略。
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
Policy property u - -
.Pattern property s - -
.MaxPasswordLength property u - -
.AccountType property s - -功能说明
PasswordPolicy 按账户类型配置密码校验策略(Policy 位图:bit0 默认开关、bit1 指定开关)、密码正则 Pattern、最大密码长度 MaxPasswordLength;AccountPolicy 按账户类型配置用户名正则 NamePattern、允许的登录接口集合 AllowedLoginInterfaces、前端是否呈现 Visible、是否可删除 Deletable/OnlineDeletable。策略与 IPMI 0x30/0x93 的 Set/Get PasswordRulePolicy(0x77/0x76-07)与 Set/Get PasswordPattern(0x77/0x76-08)对应。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.AccountService.PasswordPolicy / bmc.kepler.AccountService.AccountPolicy |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
属性参数说明
| 属性名 | 类型 | 默认值 | 描述 | 取值范围 |
|---|---|---|---|---|
| Policy(PasswordPolicy) | U8 | - | 密码校验策略 | 以 bit 位区分,bit0 默认开关,bit1 指定开关,取值不可为 0 |
| Pattern(PasswordPolicy) | String | - | 密码校验正则表达式 | 0~255 字符 |
| MaxPasswordLength(PasswordPolicy) | U32 | - | 本账户类型可支持的密码最大长度 | 1~512 |
| AccountType(PasswordPolicy) | String | - | 账户类型(只读) | Local / OEM / SNMPCommunity / VNC 等 |
| NamePattern(AccountPolicy) | String | "" | 用户名正则规则 | 0~255 字符,如 |
| AllowedLoginInterfaces(AccountPolicy) | String[] | 7 接口 | 允许本地用户开启的登录接口 | Web/SNMP/IPMI/SSH/SFTP/Local/Redfish |
| Visible(AccountPolicy) | Boolean | false | 标识某类型用户前端是否呈现 | true/false |
| Deletable(AccountPolicy) | Boolean | false | 标识某类型用户是否可删除 | true/false |
| OnlineDeletable(AccountPolicy) | Boolean | true | 标识在线用户是否可删除 | true/false |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| kepler.account.ValueOutOfRange | 设置策略失败 | 策略值/正则非法 | 使用合法取值 |
| kepler.account.PasswordPatternInvalid | 设置失败 | 正则表达式非法 | 检查正则语法 |
| - | 操作成功 | NA | NA |
应用场景
- 按账户类型差异化配置密码复杂度与用户名规则
- IPMI 侧同步设置密码规则(SetPasswordRulePolicy)
限制条件
- 策略按
AccountType区分,不同账户类型独立配置 - 该对象仅属性,通过
Set操作生效,设置成功会打印对应操作日志(PasswordPolicy/PasswordPattern/MaxPasswordLength/NamePatternChange等)
调试示例
命令行调试
# PasswordPolicy:读取 Local 账户类型的最大密码长度;u 表示无符号整数。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/PasswordPolicys/Local bmc.kepler.AccountService.PasswordPolicy \
MaxPasswordLength
# 预期响应:u <当前最大密码长度>,默认通常为 u 20。
# AccountPolicy:读取并记录 Visible 原始值;b 表示 Boolean。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/AccountPolicies/Local bmc.kepler.AccountService.AccountPolicy \
Visible
# 预期响应:b true 或 b false。请记录 true/false,恢复时使用该原始值。
# 将 Visible 设为 true,演示布尔属性写入。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/AccountPolicies/Local bmc.kepler.AccountService.AccountPolicy \
Visible b true
# 预期响应:成功时无输出。
# 回读确认写入生效。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/AccountPolicies/Local bmc.kepler.AccountService.AccountPolicy \
Visible
# 预期响应:b true。
# 清理:将 true 替换为前一步记录的原始值;例如原始值为 false 时执行以下命令。
busctl --user set-property bmc.kepler.account \
/bmc/kepler/AccountService/AccountPolicies/Local bmc.kepler.AccountService.AccountPolicy \
Visible b false
# 预期响应:成功时无输出。
# 最终回读,确认 Visible 已恢复为记录的原始值。
busctl --user get-property bmc.kepler.account \
/bmc/kepler/AccountService/AccountPolicies/Local bmc.kepler.AccountService.AccountPolicy \
Visible
# 预期响应:b <记录的原始值>。适用版本 1.70.19 及以上
2.10 IPMI 命令
account 组件向 IPMI 通道注册用户管理命令,供带内(OS/管理软件)对用户进行管理。
功能说明
account 组件提供基于 IPMI 的用户及账号安全策略查询和用户维护能力,用于获取设备当前配置、维护指定用户,包括:
- 用户访问权限、用户名和登录接口等用户基础信息;
- 密码复杂度检查、用户名密码前缀比对、密码校验策略和密码正则等密码安全策略;
- SNMP 配置、弱口令字典使能、首次登录改密、历史密码检查、逃生用户和初始密码提示等账号策略配置。
- 指定用户的用户名、通道访问权限和登录接口设置,以及用户密码设置、启用和禁用。
查询命令不修改用户信息或安全策略,可用于带内管理软件获取当前配置,也可用于设备维护和问题定位时核对账号状态。写操作会修改指定用户;本文示例使用临时账号,避免影响设备中的业务账号。
| 属性 | 内容 |
|---|---|
| 接口名 | IPMI(netfn 0x06 / 0x30) |
| 首发版本 | 1.70.19 |
| 废弃状态 | 正常可用 |
参数说明
常用命令示例,全量命令请参考。
https://gitcode.com/openUBMC/docs/blob/main/docs/zh/development/specifications/ipmi/standard.md
| IPMI 命令 | netfn / cmd | 说明 | 权限 |
|---|---|---|---|
| Get User Access | 0x06 / 0x44 | 获取用户通道权限 | UserMgmt |
| Set User Access | 0x06 / 0x43 | 设置指定用户的通道访问权限 | UserMgmt |
| Get User Name | 0x06 / 0x46 | 获取用户名 | UserMgmt |
| Set User Name | 0x06 / 0x45 | 设置指定用户的用户名 | UserMgmt |
| Get User Password Complexity | 0x30 / 0x93(Sel 0x21) | 获取密码复杂度检查开关 | ReadOnly |
| Get SNMP Configuration | 0x30 / 0x93(Sel 0x75) | 获取 SNMP 配置 | UserMgmt |
| Get Account Interface | 0x30 / 0x93(Sel 0x79) | 获取用户登录接口 | UserMgmt |
| Set User Interface | 0x30 / 0x93(Sel 0x68) | 设置指定用户的登录接口 | UserMgmt |
| Set Account Password | 0x06 / 0x47(操作 0x02) | 设置指定用户的密码 | ConfigureSelf |
| Disable Account | 0x06 / 0x47(操作 0x00) | 禁用指定用户 | ConfigureSelf |
| Enable Account | 0x06 / 0x47(操作 0x01) | 启用指定用户 | ConfigureSelf |
| Get User Password Compare Info | 0x30 / 0x93(Sel 0x5B-30) | 获取用户名密码前缀比对配置 | ReadOnly |
| Get WeakPwdDictionaryEnabled | 0x30 / 0x93(Sel 0x76-01) | 查询弱口令字典使能状态 | UserMgmt |
| Get FirstLoginModifyPolicy | 0x30 / 0x93(Sel 0x76-02) | 查询首次登录改密策略 | UserMgmt |
| Get HistoryPwdCheckCount | 0x30 / 0x93(Sel 0x76-03) | 查询历史密码检查数 | UserMgmt |
| Get EmergencyLoginAccount | 0x30 / 0x93(Sel 0x76-05) | 查询逃生用户配置 | UserMgmt |
| Get InitialPasswordPromptEnable | 0x30 / 0x93(Sel 0x76-06) | 查询初始密码提示开关 | UserMgmt |
| Get PasswordRulePolicy | 0x30 / 0x93(Sel 0x76-07) | 查询密码校验策略 | SecurityMgmt |
| Get PasswordPattern | 0x30 / 0x93(Sel 0x76-08) | 查询密码正则配置 | SecurityMgmt |
调试示例
以下示例命令将 <IP> 及各命令注明的 IPMI 用户名、密码替换为目标环境的实际值;用户 ID、通道号及响应数据会随设备配置而变化。ipmitool raw 成功时仅输出响应数据,不额外显示 Completion Code 0x00。
# 1. Get User Access:查询通道 1 上用户 ID 2 的访问权限。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x44 0x01 0x02响应示例:11 46 01 34
# 2. Get User Name:查询用户 ID 2 的用户名。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x46 0x02响应示例:41 64 6d 69 6e 69 73 74 72 61 74 6f 72 00 00 00
# 3. Get User Password Complexity:查询密码复杂度检查开关。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员/操作员/普通用户/自定义角色用户名> -P '<对应用户密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x21响应示例:db 07 00 01
# 4. Get SNMP Configuration:查询 SNMP 配置。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x75 0x01 0x02 0x00响应示例:db 07 00 01 01
# 5. Get Account Interface:查询用户 ID 2 的登录接口。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x79 0x02响应示例:db 07 00 df
# 6. Get User Password Compare Info:查询用户名密码前缀比对配置。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员/操作员/普通用户/自定义角色用户名> -P '<对应用户密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x5b 0x30 0x00响应示例:db 07 00 00 04
# 7. Get WeakPwdDictionaryEnabled:查询弱口令字典使能状态。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x76 0x01 0x02响应示例:db 07 00 01 01
# 8. Get FirstLoginModifyPolicy:查询首次登录改密策略。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x76 0x02 0x02响应示例:db 07 00 01 00
# 9. Get HistoryPwdCheckCount:查询历史密码检查数。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x76 0x03 0x02响应示例:db 07 00 01 05
# 10. Get EmergencyLoginAccount:查询逃生用户配置。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x76 0x05 0x02响应示例:db 07 00 01 02
# 11. Get InitialPasswordPromptEnable:查询初始密码提示开关。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x76 0x06 0x02响应示例:db 07 00 01 01
# 12. Get PasswordRulePolicy:查询密码校验策略。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员/具备SecurityMgmt权限的自定义角色用户名> -P '<对应用户密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x76 0x07 0x00响应示例:db 07 00 01 01
# 13. Get PasswordPattern:查询密码正则配置。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员/具备SecurityMgmt权限的自定义角色用户名> -P '<对应用户密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x76 0x08 0x00响应示例:db 07 00 00
用户维护写操作前置
下列写操作以临时账号为对象,避免修改实际业务账号。先通过 D-Bus 创建临时账号;New 返回的 y <临时账号ID> 为后续命令的账号 ID。以下写操作以返回 y 8 为例;若实际返回其他 ID,需将命令中的 0x08 替换为该 ID 对应的十六进制值,并将 Set Account Password 中的用户字节替换为 0x80 + 账号ID。
# 创建临时账号。0 表示由系统分配未占用的账号 ID。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts \
bmc.kepler.AccountService.ManagerAccounts \
New a{ss}ysayiaii \
3 Interface CLI UserName Administrator ClientAddr 127.0.0.1 \
0 itipmi06a 10 84 109 112 64 50 48 50 54 88 89 4 1 4 1响应示例:y 8
# 14. Set User Name:将临时账号 ID 8 的用户名改为 itipmi06b。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x45 0x08 \
0x69 0x74 0x69 0x70 0x6d 0x69 0x30 0x36 0x62 \
0x00 0x00 0x00 0x00 0x00 0x00 0x00
# 回读用户名,确认设置生效。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x46 0x08响应示例:设置成功时无输出;回读结果包含 69 74 69 70 6d 69 30 36 62。
# 15. Set User Access:设置临时账号 ID 8 在通道 1 上的访问权限。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x43 0xf1 0x08 0x04 0x00
# 回读通道 1 上的用户访问权限。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x44 0x01 0x08响应示例:设置成功时无输出;回读结果为四字节用户访问配置。
# 16. Set User Interface:设置临时账号 ID 8 的登录接口为 IPMI(0x04)。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x68 0x08 0x00 0x04 0x00 0x00
# 回读登录接口。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x30 0x93 0xdb 0x07 0x00 0x79 0x08响应示例:设置成功返回 db 07 00;回读结果为 db 07 00 04。
# 17. Set Account Password:将临时账号 ID 8 的密码设置为 Temp@2026XY。
# 第一个用户字节 0x88 = 0x80 + 账号 ID 8;密码字段以 20 字节补零传入。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x47 0x88 0x02 \
0x54 0x65 0x6d 0x70 0x40 0x32 0x30 0x32 0x36 0x58 0x59 \
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00响应示例:成功时无输出。
# 18. Disable Account:禁用临时账号 ID 8。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x47 0x08 0x00响应示例:成功时无输出。
# 19. Enable Account:重新启用临时账号 ID 8。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x47 0x08 0x01响应示例:成功时无输出。
# 清理:删除临时账号 ID 8。
busctl --user call bmc.kepler.account \
/bmc/kepler/AccountService/Accounts/8 \
bmc.kepler.AccountService.ManagerAccount \
Delete a{ss} \
4 Interface CLI UserName Administrator ClientAddr 127.0.0.1 Privilege 16
# 回读用户名;删除后该用户名称字段为空。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户名> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x46 0x08响应示例:删除成功时无输出;回读用户名为空。
返回值与异常
| Completion Code | 含义 | 典型触发条件 | 处理建议 |
|---|---|---|---|
| 0x00 | 成功 | 命令正常完成 | 无 |
| 0x80 | 资源已存在 | 用户名重复等 | 更换用户名或对象 |
| 0x81 | 用户不存在 | 操作不存在的用户 | 检查用户 ID |
| 0x84 | 密码复杂度检查失败 | 新密码不满足策略 | 使用满足策略的密码 |
| 0x85 | 账号解锁失败或团体名长度非法 | 具体含义取决于调用命令 | 结合命令参数和组件日志排查 |
| 0x86 | 团体名包含空格 | SNMP 团体名含空格 | 移除空格 |
| 0x87 | 业务侧用户管理被禁用 | HostUserManagementEnabled=false | 开启业务侧用户管理 |
| 0x92 | 公钥格式不正确 | 导入的公钥格式不合法 | 使用支持的公钥格式 |
| 0x93 | 密码与历史密码相同 | 新密码命中历史密码 | 更换新密码 |
| 0x94 | IPMI 密码为空 | 未设置或传入空 IPMI 密码 | 设置有效密码 |
| 0x96 | 需要重置密码 | 首次登录或管理员设置后要求改密 | 完成密码重置 |
| 0xC7 | 密码或请求数据长度非法 | 密码长度、请求长度不符合要求 | 检查长度及补零规则 |
| 0xC9 | 参数值超出范围 | 用户 ID、枚举等越界 | 使用合法取值 |
| 0xCC | 无效数据字段 | 请求参数格式或组合非法 | 检查 RAW 参数 |
| 0xD5 | 不支持的属性或操作 | 当前版本或配置不支持该能力 | 检查版本和功能开关 |
| 0xD7 | 不能删除 SNMPv3 Trap 用户 | 目标用户为 Trap 用户 | 调整 Trap 用户配置后再操作 |
| 0xD9 | 不能删除逃生用户 | 目标用户为逃生用户 | 先迁移或取消逃生用户配置 |
应用场景
- 带内管理软件通过 IPMI 查询用户访问权限、用户名和登录接口;
- 设备维护时核对密码策略、弱口令策略、首次登录策略和逃生用户配置;
- 定位账号登录、SNMP 配置或密码策略相关问题时获取当前运行配置。
- 使用临时账号验证用户名、通道访问权限、登录接口、密码及账号启用状态的维护流程。
限制条件
- 带内(Host侧)用户管理受
HostUserManagementEnabled/OSAdministratorPrivilegeEnabled控制,关闭后 BT(SYS_CHAN_NUM/21/22)、EDMA、IPMB-SM 通道的相关 IPMI 命令被拦截 - VNC 密码(0x30/0x94)长度不超过 8 字节。
- 使用
lanplus调试时,目标设备需启用 IPMI over LAN,并允许所使用的 Cipher Suite;登录账号还应启用 IPMI 登录接口并具备命令所需权限。不同环境的 Cipher Suite 或账号权限配置不同,可能在业务命令发送前即因会话协商或角色校验失败而被拒绝。 - 写操作会改变指定用户的运行配置。应使用临时账号执行,并在完成验证后删除该账号;不得对当前登录账号、逃生账号或生产业务账号直接执行示例中的写操作。
调试说明
IPMI 用户管理命令需要目标设备已启用 IPMI over LAN,并受 Cipher Suite、账号 IPMI 登录接口、账号权限和网络环境影响。不同设备及版本的命令参数、支持范围和返回数据可能不同。
account 组件负责注册和处理用户管理相关 IPMI 命令;若命令在会话协商阶段失败,应优先排查 IPMI/RMCP 配置、Cipher Suite 和账号权限。
适用版本 1.70.19 及以上
3. 组件扩展案例
3.1 扩展能力概述
account 的扩展入口是配置管理框架,而不是直接修改持久化数据。config_handle.lua 已向 mdb_config_manage 注册导入、导出、备份、恢复、获取可信配置和获取保留配置回调。其中:
custom类型由custom_settings.lua处理制造定制项;configuration类型由profile_adapter.lua处理配置导入导出;- 备份会处理弱口令字典、PAM 失败记录和用户主目录,并调用账号信息备份;恢复会按保留选项处理用户主目录。
当前 custom_settings_adapter 已登记的定制项覆盖管理员可写、密码有效期/历史密码、逃生账号、弱口令字典、首次登录策略、SNMP Trap 账号、VNC 登录规则、本地账号登录接口、团体名长度、扩展账号名称以及三类密码策略等。定制项的准确名称和实现以 src/lualib/interface/config_mgmt/manufacture/customization/custom_settings.lua 为准。
3.2 扩展点说明
| 扩展点 | 作用 | 关键约束 |
|---|---|---|
custom_settings_adapter | 定义定制项名称及 import、export、可选 import_convert、deps 回调 | 只有登记在该表中的普通定制项才会进入导入流程 |
account_service_customization.lua | 适配账户服务级配置,例如首次登录提示和密码策略开关 | 设置后需要通过 m_config_changed:emit() 同步资源树状态 |
account_customization.lua | 适配账号及账号策略类定制项 | 需遵守账号 ID、账号类型和现有策略校验 |
password_validator_customization.lua | 适配本地账号、SNMP 团体名、VNC 的密码规则和模式 | 修改会影响后续密码校验 |
profile_adapter.lua | 处理常规配置导入导出 | 不应把制造定制项放入 configuration 类型 |
导入时,custom_settings.lua:on_import() 会先根据每个定制项的 deps 做拓扑排序,再按顺序执行。未提供、未登记、导入值与当前值相同或没有 import 回调的项会被跳过。
3.3 扩展示例:新增一个有依赖的制造定制项
以下是仓库已有的 BMCSet_InitialPwdPrompt 实现。它说明了一个需要依赖另一个定制项的扩展应如何登记;该代码不是一个需要重复新增的功能。
-- src/lualib/interface/config_mgmt/manufacture/customization/custom_settings.lua
BMCSet_InitialPwdPrompt = {
import_convert = AccountServiceCustomization.convert_initial_password_prompt_enable,
import = AccountServiceCustomization.set_initial_password_prompt_enable,
export = AccountServiceCustomization.get_initial_password_prompt_enable,
deps = { 'BMCSet_InitialPasswordNeedModify' },
},
BMCSet_InitialPasswordNeedModify = {
import = AccountServiceCustomization.set_first_login_enable,
export = AccountServiceCustomization.get_first_login_enable,
},对应的业务实现将值写入账户服务并发送配置变更信号:
-- src/lualib/interface/config_mgmt/manufacture/customization/account_service_customization.lua
function AccountServiceCustomization.set_initial_password_prompt_enable(self, ctx, value)
self.m_account_service:set_initial_password_prompt_enable(value)
self.m_account_service.m_config_changed:emit('InitialPasswordPromptEnable', value)
end新增定制项时,按以下步骤实施:
- 在
custom_settings_adapter添加唯一键,提供成对的import/export回调;输入格式与内部值不一致时再提供import_convert。 - 在对应的 customization 模块实现业务设置和读取;若值会映射为资源树属性,设置后发送与该属性对应的配置变更信号。
- 存在前置开关或顺序要求时声明
deps;不要依赖 Lua 表遍历顺序。 - 在定制化 JSON 的
ConfigData.CustomSettings中填写该项后,经配置管理框架以custom类型导入。 - 为导入和导出补充单元测试。现有
test/unit/test_customization.lua使用test_data/config_customization.json导入上述两个定制项,并断言首次登录提示和首次登录改密均为true,可作为测试结构参考。
验证命令:
# 在 account 仓库根目录执行定制化单元测试集合
bingo test -ut预期:TestAccount:test_custom_settings 导入示例定制配置后通过;新增项应补充同类断言,并验证导出值能够再次被导入。
注意事项:
- 定制化会改变设备全局账号策略,应在隔离环境验证并准备恢复配置;不要直接修改账号持久化文件或数据库。
BMCSet_InitialPwdPrompt依赖BMCSet_InitialPasswordNeedModify是实际代码中的依赖关系;新增依赖必须显式声明。BMCSet_OEMNameNN会按实现将序号映射到扩展账号 ID;不要把这一特殊命名规则套用到普通定制项。- 密码规则定制项会影响新建账号、改密和 SNMP/VNC 密码设置,应回归相关接口用例。
4. 日志说明
4.1 一键日志收集
| 文件路径 | 内容说明 |
|---|---|
/var/log/app.log | account 组件运行日志,包括服务初始化、参数校验、资源树操作和文件传输任务失败等;使用 account 关键字筛选。 |
/var/log/operation.log | account 操作日志,包括新建/删除账号、改密、导入或导出弱口令字典、设置 SNMP 团体名和角色操作等的成功或失败。 |
/var/log/framework.log | account 服务启动、退出和框架异常等日志。 |
上述三个文件是平台一键日志收集的标准日志项。account 通过 mc.logging、logging:operation() 和 IPMI 操作日志接口写入相应日志通道;日志文件的轮转和最终收集路径由平台日志框架维护。
此外,若转储框架调用 interface/dump.lua:log_dump(),会在框架传入的合法目录生成 account_info.txt。其当前实现仅写入标题 account information:,不导出账号列表、密码、密钥或完整账号快照,不能作为账号数据恢复文件。
4.2 关键日志信息
| 关键字或日志模板 | 产生位置 | 含义与下一步 |
|---|---|---|
account class init start / account class init end | account_app.lua:init() | 判断 account 初始化是否进入和结束;若没有结束日志,继续查看同一时段的错误和框架堆栈 |
Import type(%s) is invalid | config_handle.lua:on_import() | 配置导入类型不是 custom 或 configuration;修正配置管理调用方的类型 |
Import data is nil / No ConfigData in config.json | config_handle.lua:on_import() | 导入内容为空或缺少 ConfigData 根节点;检查配置文件结构 |
import weak password dictionary failed, path invalid. | account_service_mdb.lua:import_weak_pwd_dictionary() | 导入路径既不是支持的远程 URL,也不符合临时目录路径规则;使用本章和 2.4 的路径限制 |
export weak password dictionary failed, path invalid. | account_service_mdb.lua:export_weak_pwd_dictionary() | 导出路径不符合临时目录或支持的远程 URL 规则 |
file trans failed, skip import/export weak pwd dict! | account_service_mdb.lua 异步任务 | account 已将远程传输交给 file_transfer;同时收集 file_transfer 的任务与错误日志 |
ROCommunityName is not allowed... / RWCommunityName is not allowed... | snmp_community_mdb.lua | 读写团体名相同;分别使用不同的非空值,或先清理冲突项 |
Dump path is invalid / Open account_dump failed | dump.lua:log_dump() | 转储框架传入的目录非法,或 account_info.txt 无法创建;归集转储框架日志与目标目录权限信息 |
5. 问题定界指南
5.1 典型问题定界
| 现象 | 是否优先归 account | 源码依据 | 首要证据和处理方向 |
|---|---|---|---|
| 账号、角色、登录规则、SNMP 团体名或账户策略的 D-Bus 调用返回 account 业务错误 | 是 | account_app.lua:register_rpc_methods() 将这些资源树方法绑定到 account 领域服务 | 收集请求、完整错误对象、account 应用日志和操作日志;按第 2 章确认对象路径、接口和入参 |
ImportWeakPasswordDictionary 或 ExportWeakPasswordDictionary 返回 InvalidPath | 是 | account_service_mdb.lua 先校验路径,并将敏感路径替换为 ****** | 检查路径是否为支持的远程 URL 或临时目录下的本地路径;不要通过日志反推被脱敏的原路径 |
| 远程弱口令字典传输任务失败 | 边界问题 | account 调用 file_transfer:get_file_from_url() 或 upload_file_to_url() 后异步等待任务 | 先保留 account 日志中任务失败信息,同时转 file_transfer 核查 URL、协议、网络和任务状态 |
busctl 提示对象路径不存在或接口不存在 | 待判定 | 资源树在 account 初始化及依赖检查后注册 | 先执行下方 tree/introspect;若 account 已初始化且路径仍不存在,检查版本、模型和注册回调;若服务未初始化,优先查看框架启动与依赖日志 |
SetSnmpCommunityLoginRule 显示为模型方法但调用提示未实现 | 是,当前实现限制 | mds/model.json 和生成代码声明该方法,但当前 account_app.lua:register_rpc_methods() 未绑定对应实现 | 不将该方法作为可用能力;保留调用错误、组件版本和 introspect 输出,提交为接口模型与注册实现不一致的问题 |
ipmitool -I lanplus 在业务命令前报 Cipher Suite、会话协商或角色错误 | 否,优先 IPMI/RMCP 配置 | account 注册账号管理 IPMI 命令,但 LAN 会话协商由 IPMI/RMCP 链路完成 | 核对 IPMI over LAN、Cipher Suite、账号 IPMI 登录接口和权限;会话建立前失败时,尚未进入 account 业务方法 |
5.2 最小化复现与证据收集
以下命令只读取资源树,不修改设备状态,可用于确认 account 服务、对象路径和运行时暴露的方法:
# 查看 account 服务导出的资源树
busctl --user tree bmc.kepler.account
# 查看账号集合对象的方法和属性
busctl --user introspect bmc.kepler.account /bmc/kepler/AccountService/Accounts
# 查看指定账号对象的方法和属性;将 <账号ID> 替换为实际存在的账号 ID
busctl --user introspect bmc.kepler.account /bmc/kepler/AccountService/Accounts/<账号ID>复现写操作时,使用第 2 章已验证的命令,遵循以下顺序:
- 记录修改前的属性或资源值;账号和角色操作使用唯一的临时名称、未占用 ID。
- 执行一个方法调用并保留完整响应;不要在工单、文档或日志中粘贴密码、私钥、SNMP Ku 等敏感值。
- 通过读取属性、查询返回值或删除临时资源确认结果。
- 无论成功或失败都恢复原属性,删除临时账号和临时角色。
- 从一键收集产物中摘取同一时间窗口的
account应用日志、操作日志和框架日志;远程字典传输还应附带 file_transfer 证据。
5.3 调试方法
开启调试日志
# 开启 account 详细日志
busctl --user call bmc.kepler.account \
/bmc/kepler/account/MicroComponent \
bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 debug 0
# 查看实时 account 日志
tail -f /var/log/app.log | grep account预期:SetDlogLevel 调用成功后无业务错误返回;后续执行账号、角色、SNMP 或弱口令字典操作时,可在实时输出中看到带 account 标签的日志。account 的集成测试辅助函数也使用相同的服务名、对象路径、接口名和方法签名设置日志级别。
限制条件:开启 DlogLevel 可由具备 D-Bus 调用权限的用户执行;读取 /var/log/app.log 需要目标平台授予相应日志文件读取权限。普通管理用户无法读取时,应使用具备维护权限的调试环境,或通过系统一键日志收集获取日志。
复现问题方法
- 先执行本节的只读
tree/introspect命令,确认服务、对象路径和接口已注册。 - 仅使用第 2 章中已验证的命令复现一个最小操作;写操作使用临时账号、临时角色或已备份的属性值。
- 保留命令、完整响应和同一时间窗口内的
/var/log/app.log、/var/log/operation.log、/var/log/framework.log中 account 相关记录。 - 操作完成后恢复属性并清理临时资源;远程弱口令字典传输失败时,补充 file_transfer 任务和日志证据。
5.4 错误对象解读
account 的 D-Bus 调用失败通常以结构化错误对象返回。优先记录 name 和 params,而不是只记录显示文案。
| 错误名 | 可由当前源码确认的触发条件 | 处理建议 |
|---|---|---|
InvalidPath | 弱口令字典导入/导出的路径不满足校验;错误中会脱敏路径 | 改用支持的远程 URL 或临时目录中的本地路径 |
OperationInProcess | 正在导入或导出弱口令字典时再次启动该类操作 | 等待已有任务结束后重试 |
SameROCommunityName | 设置只读团体名时与现有读写团体名相同 | 为只读团体名使用不同值,或先修改/清空读写团体名 |
SameRWCommunityName | 设置读写团体名时与现有只读团体名相同 | 为读写团体名使用不同值,或先修改/清空只读团体名 |
除上述名称外,应以 mds/errors.json、运行时错误对象和对应实现分支共同判断,避免仅凭 IPMI Completion Code 或界面提示推断根因。
6. 常见问题解答
Q1:弱口令字典导入或导出返回 InvalidPath
- 问题描述
调用 ImportWeakPasswordDictionary 或 ExportWeakPasswordDictionary 后返回 InvalidPath,且路径参数在错误中显示为 ******。
- 一句话答案
路径没有通过 account 的本地临时目录/远程 URL 校验;路径脱敏是实现的安全行为。
- 根因说明
account_service_mdb.lua 仅接受支持协议的远程 URL,或符合 TMP_PATH 规则的本地路径。导入的本地文件在后续还要通过临时目录或共享内存目录校验;导出本地文件也会校验真实路径。失败时实现主动以 ****** 替代原始路径。
- 解决方案
使用第 2.4 节已验证的路径格式:本地文件放在目标设备的临时目录内,或使用组件支持的远程 URL;确认文件存在、进程具备访问权限后再调用。
- 规避方案
不要用任意绝对路径替代临时目录,也不要为了绕过校验修改路径校验或持久化文件。
- 适用版本
1.70.19 及以上
Q2:设置 SNMP 只读、读写团体名时提示名称重复
- 问题描述
设置只读团体名返回 SameROCommunityName,或设置读写团体名返回 SameRWCommunityName。
- 一句话答案
只读和读写团体名不能使用同一个非空字符串。
- 根因说明
snmp_community_mdb.lua 在写入前读取另一类团体名:设置只读时与读写值比较,设置读写时与只读值比较;相同即拒绝。空字符串是删除团体名流程,逻辑与设置非空值不同。
- 解决方案
先通过 GetSnmpCommunity 读取当前值;设置为彼此不同的名称。若确实需要移除其中一个,使用空字符串删除后再设置另一个值。
- 规避方案
批量配置前先读取并保存读写两个原值;清理和恢复时按不同名称处理,避免恢复过程短暂写入冲突值。
- 适用版本
1.70.19 及以上
Q3:SNMP 用户接口的对象路径加上 /SnmpUser 后不存在
- 问题描述
对 /bmc/kepler/AccountService/Accounts/<账号ID>/SnmpUser 调用 SNMP 用户方法,返回对象路径不存在。
- 一句话答案
SNMP 用户接口挂载在账号对象 /Accounts/<账号ID> 上,不是一个名为 /SnmpUser 的子对象。
- 根因说明
account_app.lua:register_rpc_methods() 在 SetAuthenticationProtocol、SetEncryptionProtocol 和 GetSnmpKeys 的回调中,从 /Accounts/(%d+) 解析账号 ID;实现没有注册 /SnmpUser 子路径。
- 解决方案
保留账号对象路径 /bmc/kepler/AccountService/Accounts/<账号ID>,仅把 D-Bus 接口名指定为 bmc.kepler.AccountService.ManagerAccount.SnmpUser,参见第 2.3 节。
- 规避方案
先用 busctl --user introspect 确认对象路径和接口名,再执行写操作。
- 适用版本
1.70.19 及以上
Q4:SetSnmpCommunityLoginRule 出现在模型中,但调用提示未实现
- 问题描述
资源模型或 introspect 中可以看到 SetSnmpCommunityLoginRule,但实际调用返回“method not implemented”类错误。
- 一句话答案
当前源码生成了该方法定义,但 account 的运行时注册回调没有绑定该方法实现。
- 根因说明
mds/model.json 与生成的 gen/class/model.lua 均包含该方法;但当前 account_app.lua:register_rpc_methods() 只绑定了 SetRoCommunity、SetRwCommunity 和 GetSnmpCommunity,未绑定 ImplSnmpCommunitySnmpCommunitySetSnmpCommunityLoginRule。
- 解决方案
不要在当前版本把该方法作为可用配置手段。提交问题时附上模型版本、introspect 输出、调用错误和 register_rpc_methods() 的对照信息,由组件维护者决定补注册实现还是从模型中移除声明。
- 规避方案
对文档、脚本和自动化用例,仅使用已在 register_rpc_methods() 中绑定且已在测试环境验证的方法。
- 适用版本
1.70.19 及以上
Q5:ipmitool -I lanplus 在执行账号查询前就会话失败
- 问题描述
执行第 2.10 节命令时出现 Cipher Suite 不匹配、会话协商失败或角色校验失败,未得到账号查询响应。
- 一句话答案
这是 IPMI/RMCP 会话建立阶段的问题;业务命令尚未进入 account 的账号查询实现。
- 根因说明
account 负责注册账号管理 IPMI 命令,但 LAN 会话的 Cipher Suite 协商、认证和角色校验发生在命令处理之前。会话未建立时,不会产生对应的 account 方法调用。
- 解决方案
核对目标设备是否启用 IPMI over LAN、所选 Cipher Suite 是否允许、账号是否启用 IPMI 登录接口并拥有所需权限。会话建立后,按与目标设备和软件版本匹配的《IPMI 命令操作手册》执行只读查询确认账号管理能力。
- 规避方案
在自动化脚本中先执行一个只读 IPMI 查询作为会话与权限预检;预检失败时收集 IPMI/RMCP 日志,不将其误报为 account 业务错误。
- 适用版本
1.70.19 及以上