防火墙(黑白名单)

概述

防火墙模块为 ipmi_mgmt 提供 IPMI 命令访问控制能力,包含两类互补机制:

  • 标准 Firmware Firewall(std_firewall_mgr):基于 IPMI 规范 App 命令(0x06/0x09~0x61),按通道与 SHM 路由表管理命令使能/禁用
  • 自定义黑白名单(bw_list_mgr):基于 OEM 命令(0x30/0x93 子命令 0x3F~0x4C)及 D-Bus 接口,维护运行时黑白名单策略

运行时拦截由传输层 firewall_filter 完成,位于过滤器链首位。策略语义见 filters.md。

IPMI 命令字段说明见 IPMI 命令介绍。


总体架构

┌──────────────────────────────────────────────────────────────────┐
│                     管理面(配置 / 查询)                          │
│  IPMI App 0x06/0x09~0x61  │  OEM 0x30/0x93/3F~4C  │  D-Bus RPC   │
│  std_firewall_mgr         │  bw_list_mgr           │ firewall_iface│
└───────────────┬──────────────────────────┬─────────────────────────┘
                │                          │
                ▼                          ▼
┌──────────────────────────────────────────────────────────────────┐
│              shm_bw_list(共享内存 _ipmi_cmd_list)                 │
│  bw_mode │ default_blacklist │ default_whitelist                   │
│          │ custom_blacklist  │ custom_whitelist                    │
└───────────────────────────────┬──────────────────────────────────┘
                                │
                                ▼
┌──────────────────────────────────────────────────────────────────┐
│                   firewall_filter(传输层)                        │
│  默认黑 → 模式关闭放行 → BIOS POST 未完成放行 → 默认白 → 自定义策略  │
└──────────────────────────────────────────────────────────────────┘
模块 职责
std_firewall_mgr 从 SHM 路由表枚举 NetFn/Cmd,读写命令使能掩码,联动自定义黑白名单
bw_list_mgr 自定义黑白名单增删查、防火墙模式切换、同步 DB 对象
shm_bw_list 共享内存 AVL 树存储与检索
firewall_filter 按条目匹配拦截未授权命令(Completion Code 0xD4)

防火墙模式

值 名称 说明
0x00 黑名单模式 命中自定义黑名单则拦截,其余放行
0x01 白名单模式 命中自定义白名单则放行,其余拦截
0xFF 关闭 不启用自定义策略(仍受默认黑白名单约束)

状态与模式通过 BWListOpenClose / BWListGetState 或 Firewall.Mode 属性维护。关闭时 State=0,开启时 State=1。


黑白名单条目格式

共享内存条目为定长前缀 + 可选 payload:

netfn(1) + cmd(1) + channel_protocol(1) + datas(0~30)
字段 说明
netfn IPMI NetFn
cmd IPMI 命令字
channel_protocol 通道协议:0x08(BT-15 带内)、0x01(IPMB-1.0 带外)、0xFF(全部通道)
datas 请求 payload 精确匹配数据;空串表示仅匹配 netfn/cmd/协议

持久化到 BlackListDb / WhiteListDb 时,条目格式化为十六进制连字符串(如 06-03-08)。

约束:

  • 自定义条目最多 255 条;单条 datas 最长 30 字节
  • 不允许将 BWListAddDel 自身(0x30/0x93/0x3F)加入名单
  • 白名单模式不对带外生效:channel_protocol 不得为 0xFF 或 0x01

名单类型

类型 存储 来源
default_blacklist SHM CSR RestrictedIPMICmdList(ShiedFlag=0)
default_whitelist SHM CSR RestrictedIPMICmdList(ShiedFlag=1)
custom_blacklist SHM IPMI BWListAddDel、D-Bus add_item、标准防火墙禁用
custom_whitelist SHM 同上(白名单方向)

firewall_filter 检查顺序见 filters.md。标准防火墙 SetCommandEnables 通过向 custom 名单增删条目实现 per-channel 使能。


标准 Firmware Firewall

