安全启动
一、安全启动链
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. 概念
- 块级 hash 树
- 内核启动时验证
- 只读保护
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(可信执行环境)
- ARM TrustZone(OP-TEE)
- 私钥存于 TEE 内部
- 普通世界(Linux)不能读取
firmware {
optee {
compatible = "linaro,optee-tz";
method = "smc";
};
};
七、安全相关工具
- OP-TEE:开源 TEE
- TrustZone:ARM 硬件
- Keylime:远程证明
- IMA(Integrity Measurement Architecture):内核完整性
- EVM(Extended Verification Module):文件属性保护
- DM-Verity:rootfs 完整性
- LUKS / dm-crypt:磁盘加密
- SELinux / AppArmor:访问控制
八、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