Skip to content

OpenBMC 安全子系统深度分析

概述

OpenBMC(Open Baseboard Management Controller)是一种基于 Linux 的开源 BMC 固件栈,广泛应用于数据中心服务器、交换机和存储系统的管理。OpenBMC 安全子系统是整个栈的核心组成部分,负责系统身份认证、数据加密、访问控制和完整性验证等关键安全功能。

本文档深入分析 OpenBMC 安全子系统的六大核心组件:证书管理(phosphor-certificate-manager)、加密库(phosphor-cryptolib)、用户管理(phosphor-user-manager)、单用户模式(phosphor-single-root)、SSH 密钥管理以及安全启动(Secure Boot)机制。

1. phosphor-certificate-manager - X.509 证书管理

1.1 项目概述

phosphor-certificate-manager 是 OpenBMC 项目中负责 X.509 数字证书管理的核心组件。它允许系统管理员用 CA 签名的正式证书替换预置的自签名证书,支持服务器证书、客户端证书和 CA 证书三种类型。该组件通过 D-Bus 接口向上层应用提供服务,是 bmcweb 等 Web 服务实现 HTTPS 和 LDAPS 的基础设施。

1.2 目录结构

phosphor-certificate-manager/
├── bmc-vmi-ca/              # BMC VMI CA 证书相关文件
├── dist/                    # 分发文件
├── subprojects/             # 子项目依赖
├── test/                    # 测试文件
├── argument.cpp/hpp         # 命令行参数解析
├── certificate.cpp/hpp      # 证书处理核心逻辑
├── certs_manager.cpp/hpp    # 证书管理器实现
├── csr.cpp/hpp              # CSR(证书签名请求)处理
├── mainapp.cpp              # 主应用程序入口
├── watch.cpp/hpp            # 文件监控功能
├── x509_utils.cpp/hpp       # X.509 工具函数
├── meson.build              # Meson 构建配置
└── meson.options            # 构建选项

1.3 D-Bus 接口规范

phosphor-certificate-manager 使用标准化的 D-Bus 接口命名约定:

服务名称格式

xyz.openbmc_project.Certs.Manager.{Type}.{Endpoint}

对象路径格式

/xyz/openbmc_project/certs/{type}/{endpoint}

示例配置

证书类型服务名称对象路径用途
服务器证书xyz.openbmc_project.Certs.Manager.Server.Https/xyz/openbmc_project/certs/server/httpsHTTPS Web 服务
客户端证书xyz.openbmc_project.Certs.Manager.Client.Ldap/xyz/openbmc_project/certs/client/ldapLDAP 认证
CA 证书xyz.openbmc_project.Certs.Manager.Authority.Truststore/xyz/openbmc_project/certs/authority/truststore信任链验证

1.4 核心组件详解

X.509 工具模块(x509_utils.cpp/hpp)

该模块封装了 OpenSSL 的 X.509 证书操作接口,提供以下核心功能:

  • 证书解析:从 PEM 或 DER 格式文件加载 X.509 证书
  • 证书验证:验证证书签名、有效期和证书链
  • 私钥管理:加载和解析 RSA/EC 私钥文件
  • 格式转换:支持 PEM 和 DER 格式的相互转换
  • 指纹提取:计算证书的 SHA-1/SHA-256 指纹

证书管理模块(certs_manager.cpp/hpp)

证书管理器是整个组件的核心,协调证书的存储、验证和部署:

cpp
// 核心类接口示意
class CertsManager {
public:
    // 安装证书到指定路径
    int installCertificate(CertType type, const std::string& path);

    // 触发 systemd 服务重载
    int reloadServices(const std::string& unit);

    // 验证证书完整性
    bool validateCertificate(const std::string& certPath);

    // 获取证书信息
    CertificateInfo getCertificateInfo(const std::string& objectPath);
};

文件监控模块(watch.cpp/hpp)

