account

版本信息

项目内容
组件版本1.120.42
首发版本1.70.19
文档作者dowantgo
最后更新2026-08-25

1. 组件概述

1.1 组件简介

account 是 openUBMC 的用户与用户服务管理核心组件,负责 BMC 上所有用户及用户相关服务的管理。提供用户查询、创建、删除、用户密码策略配置、用户类型管理等功能。

在系统中,account 组件通过资源协作接口对外暴露用户、角色、登录规则、SNMP 团体名、密码策略等对象,提供本地认证、VNC 认证、RMCP 认证等RPC服务。

组件整体采用领域驱动设计(DDD)架构,分为四层:

  1. 接口层(interface):作为组件级的对外统一出口,处理北向映射器、IPMI 通道下发的属性/方法变化,统一记录操作日志。
  2. 服务层(service):完成多个领域对象与外部服务之间协调性、组合性的交互逻辑,作为各业务模块的出口。
  3. 领域层(domain):提供相关实体类定义,承载核心业务逻辑,包括管理与备份用户、管理登录规则、管理权限角色等。
  4. 基础设施层(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} 为调用上下文字典,示例中的 InterfaceUserNameClientAddrPrivilege 应替换为实际调用环境 可用的上下文;<账号ID><用户名> 等尖括号内容均为占位符。busctl 输出开头的 yubsss 等是 D-Bus 类型标记,属于成功响应 的一部分。涉及账号删除、改密、锁定、策略、SNMP 团体名或公钥的示例会改变 设备状态,验证前应记录原值并在结束后恢复;密码、私钥和 SNMP Ku 等敏感值 不应写入文档、工单或普通日志。

2.1 用户集合对象(ManagerAccounts)

提供新建用户、按用户名查ID、设置用户可修改属性与锁定用户等能力。