std_firewall_mgr 面向 NetFn 0x00~0x2F(偶数 NetFn 查询),数据来源于 SHM ipmi_route_table 已注册命令。

通道与协议映射

通道类型 典型 Channel ID 协议 ch_pro
带内(BT/SMS 等) ch_sys 等 0x08(cp_bt_15)
带外(LAN) ch_lan1 / ch_lan2 0x01(cp_ipmb_10)

请求中 ChannelNum=0x0E 表示“当前通道”,由 IPMI 上下文 chan_num 解析。

命令使能逻辑(calc_cmd_enable)

  1. 默认黑名单 → 禁用
  2. 默认白名单 → 启用
  3. 防火墙关闭 → 除 1 外均 启用
  4. 黑名单模式 → 自定义黑名单命中则 禁用
  5. 白名单模式 → 自定义白名单命中则 启用,否则 禁用

SetCommandEnables 掩码位 1 表示启用(从黑名单移除 / 加入白名单),0 表示禁用。掩码中请求启用路由表不存在的命令返回 0x80。


自定义黑白名单管理

bw_list_mgr

能力 说明
set_firewall_mode 更新 SHM bw_mode 与 Firewall.Mode
add_entry / remove_entry 维护 custom 名单并同步 BlackListDb / WhiteListDb
clear_list 清空指定模式 custom 名单
get_entry 按序号查询条目(供 BWListQueryCmd)

OEM 子命令一览

子命令 命令名 功能
0x3F BWListAddDel 增删自定义黑/白名单条目
0x4A BWListOpenClose 开启/关闭防火墙,可选清空 custom 名单
0x4B BWListQueryCmd 按序号查询名单条目
0x4C BWListGetState 查询当前状态与模式

厂商 ID 固定为 0x0007db。详见 IPMI 命令介绍。


对象设计

Firewall

Class Name: Firewall Object Path: /bmc/kepler/IpmiService/Firewall

Property Type Description
Mode uint8 防火墙模式(0x00 黑 / 0x01 白 / 0xFF 关闭)

Methods(bmc.kepler.Firewall)

Method Description
AddItem / DeleteItem 增删自定义黑/白名单条目
Clear 清空指定类型名单
GetList 获取名单列表
AddWhiteList / RemoveWhiteList 批量维护标准白名单项
GetWhiteList 按通道/LUN 查询标准白名单

BlackListDb / WhiteListDb

Object Path Property Description
BlackListDb /bmc/kepler/IpmiService/BlackListDb Items 自定义黑名单持久化
WhiteListDb /bmc/kepler/IpmiService/WhiteListDb Items 自定义白名单持久化

RestrictedIPMICmdList

CSR 下发的系统默认限制命令,on_register 时写入 SHM 默认黑/白名单。属性 ShiedFlag:0 为默认黑名单,1 为默认白名单。


配置导入导出

导入导出(import_export_engine)

{
  "Com": {
    "FireWallMode": {
      "Import": true,
      "Value": 0
    }
  }
}
  • Value:0 黑名单 / 1 白名单 / 255(0xFF)关闭
  • Import=false 时跳过

导出时 Com.FireWallMode 为当前模式值。

装备定制化(customize_engine)

字段 说明
BMCSet_FireWallMode 目标模式
BMCSet_FirewallStatus 0 关闭 / 1 开启;须与 Mode 一致(关闭时 Mode 必须为 0xFF)

相关文件

路径 说明
src/bw_list/std_firewall_mgr.* 标准 Firmware Firewall
src/bw_list/bw_list_mgr.* 自定义名单与模式管理
src/bw_list/shm_bw_list.* 共享内存名单封装
src/bw_list/firewall_obj.* Firewall / DB / CSR 对象
src/mdb_intf/firewall/firewall_iface.* D-Bus RPC 实现
src/ipmi_cmd/cmd_handler.cpp IPMI 命令 handler
src/filters/firewall_filter.h 运行时过滤器
src/config_engine/import_export_engine.cpp 配置导入导出
src/config_engine/customize_engine.cpp 装备定制化
tests/test_firewall/ 开发者测试

参见