使用 inotify(或类似机制)监控证书目录,当检测到文件变化时自动触发服务重载:

  • 监控 /etc/ssl/certs/ 目录下的证书文件变化
  • 检测到变更后通过 D-Bus 事件通知上层应用
  • 可选触发指定 systemd 单元重载(如 bmcweb.service)

1.5 使用示例

HTTPS 服务器证书安装

bash
./phosphor-certificate-manager \
    --type=server \
    --endpoint=https \
    --path=/etc/ssl/certs/https/server.pem \
    --unit=bmcweb.service

CA 证书(信任链)安装

bash
./phosphor-certificate-manager \
    --type=authority \
    --endpoint=truststore \
    --path=/etc/ssl/certs/authority \
    --unit=bmcweb.service

LDAP 客户端证书安装

bash
./phosphor-certificate-manager \
    --type=client \
    --endpoint=ldap \
    --path=/etc/nslcd/certs/cert.pem

1.6 认证流程

用户/管理员


REST API (通过 bmcweb)


D-Bus 调用


phosphor-certificate-manager

    ├──► x509_utils: 解析并验证证书

    ├──► certs_manager: 存储证书到指定路径

    └──► watch: 触发 systemd 服务重载


         bmcweb 重新加载证书

1.7 安全特性

  • 证书链验证:安装 CA 证书时自动验证其签名有效性
  • 私钥保护:私钥文件权限设置为 600,仅 root 可读
  • D-Bus 授权:所有证书操作需要相应的 D-Bus 权限
  • 自签名证书自动生成:bmcweb 在无有效证书时自动生成自签名证书(见 bmcweb 集成)

2. phosphor-cryptolib - 加密服务

2.1 项目概述

phosphor-cryptolib 是 OpenBMC 的加密算法封装库,基于 OpenSSL 提供统一的加密服务接口。该库封装了对称加密、非对称加密、哈希函数、消息认证码和随机数生成等核心加密功能,为其他安全组件提供一致的加密原语支持。

2.2 核心功能模块

对称加密

  • AES-128/192/256-CBC/GCM:支持块加密和认证加密模式
  • 3DES-CBC:向后兼容的传统加密支持
  • 接口统一为 cipher_* 函数族

非对称加密

  • RSA-2048/4096:密钥生成、加密、解密、签名、验签
  • ECC(椭圆曲线):支持 secp256r1、secp384r1 等曲线
  • ECDH 密钥交换:用于 TLS 握手的密钥协商

哈希与消息认证

  • SHA-256/SHA-384/SHA-512:安全哈希算法
  • HMAC-SHA*:基于哈希的消息认证码
  • CMAC-AES:基于 AES 的消息认证码

密钥派生

  • PBKDF2:基于密码的密钥派生函数
  • HKDF:HMAC 基础的密钥派生函数
  • 支持自定义盐值和迭代次数

2.3 接口设计

phosphor-cryptolib 采用面向对象的 C++ 接口设计,典型用法:

cpp
// 对称加密示例
#include <cryptolib/cipher.hpp>

class AESCipher {
public:
    // 初始化加密器
    int init(const std::vector<uint8_t>& key, const std::vector<uint8_t>& iv);

    // 加密数据
    int encrypt(const uint8_t* plaintext, size_t len,
                uint8_t* ciphertext, size_t* outLen);

    // 解密数据
    int decrypt(const uint8_t* ciphertext, size_t len,
                uint8_t* plaintext, size_t* outLen);
};

// 非对称加密示例
class RSAKey {
public:
    // 生成新密钥对
    int generateKey(size_t bits);

    // 从 PEM 文件加载密钥
    int loadPrivateKey(const std::string& path);

    // RSA 加密
    int encrypt(const uint8_t* input, size_t len, uint8_t* output);

    // RSA 解密
    int decrypt(const uint8_t* input, size_t len, uint8_t* output);
};

2.4 安全特性

  • 内存安全:关键数据使用后自动清零,防止泄漏
  • 错误处理:所有加密操作都有完善的错误码返回
  • 常量时间比较:密钥和 MAC 比较使用常量时间算法
  • 线程安全:全局状态使用互斥锁保护