bash
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
废弃状态正常可用
方法配置参数
方法名入参类型出参类型描述取值范围
Newysayiaiiy新建用户入参:
y: 用户 ID,0(由系统从未占用的2~17中选择)或2~17
s: 用户名,1~32 字符;创建时还受当前账号类型的 NamePattern 策略及其他业务校验限制
ay: 密码字节数组,接口最大长度为 512 字节;实际密码要求还受当前密码策略限制
i: 角色ID:0 或2~20,枚举值见下方表格
ai: 登录接口数组,登录接口枚举值见下方表格
i: 首次登录策略:1-提示修改密码;2-强制修改密码
出参:
y: 新建用户 ID
NewOEMAccountyssa{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
GetIdByUserNamesy通过用户名获取用户 IDs: 用户名,1~32 字符(<root> 会被映射为 root
出参:
y: 用户 ID,0~255
GetUidGidByUserNamesuu通过用户名查找用户 UID/GIDs: 用户名,1~32 字符
出参:
u: UID(非负整数),u: GID(非负整数)
SetAccountWritableya{sb}-设置用户某属性是否可修改y: 用户 ID,2~115
a{sb}: 属性可修改性字典(*Writable 属性名→是否可修改),例如 UserNameWritable→false
GetAccountWritableya{sb}获取用户属性可修改性y: 用户 ID,2~115
出参:
a{sb}: 属性可修改性字典,例如 UserNameWritable→true/false
SetAccountLockStateyb-设置用户锁定状态y: 用户 ID,2~115
b: 锁定状态(true 锁定 / false 解锁)

角色类型:

类型枚举值描述
NoAccess0无权限
CommonUser2普通用户
Operator3操作员
Administrator4管理员
CustomRole1~45~8自定义用户1~4
CustomRole5~169~20自定义用户5~16 (定制开启)

登录接口类型:

类型枚举值描述
Web1使用浏览器登录BMC Web界面
SNMP2使用符合SNMP协议的终端工具登录BMC
IPMI4使用符合IPMI协议的终端工具登录BMC
SSH8使用符合SSH协议的终端工具登录BMC命令行
SFTP16使用符合SFTP协议的终端工具登录BMC文件系统
Local64通过服务器的串口登录BMC命令行
Redfish128使用符合Redfish协议的工具登录BMC

返回值与异常

返回值类型含义触发条件处理建议
kepler.account.UserFull新建用户失败用户数量已达上限删除无用用户后再新建
kepler.account.InvalidAccountId新建/操作失败用户 ID 非法(如指定为 1)使用合法用户 ID
kepler.account.UserNameInvalid新建用户失败用户名不符合命名规则AccountPolicy.NamePattern 规则命名
ResourceAlreadyExists新建用户失败用户名已存在更换用户名
PropertyValueOutOfRange新建OEM用户失败用户ID超出范围使用范围内的OEM用户ID
y新建用户成功返回用户 IDNANA

应用场景

  • 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 分支,仅设置用户名

调试示例

命令行调试
bash
# 新建本地用户(不指定用户 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&#123;sb&#125; <属性数量> "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&#123;sb&#125; <属性数量> "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 公钥、记录上次登录、校验密码)。

bash
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)
ChangePwday-修改账户密码ay: 待设置密码字节数组,1~512 字节(需满足密码复杂度/弱口令/历史密码策略)
ChangeSnmpPwday-修改本地用户 SNMP 加密密码ay: 待设置密码字节数组,1~512 字节
ImportSSHPublicKeyssu导入 SSH 公钥s: 类型,URIText
s: 内容,URI 为远程/本地路径;Text 为公钥文本
出参:
u: 任务 ID(远程上传时有效,否则为 0)
DeleteSSHPublicKey--删除 SSH 公钥
SetLastLoginssy记录用户上次登录信息(第三方认证调用)s: 上次登录 IP
s: 上次登录接口
出参:
y: 处理结果(0 成功)
VerifyPasswords-校验用户密码s: 需要校验的密码字符串,最长 512 字符

返回值与异常

返回值类型含义触发条件处理建议
kepler.account.PasswordComplexityCheckFail修改密码失败新密码不满足复杂度要求使用满足复杂度要求的密码
kepler.account.InvalidPasswordSameWithHistory修改密码失败新密码与历史密码相同更换新密码
kepler.account.PasswordNeedReset修改密码失败用户首次登录需强制改密先完成强制改密
kepler.account.IncorrectPublicKeyFormat导入公钥失败公钥格式不正确使用正确的 SSH 公钥文件
-操作成功NANA

应用场景

  • Web 端修改用户密码、删除用户、管理 SSH 公钥
  • CDN/第三方认证登录后回写用户上次登录 IP 与接口
  • Web 前端登录时校验密码(VerifyPassword)

限制条件

  • ChangePwd/ChangeSnmpPwd 的密码为 ay 字节数组,总线上不出现明文
  • 修改密码会触发密码复杂度、弱口令字典、历史密码、用户名密码前缀比对等全量策略校验
  • 删除用户时,若用户为内置用户(如管理员、trapv3 用户、OEM 存储的底层用户等)会根据 AccountPolicy.Deletable 与删除保护规则失败
  • ImportSSHPublicKeyURI 参数支持远程地址或本地绝对 .pub 文件路径;本地文件应置于 /tmp 目录。Text 参数必须是完整的 OpenSSH 公钥文本(例如以 ssh-rsa 开头的单行公钥),不能使用截断示例或私钥内容

调试示例

命令行调试
bash
# 参数说明:<账号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 用户的鉴权/加密算法与密钥管理。

bash
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
废弃状态正常可用
方法配置参数
方法名入参类型出参类型描述取值范围
SetAuthenticationProtocolyss-设置 SNMP 鉴权算法、鉴权密码和加密密码y: 鉴权算法:0 None / 1 MD5 / 2 SHA96 / 3 SHA224 / 4 SHA256 / 5 SHA384 / 6 SHA512
s: 鉴权密码,1~512 字符
s: 加密密码,1~512 字符
SetEncryptionProtocoly-设置 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获取密钥失败密钥加密解密异常检查环境数据库/密钥是否损坏
-操作成功NANA

应用场景

  • Web 端配置用户 SNMPv3 鉴权/加密算法与密码
  • SNMP 下发前校验用户算法与密码是否与脚本一致(避免 "Authentication failure")

限制条件

  • 密码长度 1~512 字符,受 SNMP 密码策略(SnmpCommunityPasswordRulePolicy)约束
  • 算法枚举为平台定义的 SNMP 算法值,需与 SNMPAuthenticationProtocols/SNMPEncryptionProtocols 定义一致
  • 用户未设置密码时 SNMP 下发会失败,需先设置鉴权密码
  • GetSnmpKeys 会返回实际 Ku 密钥材料;仅应在受控调试环境使用,输出不得写入文档、工单或普通日志

调试示例

命令行调试
bash
# 参数说明:<账号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 公钥获取、用户恢复还原点操作。

bash
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
废弃状态正常可用
属性参数说明
属性名类型默认值描述取值范围
AccountLockoutCounterResetAfterS320账号锁定失败计数重置时间配置当前接口未声明数值范围
AccountLockoutCounterResetEnabledBooleanfalse账号锁定失败计数重置使能true/false
AuthFailureLoggingThresholdS320认证失败日志阈值配置当前接口未声明数值范围
ServiceEnabledBooleantrue账号服务使能状态true/false
MinPasswordLengthS328密码最短长度单位:字符
MaxPasswordLengthS3220密码最长长度(只读)单位:字符
PasswordComplexityEnableBooleantrue密码复杂度检查开关true/false
InitialPasswordPromptEnableBooleantrue首次登录修改密码提示true/false
InitialAccountPrivilegeRestrictEnabledBooleanfalse初始账户权限限制开关true/false
MinPasswordValidDaysU320密码最短有效期单位:天,与 MaxPasswordValidDays 差值不大于 10
MaxPasswordValidDaysU320密码最长有效期单位:天,0 表示不限制
EmergencyLoginAccountIdU80逃生用户0~17
SNMPv3TrapAccountIdU82SNMPv3Trap 用户用户 ID
InactiveDaysThresholdU320用户不活跃阈值单位:天
WeakPasswordDictionaryEnabledBooleantrue弱口令字典使能开关true/false
HistoryPasswordCountU85检查历史密码数0~MaxHistoryPasswordCount
MaxHistoryPasswordCountU85历史密码设置的最大范围单位:条
InitialPasswordNeedModifyBooleantrue初始密码需要强制修改true/false
HostUserManagementEnabledBooleantrue业务侧用户管理使能true/false
OSAdministratorPrivilegeEnabledBooleantrue业务侧管理员权限使能true/false
SNMPv3TrapAccountLimitPolicyU82trap 用户修改策略0 Modifiable / 1 NameModifiable / 2 NotModifiable
UserNamePasswordPrefixCompareEnabledBooleanfalse密码与用户名前 n 字节比较使能true/false
UserNamePasswordPrefixCompareLengthU84密码与用户名前 n 字节比较长度单位:字节
SNMPv3TrapAccountChangePolicyU80snmpv3trap 用户修改策略0 保持原有 / 1 可重命名删除
RequireChangePasswordActionBooleanfalse是否要求仅可通过 ChangePwd 修改密码true/false
方法配置参数
方法名入参类型出参类型描述取值范围
ImportWeakPasswordDictionarysu导入弱口令字典s: 本地文件使用 /tmp/<文件名>;也可传入远程 URL
文件大小不超过 1MB,行数不超过 1000 行,单行长度不超过密码最大长度
出参:
u: 本地导入返回 0,远程导入返回任务 ID
ExportWeakPasswordDictionarysu导出弱口令字典s: 本地导出文件使用 /tmp/<文件名>,长度不超过 256 字符;也可传入远程 URL
出参:
u: 本地导出返回 0,远程导出返回任务 ID
GetRequestedPublicKeyys获取 Web 登录加密公钥y: 公钥用途,当前支持 web 前端加密公钥:1
出参:
s: 公钥字符串
RecoverAccountyy-根据用户传入 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 属性修改全局策略时,属性间存在联动约束(如 MaxPasswordValidDaysMinPasswordValidDays 差值不大于 10)
  • RecoverAccount 依赖设备中已存在的持久账号备份,且会覆盖目标账号数据;当前未在普通调试环境验证成功恢复场景,不能对业务账号直接执行

调试示例

命令行调试
bash
# 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,提供九大权限的管理与自定义角色的新增删除。

bash
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
SetRolePrivilegeyb-设置角色权限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 未开启先开启扩展自定义角色功能
-操作成功NANA

应用场景

  • 新建扩展自定义角色(CustomRole5~16)并配置其权限
  • 为用户分配角色实现最小权限管理
  • 角色权限调整(如临时关闭某用户组的部分权限)

限制条件

  • NewDelete 仅支持 CustomRole5~16(ID 9~20);CustomRole1~4 与内置角色不能通过这两个方法新增或删除
  • 调试前需开启 ExtendedCustomRoleEnabled;结束后应恢复其原始值
  • UserMgmt、ReadOnly、ConfigureSelf 是不可修改的权限类型
  • Name/RolePrivilege 为只读属性,角色名称不可修改

调试示例

命令行调试
bash
# 前置:记录并开启扩展自定义角色功能;完成调试后,将该属性恢复为记录的原始值。
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/时间三个维度的登录限制(仅属性,无方法)。

bash
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
废弃状态正常可用
属性参数说明
属性名类型默认值描述取值范围
EnabledBooleanfalse登录规则使能状态true/false
IpRuleString空字符串IP 登录规则IPv4/IPv6 地址,或带掩码的地址;IPv4 掩码范围 1~32,IPv6 掩码范围 1~128
MacRuleString空字符串MAC 地址登录规则XX:XX:XX:XX:XX:XX 或三段前缀 XX:XX:XX,每段为两位十六进制数
TimeRuleString空字符串时间登录规则HH:MM/HH:MMYYYY-MM-DD/YYYY-MM-DDYYYY-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 中的准确名称
-操作成功NANA

应用场景

  • 限制某类用户仅在办公网段、特定时间段内允许登录
  • 绑定规则到用户实现细粒度登录准入

限制条件

  • Rule 是纯属性对象,没有业务方法;属性写入需要 SecurityMgmt 权限
  • 固定提供规则 ID 1~3;调试时应记录并恢复被修改规则的原始值
  • 启用带限制条件的规则可能影响后续登录;建议先保持 Enabled=false 完成格式验证

调试示例

命令行调试
bash
# 以下以规则 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 团体名与团体登录规则的管理。

bash
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
废弃状态正常可用
方法配置参数
方法名入参类型出参类型描述取值范围
SetRwCommunitys-设置 rw SNMP 团体名s: rw 团体名字符串(空字符串表示删除)
SetRoCommunitys-设置 ro SNMP 团体名s: ro 团体名字符串(空字符串表示删除)
GetSnmpCommunity-ss获取 snmp 团体名出参:
s: rw 团体名
s: ro 团体名
SetSnmpCommunityLoginRuleas-设置 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 回调当前版本不可使用该接口;需服务端补充实现后再调用
-操作成功NANA

应用场景

  • 配置 SNMP 读写团体名(ro/rw)
  • 在 SNMP 客户端与设备侧保持团体名一致

限制条件

  • ro 与 rw 团体名不能相同;空字符串表示删除对应团体名
  • 团体名不允许包含空格,长度受 SNMP 配置约束
  • 调试前必须读取并记录原始团体名;团体名属于敏感凭据,日志和文档中应脱敏
  • SetSnmpCommunityLoginRule 在当前服务中未实现,不能作为可用 API 示例

调试示例

命令行调试
bash
# 先读取并记录当前 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)认证。

bash
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
废弃状态正常可用
方法配置参数
方法名入参类型出参类型描述取值范围
LocalAuthenticatesaya{sb}a{ss}本地用户认证s: 用户名,1~32 字符
ay: 密码字节数组
a{sb}: 扩展配置字典(IsAuthPassword / TestPassword / IpmiLocalAuth / RecordOnly / RecordLoginInfo / UpdateActiveTime 等开关)
出参:
a{ss}: 账户信息
VncAuthenticatessa{ss}VNC 用户认证s: 密文
s: 挑战码
出参:
a{ss}: 账户信息
GenRmcp20CodeysuuayayayysayayayIPMI 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 认证码
GenRmcp15CodeyayyuuayIPMI 1.5 版本用户认证y: 加密算法
ay: 有效负载,1~255 字节
y: 用户 ID
u: 会话 ID
u: RMCP 会话的序列号
出参:
ay: 认证码

返回值与异常

返回值类型含义触发条件处理建议
AuthorizationFailed认证失败用户不存在、密码错误、账号被禁用、接口未开放或登录规则不通过检查账号、密码和接口配置
UserLocked认证失败用户被手动锁定解锁用户后重试
NoAccess本地认证失败角色为 NoAccess调整用户角色
AuthorizationUserRestrictedVNC 认证失败命中登录规则限制检查 VNC 用户的登录规则
-认证成功返回账户信息NANA

应用场景

  • 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 账号验证前三个方法,完成后删除该账号

调试示例

命令行调试
bash
# 前置:创建一个临时 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 等)的密码与账户策略。

bash
NAME                                TYPE      SIGNATURE             RESULT/VALUE           FLAGS
Policy                             property  u                     -                      -
.Pattern                           property  s                     -                      -
.MaxPasswordLength                 property  u                     -                      -
.AccountType                       property  s                     -                      -

功能说明

PasswordPolicy 按账户类型配置密码校验策略(Policy 位图:bit0 默认开关、bit1 指定开关)、密码正则 Pattern、最大密码长度 MaxPasswordLengthAccountPolicy 按账户类型配置用户名正则 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)架构,分为四层:

  1. 接口层(interface):作为组件级的对外统一出口,处理北向映射器、IPMI 通道下发的属性/方法变化,统一记录操作日志。
  2. 服务层(service):完成多个领域对象与外部服务之间协调性、组合性的交互逻辑,作为各业务模块的出口。
  3. 领域层(domain):提供相关实体类定义,承载核心业务逻辑,包括管理与备份用户、管理登录规则、管理权限角色等。
  4. 基础设施层(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} 为调用上下文字典,示例中的 InterfaceUserNameClientAddrPrivilege 应替换为实际调用环境 可用的上下文;<账号ID><用户名> 等尖括号内容均为占位符。busctl 输出开头的 yubsss 等是 D-Bus 类型标记,属于成功响应 的一部分。涉及账号删除、改密、锁定、策略、SNMP 团体名或公钥的示例会改变 设备状态,验证前应记录原值并在结束后恢复;密码、私钥和 SNMP Ku 等敏感值 不应写入文档、工单或普通日志。

