安全启动

一、安全启动链

BootROM(不可改,芯片内置)
  ↓ 验证 SPL(签名)
SPL
  ↓ 验证 U-Boot
U-Boot
  ↓ 验证 内核 + DTB + initramfs
Linux 内核
  ↓ 挂载 dm-verity / dm-crypt rootfs
rootfs
  ↓
应用(Selinux/AppArmor 约束)

每一级验证下一级的签名后才执行。

二、签名工具

1. RSA 密钥对

# 一次性
cd certs/
openssl req -new -x509 -newkey rsa:2048 -nodes \
    -keyout my_key.pem -out my_cert.pem \
    -days 36500 -subj "/CN=My Secure Boot/"

# 转换为 DER(部分工具需要)
openssl x509 -in my_cert.pem -outform der -out my_cert.der

2. 内核签名

CONFIG_MODULE_SIG=y
CONFIG_MODULE_SIG_KEY="certs/my_key.pem"
CONFIG_MODULE_SIG_HASH="sha256"
CONFIG_MODULE_SIG_FORCE=y

3. 模块签名

# 内核自动签 / 手动签
kmodsign sha512 my_key.pem my_cert.pem mymodule.ko

4. FIT Image 签名(U-Boot)

configurations {
    default = "conf";
    conf {
        kernel = "kernel";
        fdt = "fdt";
        ramdisk = "ramdisk";
        signature {
            algo = "sha256,rsa2048";
            key-name-hint = "dev";
            sign-images = "kernel", "fdt", "ramdisk";
        };
    };
};
mkimage -f fit.its -K dev.dtb -k keys/ fit.itb

三、安全启动流程(ARM)

// SPL 中
// 1. 从 eMMC 读 U-Boot
// 2. 用根证书验证 U-Boot 的签名
// 3. 验证通过,跳转 U-Boot

// U-Boot 中
// 1. 读 kernel + dtb + initramfs
// 2. 用 U-Boot 内置公钥验证签名
// 3. 验证通过,跳转 kernel

四、dm-verity(rootfs 完整性)

1. 概念

2. 生成

veritysetup format rootfs.ext4 myverity.img \
    --hash sha256 --data-block-size 4096 --hash-block-size 4096

输出:root-hash(hash 树根)

3. 启动参数

root=/dev/dm-0 ro
dm-mod.create="verity,,,rootfs.ext4,myverity.img,root-hash-value 1"

4. 集成到 Buildroot

BR2_PACKAGE_DM_VERITY=y

五、dm-crypt(加密)

# 创建加密盘
cryptsetup luksFormat /dev/sdb1
cryptsetup open /dev/sdb1 my_crypt
mkfs.ext4 /dev/mapper/my_crypt

# 启动参数
root=/dev/mapper/my_crypt
cryptopts=target=my_crypt,source=/dev/sdb1

六、TEE(可信执行环境)

firmware {
    optee {
        compatible = "linaro,optee-tz";
        method = "smc";
    };
};

七、安全相关工具

八、IMA

# 启动参数
ima_tcb ima_policy=appraise_tcb

# 配置 /etc/ima/ima-policy
measure func=BPRM_CHECK
measure func=FILE_MMAP

九、常见安全威胁与对策

威胁 对策
物理读取 Flash 加密存储(dm-crypt)
修改固件 安全启动签名
替换 rootfs dm-verity
中间人(网络) TLS、证书校验
提权 SELinux、capabilities
Rootkit 内核模块签名
时间攻击 Watchdog、安全告警
注入 输入验证、ASLR、栈保护

十、关键内核配置

CONFIG_SECURITY=y
CONFIG_SECURITY_SELINUX=y
CONFIG_DEFAULT_SECURITY_SELINUX=y

CONFIG_ENCRYPTED_KEYS=y
CONFIG_TRUSTED_KEYS=y

CONFIG_INTEGRITY=y
CONFIG_INTEGRITY_SIGNATURE=y
CONFIG_IMA=y

# 启动参数
rodata=o
slab_nomerge
init_on_alloc=1
init_on_free=1
page_alloc.shuffle=1