2.5 构建系统

使用 Meson 构建系统,典型构建流程:

bash
meson setup builddir
ninja -C builddir

依赖项通过 subprojects 管理,通常包括:

  • OpenSSL(加密原语)
  • Boost(辅助功能)
  • 自定义子项目

3. phosphor-user-manager - 用户与权限管理

3.1 项目概述

phosphor-user-manager 是 OpenBMC 系统中负责用户账户管理和认证的核心组件。它提供本地用户账户的 CRUD 操作、LDAP 集成、多因素认证(MFA)支持,并通过 PAM(Pluggable Authentication Modules)框架实现统一的认证接口。

3.2 目录结构

phosphor-user-manager/
├── docs/                           # 文档
├── phosphor-ldap-config/           # LDAP 配置组件
├── subprojects/                    # 子项目依赖
├── test/                           # 测试文件
├── mainapp.cpp                     # 主程序入口
├── user_mgr.cpp/hpp                # 用户管理器
├── users.cpp/hpp                   # 用户实体管理
├── totp.hpp                        # TOTP 实现
├── mfa_pam                         # MFA PAM 模块
├── nslcd                           # LDAP 客户端配置
├── json_serializer.hpp             # JSON 序列化
├── shadowlock.hpp                   # shadow 文件锁
└── meson.build                      # 构建配置

3.3 用户管理架构

用户特权级别

OpenBMC 定义了标准化的用户特权级别,映射到 Redfish 标准:

特权级别数值说明
READONLY1仅可读取状态,不能修改配置
OPERATOR2可操作设备但不能修改用户
ADMIN3完全管理权限
NOACCESS0禁止访问

D-Bus 接口

/xyz/openbmc_project/user/ldap/action/CreateConfig    # 创建 LDAP 配置
/xyz/openbmc_project/user/ldap/config/action/delete  # 删除 LDAP 配置
/xyz/openbmc_project/certs/client/ldap               # LDAP 客户端证书
/xyz/openbmc_project/certs/authority/truststore       # LDAP CA 证书

3.4 PAM 集成

phosphor-user-manager 通过 PAM 实现多种认证方式:

认证流程

认证请求


PAM 框架(/etc/pam.d/openbmc)

    ├──► pam_unix.so     # 本地 /etc/shadow 认证

    ├──► pam_ldap.so     # LDAP 服务器认证

    └──► pam_totp.so     # TOTP 二次认证(可选)

PAM 配置文件结构

pam
# /etc/pam.d/openbmc
auth        required    pam_env.so
auth        required    pam_faildelay.so delay=2000000
auth        [default=1 ignore=ignore success=ok] pam_usertype.so isregular
auth        [default=1 ignore=ignore success=ok] pam_localuser.so
auth        sufficient  pam_unix.so nullok try_first_pass
auth        requisite   pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient  pam_ldap.so use_first_pass
auth        optional    pam_permit.so
auth        required    pam_deny.so

account     required    pam_unix.so
account     sufficient  pam_localuser.so
account     sufficient  pam_ldap.so
account     optional    pam_permit.so

password    requisite   pam_pwquality.so try_first_pass local_users_only
password    sufficient  pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient  pam_ldap.so use_authtok
password    optional    pam_permit.so

3.5 LDAP 集成

LDAP 认证流程

1. 用户提交用户名/密码到 bmcweb REST API
2. bmcweb 通过 D-Bus 调用 phosphor-user-manager
3. phosphor-user-manager 调用 PAM 框架
4. PAM 模块(pam_ldap.so)联系 LDAP 服务器
5. LDAP 服务器验证用户凭据并返回组信息
6. phosphor-user-manager 根据组映射确定特权级别
7. 认证成功,分配相应权限的会话

LDAP 证书配置

LDAPS 连接使用客户端证书和 CA 证书进行双向认证:

bash
# 客户端证书路径
/xyz/openbmc_project/certs/client/ldap

# CA/根证书路径
/xyz/openbmc_project/certs/authority/truststore

3.6 多因素认证(MFA)