2.1 用户集合对象(ManagerAccounts)

提供新建用户、按用户名查ID、设置用户可修改属性与锁定用户等能力。

bash
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
废弃状态正常可用
方法配置参数
方法名入参类型出参类型描述取值范围
Newysayiaiiy新建用户入参:
y: 用户 ID,0(由系统从未占用的2~17中选择)或2~17
s: 用户名,1~32 字符;创建时还受当前账号类型的 NamePattern 策略及其他业务校验限制
ay: 密码字节数组,接口最大长度为 512 字节;实际密码要求还受当前密码策略限制
i: 角色ID:0 或2~20,枚举值见下方表格
ai: 登录接口数组,登录接口枚举值见下方表格
i: 首次登录策略:1-提示修改密码;2-强制修改密码
出参:
y: 新建用户 ID
NewOEMAccountyssa{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
GetIdByUserNamesy通过用户名获取用户 IDs: 用户名,1~32 字符(<root> 会被映射为 root
出参:
y: 用户 ID,0~255
GetUidGidByUserNamesuu通过用户名查找用户 UID/GIDs: 用户名,1~32 字符
出参:
u: UID(非负整数),u: GID(非负整数)
SetAccountWritableya{sb}-设置用户某属性是否可修改y: 用户 ID,2~115
a{sb}: 属性可修改性字典(*Writable 属性名→是否可修改),例如 UserNameWritable→false
GetAccountWritableya{sb}获取用户属性可修改性y: 用户 ID,2~115
出参:
a{sb}: 属性可修改性字典,例如 UserNameWritable→true/false
SetAccountLockStateyb-设置用户锁定状态y: 用户 ID,2~115
b: 锁定状态(true 锁定 / false 解锁)

角色类型:

类型枚举值描述
NoAccess0无权限
CommonUser2普通用户
Operator3操作员
Administrator4管理员
CustomRole1~45~8自定义用户1~4
CustomRole5~169~20自定义用户5~16 (定制开启)

登录接口类型:

类型枚举值描述
Web1使用浏览器登录BMC Web界面
SNMP2使用符合SNMP协议的终端工具登录BMC
IPMI4使用符合IPMI协议的终端工具登录BMC
SSH8使用符合SSH协议的终端工具登录BMC命令行
SFTP16使用符合SFTP协议的终端工具登录BMC文件系统
Local64通过服务器的串口登录BMC命令行
Redfish128使用符合Redfish协议的工具登录BMC

返回值与异常

返回值类型含义触发条件处理建议
kepler.account.UserFull新建用户失败用户数量已达上限删除无用用户后再新建
kepler.account.InvalidAccountId新建/操作失败用户 ID 非法(如指定为 1)使用合法用户 ID
kepler.account.UserNameInvalid新建用户失败用户名不符合命名规则AccountPolicy.NamePattern 规则命名
ResourceAlreadyExists新建用户失败用户名已存在更换用户名
PropertyValueOutOfRange新建OEM用户失败用户ID超出范围使用范围内的OEM用户ID
y新建用户成功返回用户 IDNANA

应用场景

  • 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 分支,仅设置用户名

调试示例

命令行调试
bash
# 新建本地用户(不指定用户 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&#123;sb&#125; <属性数量> "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&#123;sb&#125; <属性数量> "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 公钥、记录上次登录、校验密码)。

bash
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)
ChangePwday-修改账户密码ay: 待设置密码字节数组,1~512 字节(需满足密码复杂度/弱口令/历史密码策略)
ChangeSnmpPwday-修改本地用户 SNMP 加密密码ay: 待设置密码字节数组,1~512 字节
ImportSSHPublicKeyssu导入 SSH 公钥s: 类型,URIText
s: 内容,URI 为远程/本地路径;Text 为公钥文本
出参:
u: 任务 ID(远程上传时有效,否则为 0)
DeleteSSHPublicKey--删除 SSH 公钥
SetLastLoginssy记录用户上次登录信息(第三方认证调用)s: 上次登录 IP
s: 上次登录接口
出参:
y: 处理结果(0 成功)
VerifyPasswords-校验用户密码s: 需要校验的密码字符串,最长 512 字符

返回值与异常

返回值类型含义触发条件处理建议
kepler.account.PasswordComplexityCheckFail修改密码失败新密码不满足复杂度要求使用满足复杂度要求的密码
kepler.account.InvalidPasswordSameWithHistory修改密码失败新密码与历史密码相同更换新密码
kepler.account.PasswordNeedReset修改密码失败用户首次登录需强制改密先完成强制改密
kepler.account.IncorrectPublicKeyFormat导入公钥失败公钥格式不正确使用正确的 SSH 公钥文件
-操作成功NANA

应用场景

  • Web 端修改用户密码、删除用户、管理 SSH 公钥
  • CDN/第三方认证登录后回写用户上次登录 IP 与接口
  • Web 前端登录时校验密码(VerifyPassword)

限制条件

  • ChangePwd/ChangeSnmpPwd 的密码为 ay 字节数组,总线上不出现明文
  • 修改密码会触发密码复杂度、弱口令字典、历史密码、用户名密码前缀比对等全量策略校验
  • 删除用户时,若用户为内置用户(如管理员、trapv3 用户、OEM 存储的底层用户等)会根据 AccountPolicy.Deletable 与删除保护规则失败
  • ImportSSHPublicKeyURI 参数支持远程地址或本地绝对 .pub 文件路径;本地文件应置于 /tmp 目录。Text 参数必须是完整的 OpenSSH 公钥文本(例如以 ssh-rsa 开头的单行公钥),不能使用截断示例或私钥内容

调试示例

命令行调试
bash
# 参数说明:<账号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 用户的鉴权/加密算法与密钥管理。

bash
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
废弃状态正常可用
方法配置参数
方法名入参类型出参类型描述取值范围
SetAuthenticationProtocolyss-设置 SNMP 鉴权算法、鉴权密码和加密密码y: 鉴权算法:0 None / 1 MD5 / 2 SHA96 / 3 SHA224 / 4 SHA256 / 5 SHA384 / 6 SHA512
s: 鉴权密码,1~512 字符
s: 加密密码,1~512 字符
SetEncryptionProtocoly-设置 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获取密钥失败密钥加密解密异常检查环境数据库/密钥是否损坏
-操作成功NANA

应用场景

  • Web 端配置用户 SNMPv3 鉴权/加密算法与密码
  • SNMP 下发前校验用户算法与密码是否与脚本一致(避免 "Authentication failure")

限制条件

  • 密码长度 1~512 字符,受 SNMP 密码策略(SnmpCommunityPasswordRulePolicy)约束
  • 算法枚举为平台定义的 SNMP 算法值,需与 SNMPAuthenticationProtocols/SNMPEncryptionProtocols 定义一致
  • 用户未设置密码时 SNMP 下发会失败,需先设置鉴权密码
  • GetSnmpKeys 会返回实际 Ku 密钥材料;仅应在受控调试环境使用,输出不得写入文档、工单或普通日志

调试示例

命令行调试
bash
# 参数说明:<账号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 公钥获取、用户恢复还原点操作。

bash
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
废弃状态正常可用
属性参数说明
属性名类型默认值描述取值范围
AccountLockoutCounterResetAfterS320账号锁定失败计数重置时间配置当前接口未声明数值范围
AccountLockoutCounterResetEnabledBooleanfalse账号锁定失败计数重置使能true/false
AuthFailureLoggingThresholdS320认证失败日志阈值配置当前接口未声明数值范围
ServiceEnabledBooleantrue账号服务使能状态true/false
MinPasswordLengthS328密码最短长度单位:字符
MaxPasswordLengthS3220密码最长长度(只读)单位:字符
PasswordComplexityEnableBooleantrue密码复杂度检查开关true/false
InitialPasswordPromptEnableBooleantrue首次登录修改密码提示true/false
InitialAccountPrivilegeRestrictEnabledBooleanfalse初始账户权限限制开关true/false
MinPasswordValidDaysU320密码最短有效期单位:天,与 MaxPasswordValidDays 差值不大于 10
MaxPasswordValidDaysU320密码最长有效期单位:天,0 表示不限制
EmergencyLoginAccountIdU80逃生用户0~17
SNMPv3TrapAccountIdU82SNMPv3Trap 用户用户 ID
InactiveDaysThresholdU320用户不活跃阈值单位:天
WeakPasswordDictionaryEnabledBooleantrue弱口令字典使能开关true/false
HistoryPasswordCountU85检查历史密码数0~MaxHistoryPasswordCount
MaxHistoryPasswordCountU85历史密码设置的最大范围单位:条
InitialPasswordNeedModifyBooleantrue初始密码需要强制修改true/false
HostUserManagementEnabledBooleantrue业务侧用户管理使能true/false
OSAdministratorPrivilegeEnabledBooleantrue业务侧管理员权限使能true/false
SNMPv3TrapAccountLimitPolicyU82trap 用户修改策略0 Modifiable / 1 NameModifiable / 2 NotModifiable
UserNamePasswordPrefixCompareEnabledBooleanfalse密码与用户名前 n 字节比较使能true/false
UserNamePasswordPrefixCompareLengthU84密码与用户名前 n 字节比较长度单位:字节
SNMPv3TrapAccountChangePolicyU80snmpv3trap 用户修改策略0 保持原有 / 1 可重命名删除
RequireChangePasswordActionBooleanfalse是否要求仅可通过 ChangePwd 修改密码true/false
方法配置参数
方法名入参类型出参类型描述取值范围
ImportWeakPasswordDictionarysu导入弱口令字典s: 本地文件使用 /tmp/<文件名>;也可传入远程 URL
文件大小不超过 1MB,行数不超过 1000 行,单行长度不超过密码最大长度
出参:
u: 本地导入返回 0,远程导入返回任务 ID
ExportWeakPasswordDictionarysu导出弱口令字典s: 本地导出文件使用 /tmp/<文件名>,长度不超过 256 字符;也可传入远程 URL
出参:
u: 本地导出返回 0,远程导出返回任务 ID
GetRequestedPublicKeyys获取 Web 登录加密公钥y: 公钥用途,当前支持 web 前端加密公钥:1
出参:
s: 公钥字符串
RecoverAccountyy-根据用户传入 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 属性修改全局策略时,属性间存在联动约束(如 MaxPasswordValidDaysMinPasswordValidDays 差值不大于 10)
  • RecoverAccount 依赖设备中已存在的持久账号备份,且会覆盖目标账号数据;当前未在普通调试环境验证成功恢复场景,不能对业务账号直接执行

调试示例

命令行调试
bash
# 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,提供九大权限的管理与自定义角色的新增删除。

bash
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
SetRolePrivilegeyb-设置角色权限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 未开启先开启扩展自定义角色功能
-操作成功NANA

应用场景

  • 新建扩展自定义角色(CustomRole5~16)并配置其权限
  • 为用户分配角色实现最小权限管理
  • 角色权限调整(如临时关闭某用户组的部分权限)

限制条件

  • NewDelete 仅支持 CustomRole5~16(ID 9~20);CustomRole1~4 与内置角色不能通过这两个方法新增或删除
  • 调试前需开启 ExtendedCustomRoleEnabled;结束后应恢复其原始值
  • UserMgmt、ReadOnly、ConfigureSelf 是不可修改的权限类型
  • Name/RolePrivilege 为只读属性,角色名称不可修改

调试示例

命令行调试
bash
# 前置:记录并开启扩展自定义角色功能;完成调试后,将该属性恢复为记录的原始值。
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/时间三个维度的登录限制(仅属性,无方法)。

bash
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
废弃状态正常可用
属性参数说明
属性名类型默认值描述取值范围
EnabledBooleanfalse登录规则使能状态true/false
IpRuleString空字符串IP 登录规则IPv4/IPv6 地址,或带掩码的地址;IPv4 掩码范围 1~32,IPv6 掩码范围 1~128
MacRuleString空字符串MAC 地址登录规则XX:XX:XX:XX:XX:XX 或三段前缀 XX:XX:XX,每段为两位十六进制数
TimeRuleString空字符串时间登录规则HH:MM/HH:MMYYYY-MM-DD/YYYY-MM-DDYYYY-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 中的准确名称
-操作成功NANA

应用场景

  • 限制某类用户仅在办公网段、特定时间段内允许登录
  • 绑定规则到用户实现细粒度登录准入

限制条件

  • Rule 是纯属性对象,没有业务方法;属性写入需要 SecurityMgmt 权限
  • 固定提供规则 ID 1~3;调试时应记录并恢复被修改规则的原始值
  • 启用带限制条件的规则可能影响后续登录;建议先保持 Enabled=false 完成格式验证

调试示例

命令行调试
bash
# 以下以规则 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 团体名与团体登录规则的管理。

bash
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
废弃状态正常可用
方法配置参数
方法名入参类型出参类型描述取值范围
SetRwCommunitys-设置 rw SNMP 团体名s: rw 团体名字符串(空字符串表示删除)
SetRoCommunitys-设置 ro SNMP 团体名s: ro 团体名字符串(空字符串表示删除)
GetSnmpCommunity-ss获取 snmp 团体名出参:
s: rw 团体名
s: ro 团体名
SetSnmpCommunityLoginRuleas-设置 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 回调当前版本不可使用该接口;需服务端补充实现后再调用
-操作成功NANA

应用场景

  • 配置 SNMP 读写团体名(ro/rw)
  • 在 SNMP 客户端与设备侧保持团体名一致

限制条件

  • ro 与 rw 团体名不能相同;空字符串表示删除对应团体名
  • 团体名不允许包含空格,长度受 SNMP 配置约束
  • 调试前必须读取并记录原始团体名;团体名属于敏感凭据,日志和文档中应脱敏
  • SetSnmpCommunityLoginRule 在当前服务中未实现,不能作为可用 API 示例

调试示例

命令行调试
bash
# 先读取并记录当前 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)认证。

bash
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
废弃状态正常可用
方法配置参数
方法名入参类型出参类型描述取值范围
LocalAuthenticatesaya{sb}a{ss}本地用户认证s: 用户名,1~32 字符
ay: 密码字节数组
a{sb}: 扩展配置字典(IsAuthPassword / TestPassword / IpmiLocalAuth / RecordOnly / RecordLoginInfo / UpdateActiveTime 等开关)
出参:
a{ss}: 账户信息
VncAuthenticatessa{ss}VNC 用户认证s: 密文
s: 挑战码
出参:
a{ss}: 账户信息
GenRmcp20CodeysuuayayayysayayayIPMI 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 认证码
GenRmcp15CodeyayyuuayIPMI 1.5 版本用户认证y: 加密算法
ay: 有效负载,1~255 字节
y: 用户 ID
u: 会话 ID
u: RMCP 会话的序列号
出参:
ay: 认证码

返回值与异常

返回值类型含义触发条件处理建议
AuthorizationFailed认证失败用户不存在、密码错误、账号被禁用、接口未开放或登录规则不通过检查账号、密码和接口配置
UserLocked认证失败用户被手动锁定解锁用户后重试
NoAccess本地认证失败角色为 NoAccess调整用户角色
AuthorizationUserRestrictedVNC 认证失败命中登录规则限制检查 VNC 用户的登录规则
-认证成功返回账户信息NANA

应用场景

  • 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 账号验证前三个方法,完成后删除该账号

调试示例

命令行调试
bash
# 前置:创建一个临时 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 等)的密码与账户策略。

bash
NAME                                TYPE      SIGNATURE             RESULT/VALUE           FLAGS
Policy                             property  u                     -                      -
.Pattern                           property  s                     -                      -
.MaxPasswordLength                 property  u                     -                      -
.AccountType                       property  s                     -                      -

功能说明

PasswordPolicy 按账户类型配置密码校验策略(Policy 位图:bit0 默认开关、bit1 指定开关)、密码正则 Pattern、最大密码长度 MaxPasswordLengthAccountPolicy 按账户类型配置用户名正则 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)Booleanfalse标识某类型用户前端是否呈现true/false
Deletable(AccountPolicy)Booleanfalse标识某类型用户是否可删除true/false
OnlineDeletable(AccountPolicy)Booleantrue标识在线用户是否可删除true/false