TOTP 实现

基于 RFC 6238 的时间同步一次性密码:

cpp
// totp.hpp 核心接口
class TOTP {
public:
    // 生成秘密密钥
    int generateSecret(std::vector<uint8_t>& secret);

    // 根据密钥生成当前 TOTP
    int generateTOTP(const std::vector<uint8_t>& secret,
                      uint32_t& code);

    // 验证 TOTP 码
    bool verifyTOTP(const std::vector<uint8_t>& secret,
                    uint32_t code,
                    uint32_t window = 1);

    // 获取密钥 URI(用于 QR 码)
    std::string getUri(const std::string& account, const std::string& issuer);
};

MFA 认证流程

第一次认证因素:用户名/密码(pam_unix 或 pam_ldap)

         ▼ (成功)
第二次认证因素:TOTP 码(pam_totp)

         ▼ (成功)
认证完成,分配会话

3.7 影子密码管理

shadowlock.hpp 提供了对 /etc/shadow 文件的安全访问控制:

cpp
class ShadowLock {
public:
    // 获取文件锁(防止竞争条件)
    int lock();

    // 释放文件锁
    int unlock();

    // 读取加密的密码哈希
    std::string getPasswordHash(const std::string& username);

    // 更新密码哈希
    int setPasswordHash(const std::string& username,
                        const std::string& hash);
};

4. phosphor-single-root - 单用户模式

4.1 功能概述

phosphor-single-root 是 OpenBMC 提供的单用户模式管理组件,用于在紧急情况下(如忘记管理员密码)获取系统控制权。该组件实现了一个受控的单用户模式启动流程,确保只有物理访问 BMC 控制台的用户才能进入单用户模式。

4.2 安全机制

访问控制

  • 需要物理访问 BMC 串口控制台或 IPMI SOL
  • 需要按下 BMC 复位按钮触发引导加载
  • 单用户模式 shell 继承 root 权限

启动流程

BMC 复位/重启


GRUB/bootloader 菜单

    ▼ 选择 "OpenBMC Single User Mode"


内核启动,单用户模式


emergency.service 启动 shell

4.3 密码重置流程

在单用户模式下重置管理员密码:

bash
# 1. 进入单用户 shell
passwd root
# 输入新密码

# 2. 或者通过 ipmitool(如果可用)
ipmitool user set password 2 "new_password"

5. SSH 密钥管理

5.1 authorized_keys 管理

OpenBMC 通过 phosphor-user-manager 管理 SSH 公钥认证:

D-Bus 接口

/xyz/openbmc_project/user/root/action/CreateSSHKey    # 创建 SSH 公钥
/xyz/openbmc_project/user/{username}/sshkeys         # 用户 SSH 密钥对象

SSH 密钥存储

SSH 公钥存储在 /home/{username}/.ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDT... user@host
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... another@host

密钥管理流程

REST API: POST /redfish/v1/AccountService/Accounts/{id}/SSHKey


bmcweb D-Bus 调用


phosphor-user-manager


写入 authorized_keys 文件


设置正确文件权限(600)

5.2 SSH 安全配置

OpenBMC 典型的 SSH 配置(/etc/ssh/sshd_config):

# 禁止密码认证(强制公钥认证)
PasswordAuthentication no

# 禁止 root 登录
PermitRootLogin no

# 限制空闲超时
ClientAliveInterval 300
ClientAliveCountMax 2

# 使用安全的加密算法
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com
KexAlgorithms curve25519-sha256

6. Secure Boot - 安全启动

6.1 OpenBMC 安全启动架构

OpenBMC 使用 UEFI Secure Boot 机制确保系统启动过程的完整性:

启动链

ROM Bootloader

    ▼ (验证签名)
UEFI Bootloader (如 u-boot)

    ▼ (验证签名)
Linux Kernel + initramfs

    ▼ (验证签名)
OpenBMC 用户空间

6.2 签名验证

内核签名验证

┌─────────────────────────────────────┐
│         UEFI Secure Boot            │
│                                     │
│  DB (Authorized Signatures)         │
│    │                                │
│    ▼                                │
│  shim.efi (验证 kernel 签名)        │
│                                     │
└─────────────────────────────────────┘

模块签名

内核模块必须经过签名才能在启用 Secure Boot 的系统上加载:

bash
# 签名内核模块
sign-file -s <signature> <hash_algo> <module> <key>

# 常用算法
# <hash_algo>: sha256, sha384, sha512

6.3 ima-evm - 完整性度量架构

OpenBMC 支持 IMA(Integrity Measurement Architecture)和 EVM(Extended Verification Module):

工作原理

运行时文件访问


IMA 测量文件哈希


IMA 扩展存储(extend PCR)


EVM 验证文件属性(security.selinux, security.ima 等)

PCR(Platform Configuration Registers)

IMA/EVM 使用 TPM PCR 存储度量值:

PCR用途
PCR 0BIOS/UEFI 度量
PCR 1BIOS/UEFI 配置
PCR 2引导加载器度量
PCR 3引导加载器配置
PCR 4主内核度量
PCR 5主内核配置
PCR 6状态转换
PCR 7Secure Boot 状态
PCR 10IMA 度量

7. 安全子系统集成

7.1 整体架构图

┌─────────────────────────────────────────────────────────────┐
│                    OpenBMC 安全子系统                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────┐    ┌─────────────────┐                │
│  │   bmcweb        │    │   IPMI/SOL      │                │
│  │   (REST API)    │    │   (KCS 接口)    │                │
│  └────────┬────────┘    └────────┬────────┘                │
│           │                      │                          │
│           ▼                      ▼                          │
│  ┌─────────────────────────────────────────┐                │
│  │         phosphor-user-manager           │                │
│  │  ┌───────────┐  ┌───────────┐           │                │
│  │  │ PAM 框架   │  │ D-Bus API │           │                │
│  │  └───────────┘  └───────────┘           │                │
│  │  ┌───────────┐  ┌───────────┐           │                │
│  │  │ LDAP 客户端│  │ TOTP MFA  │           │                │
│  │  └───────────┘  └───────────┘           │                │
│  └────────────────────┬────────────────────┘                │
│                       │                                      │
│  ┌────────────────────▼────────────────────┐                │
│  │      phosphor-certificate-manager        │                │
│  │  ┌───────────┐  ┌───────────┐           │                │
│  │  │ X.509     │  │ CSR 生成   │           │                │
│  │  │ 证书管理   │  │ 服务重载   │           │                │
│  │  └───────────┘  └───────────┘           │                │
│  └────────────────────┬────────────────────┘                │
│                       │                                      │
│  ┌────────────────────▼────────────────────┐                │
│  │         phosphor-cryptolib               │                │
│  │  ┌───────────┐  ┌───────────┐           │                │
│  │  │ OpenSSL   │  │ 密钥派生   │           │                │
│  │  │ 封装       │  │ 函数       │           │                │
│  │  └───────────┘  └───────────┘           │                │
│  └─────────────────────────────────────────┘                │
│                                                             │
│  ┌─────────────────────────────────────────┐                │
│  │            底层安全机制                    │                │
│  │  ┌───────────┐  ┌───────────┐           │                │
│  │  │ TPM 2.0   │  │ Secure    │           │                │
│  │  │ 密钥存储   │  │ Boot      │           │                │
│  │  └───────────┘  └───────────┘           │                │
│  │  ┌───────────┐  ┌───────────┐           │                │
│  │  │ IMA/EVM   │  │ 强制访问   │           │                │
│  │  │ 完整性度量 │  │ 控制       │           │                │
│  │  └───────────┘  └───────────┘           │                │
│  └─────────────────────────────────────────┘                │
└─────────────────────────────────────────────────────────────┘

7.2 认证流程详解

用户登录流程

1. 用户提交认证请求


2. bmcweb 接收 REST API 请求


3. 解析认证方式(Basic/Bearer Cookie/XToken)


4. 调用 phosphor-user-manager D-Bus 接口