返回值与异常

返回值类型含义触发条件处理建议
kepler.account.ValueOutOfRange设置策略失败策略值/正则非法使用合法取值
kepler.account.PasswordPatternInvalid设置失败正则表达式非法检查正则语法
-操作成功NANA

应用场景

  • 按账户类型差异化配置密码复杂度与用户名规则
  • IPMI 侧同步设置密码规则(SetPasswordRulePolicy)

限制条件

  • 策略按 AccountType 区分,不同账户类型独立配置
  • 该对象仅属性,通过 Set 操作生效,设置成功会打印对应操作日志(PasswordPolicy/PasswordPattern/MaxPasswordLength/NamePatternChange 等)

调试示例

命令行调试
bash
# 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 Access0x06 / 0x44获取用户通道权限UserMgmt
Set User Access0x06 / 0x43设置指定用户的通道访问权限UserMgmt
Get User Name0x06 / 0x46获取用户名UserMgmt
Set User Name0x06 / 0x45设置指定用户的用户名UserMgmt
Get User Password Complexity0x30 / 0x93(Sel 0x21)获取密码复杂度检查开关ReadOnly
Get SNMP Configuration0x30 / 0x93(Sel 0x75)获取 SNMP 配置UserMgmt
Get Account Interface0x30 / 0x93(Sel 0x79)获取用户登录接口UserMgmt
Set User Interface0x30 / 0x93(Sel 0x68)设置指定用户的登录接口UserMgmt
Set Account Password0x06 / 0x47(操作 0x02)设置指定用户的密码ConfigureSelf
Disable Account0x06 / 0x47(操作 0x00)禁用指定用户ConfigureSelf
Enable Account0x06 / 0x47(操作 0x01)启用指定用户ConfigureSelf
Get User Password Compare Info0x30 / 0x93(Sel 0x5B-30)获取用户名密码前缀比对配置ReadOnly
Get WeakPwdDictionaryEnabled0x30 / 0x93(Sel 0x76-01)查询弱口令字典使能状态UserMgmt
Get FirstLoginModifyPolicy0x30 / 0x93(Sel 0x76-02)查询首次登录改密策略UserMgmt
Get HistoryPwdCheckCount0x30 / 0x93(Sel 0x76-03)查询历史密码检查数UserMgmt
Get EmergencyLoginAccount0x30 / 0x93(Sel 0x76-05)查询逃生用户配置UserMgmt
Get InitialPasswordPromptEnable0x30 / 0x93(Sel 0x76-06)查询初始密码提示开关UserMgmt
Get PasswordRulePolicy0x30 / 0x93(Sel 0x76-07)查询密码校验策略SecurityMgmt
Get PasswordPattern0x30 / 0x93(Sel 0x76-08)查询密码正则配置SecurityMgmt

调试示例

以下示例命令将 <IP> 及各命令注明的 IPMI 用户名、密码替换为目标环境的实际值;用户 ID、通道号及响应数据会随设备配置而变化。ipmitool raw 成功时仅输出响应数据,不额外显示 Completion Code 0x00

bash
# 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

bash
# 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

bash
# 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

bash
# 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

bash
# 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

bash
# 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

bash
# 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

bash
# 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

bash
# 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

bash
# 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

bash
# 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

bash
# 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

bash
# 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

bash
# 创建临时账号。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

bash
# 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

bash
# 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

响应示例:设置成功时无输出;回读结果为四字节用户访问配置。

bash
# 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

bash
# 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

响应示例:成功时无输出。

bash
# 18. Disable Account:禁用临时账号 ID 8。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x47 0x08 0x00

响应示例:成功时无输出。

bash
# 19. Enable Account:重新启用临时账号 ID 8。
ipmitool -H <IP> -I lanplus \
-U <IPMI管理员用户> -P '<IPMI管理员密码>' \
-C 17 raw 0x06 0x47 0x08 0x01

响应示例:成功时无输出。

bash
# 清理:删除临时账号 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密码与历史密码相同新密码命中历史密码更换新密码
0x94IPMI 密码为空未设置或传入空 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定义定制项名称及 importexport、可选 import_convertdeps 回调只有登记在该表中的普通定制项才会进入导入流程
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 实现。它说明了一个需要依赖另一个定制项的扩展应如何登记;该代码不是一个需要重复新增的功能。