5. PAM 模块执行认证

   ├──► 本地用户:pam_unix → /etc/shadow

   └──► LDAP 用户:pam_ldap → LDAP 服务器

   ▼ (如果启用 MFA)
6. TOTP 验证(pam_totp)


7. 会话创建,返回认证令牌

HTTPS/TLS 证书流程

1. 管理员上传 CA 签名证书


2. phosphor-certificate-manager 接收


3. x509_utils 验证证书有效性

   ├──► 格式检查(ASN.1 结构)

   ├──► 签名验证(CA 证书链)

   └──► 有效期检查


4. 存储证书到指定路径


5. 触发 bmcweb.service 重载


6. bmcweb 重新加载证书


7. 新连接使用更新后的证书

8. 知识点关联表格

组件源码位置核心文件关键接口依赖项安全功能
phosphor-certificate-manager/phosphor-certificate-managerx509_utils.cpp, certs_manager.cppD-Bus: xyz.openbmc_project.Certs.Manager.*OpenSSLX.509 证书管理、TLS/SSL 支持
phosphor-cryptolib/phosphor-cryptolibcipher.hpp, rsa.hppC++ 类接口OpenSSL, Boost对称/非对称加密、哈希、密钥派生
phosphor-user-manager/phosphor-user-manageruser_mgr.cpp, users.cpp, totp.hppD-Bus: /xyz/openbmc_project/user/*PAM, OpenLDAP用户认证、权限管理、MFA
phosphor-single-root/phosphor-single-rootmainapp.cpp单用户 shellsystemd紧急恢复、密码重置
SSH 密钥管理bmcweb 集成user_mgr.cppREST: /redfish/v1/AccountServiceOpenSSH公钥认证、authorized_keys
Secure Boot内核/UEFIboot chainUEFI DB, IMA/EVMTPM 2.0签名验证、完整性度量

关联分析

phosphor-cryptolib(底层加密原语)

        │ 被调用

┌───────┴───────────────────────────────────┐
│                                         │
phosphor-certificate-manager          phosphor-user-manager
(证书管理)                            (用户管理)
        │                                 │
        │                                 │
        ▼                                 ▼
    bmcweb ◄────────────────────────► PAM
    (REST/HTTPS)                      (认证)
        │                                 │
        └─────────────┬───────────────────┘


              OpenBMC 整体安全架构


              Secure Boot / IMA-EVM
              (完整性保证)

技术栈总结

层级组件技术选型说明
应用层bmcwebC++11, Boost BeastREST API 服务器,HTTPS 支持
服务层phosphor-user-managerC++, D-Bus用户管理、PAM 集成
服务层phosphor-certificate-managerC++, D-Bus证书生命周期管理
库层phosphor-cryptolibC++, OpenSSL加密原语封装
认证模块PAMLinux-PAM可插拔认证框架
目录服务nslcdOpenLDAPLDAP 命名服务客户端
协议层TLS/SSLOpenSSL传输层加密
完整性IMA/EVMLinux Kernel文件完整性度量
启动安全Secure BootUEFI启动链签名验证
硬件安全TPM 2.0F/W密钥存储、PCR 度量

总结

OpenBMC 安全子系统通过分层架构实现了完整的安全防护体系:

  1. 认证层:phosphor-user-manager 结合 PAM 框架支持本地认证、LDAP 认证和多因素认证
  2. 加密层:phosphor-cryptolib 封装 OpenSSL 提供统一的加密服务
  3. 证书层:phosphor-certificate-manager 实现 X.509 证书的完整生命周期管理
  4. 访问控制:基于 Redfish 标准的特权级别模型实现细粒度授权
  5. 完整性保证:Secure Boot + IMA/EVM 确保从启动到运行时的完整可信
  6. 恢复机制:phosphor-single-root 提供受控的紧急恢复通道

这套安全体系遵循纵深防御原则,各组件职责清晰、接口明确,既能独立运作又能协同配合,为 OpenBMC 系统提供了企业级的安全保障能力。

基于 VitePress 构建