lua
-- 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,
},

对应的业务实现将值写入账户服务并发送配置变更信号:

lua
-- 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

新增定制项时,按以下步骤实施:

  1. custom_settings_adapter 添加唯一键,提供成对的 import/export 回调;输入格式与内部值不一致时再提供 import_convert
  2. 在对应的 customization 模块实现业务设置和读取;若值会映射为资源树属性,设置后发送与该属性对应的配置变更信号。
  3. 存在前置开关或顺序要求时声明 deps;不要依赖 Lua 表遍历顺序。
  4. 在定制化 JSON 的 ConfigData.CustomSettings 中填写该项后,经配置管理框架以 custom 类型导入。
  5. 为导入和导出补充单元测试。现有 test/unit/test_customization.lua 使用 test_data/config_customization.json 导入上述两个定制项,并断言首次登录提示和首次登录改密均为 true,可作为测试结构参考。

验证命令:

bash
# 在 account 仓库根目录执行定制化单元测试集合
bingo test -ut

预期:TestAccount:test_custom_settings 导入示例定制配置后通过;新增项应补充同类断言,并验证导出值能够再次被导入。

注意事项:

  • 定制化会改变设备全局账号策略,应在隔离环境验证并准备恢复配置;不要直接修改账号持久化文件或数据库。
  • BMCSet_InitialPwdPrompt 依赖 BMCSet_InitialPasswordNeedModify 是实际代码中的依赖关系;新增依赖必须显式声明。
  • BMCSet_OEMNameNN 会按实现将序号映射到扩展账号 ID;不要把这一特殊命名规则套用到普通定制项。
  • 密码规则定制项会影响新建账号、改密和 SNMP/VNC 密码设置,应回归相关接口用例。

4. 日志说明

4.1 一键日志收集

文件路径内容说明
/var/log/app.logaccount 组件运行日志,包括服务初始化、参数校验、资源树操作和文件传输任务失败等;使用 account 关键字筛选。
/var/log/operation.logaccount 操作日志,包括新建/删除账号、改密、导入或导出弱口令字典、设置 SNMP 团体名和角色操作等的成功或失败。
/var/log/framework.logaccount 服务启动、退出和框架异常等日志。

上述三个文件是平台一键日志收集的标准日志项。account 通过 mc.logginglogging:operation() 和 IPMI 操作日志接口写入相应日志通道;日志文件的轮转和最终收集路径由平台日志框架维护。

此外,若转储框架调用 interface/dump.lua:log_dump(),会在框架传入的合法目录生成 account_info.txt。其当前实现仅写入标题 account information:,不导出账号列表、密码、密钥或完整账号快照,不能作为账号数据恢复文件。

4.2 关键日志信息

关键字或日志模板产生位置含义与下一步
account class init start / account class init endaccount_app.lua:init()判断 account 初始化是否进入和结束;若没有结束日志,继续查看同一时段的错误和框架堆栈
Import type(%s) is invalidconfig_handle.lua:on_import()配置导入类型不是 customconfiguration;修正配置管理调用方的类型
Import data is nil / No ConfigData in config.jsonconfig_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 faileddump.lua:log_dump()转储框架传入的目录非法,或 account_info.txt 无法创建;归集转储框架日志与目标目录权限信息

5. 问题定界指南

5.1 典型问题定界

现象是否优先归 account源码依据首要证据和处理方向
账号、角色、登录规则、SNMP 团体名或账户策略的 D-Bus 调用返回 account 业务错误account_app.lua:register_rpc_methods() 将这些资源树方法绑定到 account 领域服务收集请求、完整错误对象、account 应用日志和操作日志;按第 2 章确认对象路径、接口和入参
ImportWeakPasswordDictionaryExportWeakPasswordDictionary 返回 InvalidPathaccount_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 服务、对象路径和运行时暴露的方法:

bash
# 查看 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 章已验证的命令,遵循以下顺序:

  1. 记录修改前的属性或资源值;账号和角色操作使用唯一的临时名称、未占用 ID。
  2. 执行一个方法调用并保留完整响应;不要在工单、文档或日志中粘贴密码、私钥、SNMP Ku 等敏感值。
  3. 通过读取属性、查询返回值或删除临时资源确认结果。
  4. 无论成功或失败都恢复原属性,删除临时账号和临时角色。
  5. 从一键收集产物中摘取同一时间窗口的 account 应用日志、操作日志和框架日志;远程字典传输还应附带 file_transfer 证据。

5.3 调试方法

开启调试日志

bash
# 开启 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 需要目标平台授予相应日志文件读取权限。普通管理用户无法读取时,应使用具备维护权限的调试环境,或通过系统一键日志收集获取日志。

复现问题方法

  1. 先执行本节的只读 tree/introspect 命令,确认服务、对象路径和接口已注册。
  2. 仅使用第 2 章中已验证的命令复现一个最小操作;写操作使用临时账号、临时角色或已备份的属性值。
  3. 保留命令、完整响应和同一时间窗口内的 /var/log/app.log/var/log/operation.log/var/log/framework.log 中 account 相关记录。
  4. 操作完成后恢复属性并清理临时资源;远程弱口令字典传输失败时,补充 file_transfer 任务和日志证据。

5.4 错误对象解读

account 的 D-Bus 调用失败通常以结构化错误对象返回。优先记录 nameparams,而不是只记录显示文案。

错误名可由当前源码确认的触发条件处理建议
InvalidPath弱口令字典导入/导出的路径不满足校验;错误中会脱敏路径改用支持的远程 URL 或临时目录中的本地路径
OperationInProcess正在导入或导出弱口令字典时再次启动该类操作等待已有任务结束后重试
SameROCommunityName设置只读团体名时与现有读写团体名相同为只读团体名使用不同值,或先修改/清空读写团体名
SameRWCommunityName设置读写团体名时与现有只读团体名相同为读写团体名使用不同值,或先修改/清空只读团体名

除上述名称外,应以 mds/errors.json、运行时错误对象和对应实现分支共同判断,避免仅凭 IPMI Completion Code 或界面提示推断根因。

6. 常见问题解答

Q1:弱口令字典导入或导出返回 InvalidPath

  • 问题描述

调用 ImportWeakPasswordDictionaryExportWeakPasswordDictionary 后返回 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()SetAuthenticationProtocolSetEncryptionProtocolGetSnmpKeys 的回调中,从 /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() 只绑定了 SetRoCommunitySetRwCommunityGetSnmpCommunity,未绑定 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 及以上