固件验证了 bootloader → bootloader 验证了内核 → 内核之后谁验证文件?IMA 度量和鉴定文件完整性,dm-verity 保护整个块设备。
一、先看图
flowchart LR
UEFI[UEFI Secure Boot<br/>验证 bootloader] --> BL[bootloader<br/>验证内核]
BL --> KERNEL[内核启动]
KERNEL --> IMA[IMA<br/>度量/鉴定文件]
KERNEL --> DMVERITY[dm-verity<br/>块设备完整性]
IMA --> TPM[TPM PCR<br/>存储度量值]
classDef boot fill:#f0883e22,stroke:#f0883e,color:#adbac7;
classDef runtime fill:#388bfd22,stroke:#388bfd,color:#adbac7;
class UEFI,BL boot
class KERNEL,IMA,DMVERITY,TPM runtime
二、IMA(Integrity Measurement Architecture)
2.1 度量(Measurement)
文件被访问 → 计算 hash → 记录到 IMA 日志 → 扩展到 TPM PCR
cat /sys/kernel/security/ima/ascii_runtime_measurements | head
# 10 hash template filename2.2 鉴定(Appraisal)
文件被访问 → 计算 hash → 与签名/预期值比较 → 不匹配则拒绝
# IMA 策略
echo "appraise func=BPRM_CHECK fowner=0" > /sys/kernel/security/ima/policy2.3 签名
evmctl ima_sign --key /path/to/private_key.pem /usr/bin/my_app签名存储在文件的
xattr(security.ima)中。
三、EVM(Extended Verification Module)
保护文件的安全扩展属性(xattr)不被篡改:
security.ima + security.selinux + security.capability → HMAC/签名
# EVM 状态
cat /sys/kernel/security/evm四、dm-verity
4.1 原理
块设备 → Merkle 树(hash tree)→ root hash
每次读块 → 验证 hash → 不匹配则返回 I/O 错误。
4.2 使用
veritysetup format /dev/sda1 /dev/sda2
# Root hash: abc123...
veritysetup open /dev/sda1 verified /dev/sda2 abc123...
mount /dev/mapper/verified /mnt4.3 应用场景
- Android 系统分区
- Chrome OS rootfs
- 容器镜像
五、fs-verity
文件级别的 verity(不需要块设备层):
fsverity enable /path/to/file
fsverity measure /path/to/file内核在页缓存层验证 → 惰性验证(按需读取时检查)。
六、TPM 与 PCR
PCR(Platform Configuration Register)= 度量值的累加器
PCR_new = Hash(PCR_old || measurement)
TPM 硬件保证 PCR 不可回退 → 远程认证(Remote Attestation)可以验证系统状态。
七、dm-integrity
integritysetup format /dev/sda1
integritysetup open /dev/sda1 integrity_dev每个扇区附加校验码 → 检测静默数据损坏。
可与 dm-crypt 组合 → 加密 + 完整性。
八、完整性链
UEFI Secure Boot
→ bootloader 签名验证
→ 内核签名验证
→ 模块签名验证(J-85)
→ IMA 文件度量/鉴定
→ dm-verity 块设备验证
每一环都必须闭合 → 任何一环缺失都可能被绕过。
九、观察
# IMA 度量日志
cat /sys/kernel/security/ima/ascii_runtime_measurements | wc -l
# dm-verity 状态
dmsetup status | grep verity
# TPM PCR
tpm2_pcrread
# fs-verity
fsverity measure /path/to/file
# EVM 状态
cat /sys/kernel/security/evm十、小结
- IMA = 文件完整性度量和鉴定 → TPM PCR 存储
- EVM = 保护安全 xattr
- dm-verity = 块设备 Merkle 树验证
- fs-verity = 文件级惰性验证
- 完整性链必须从固件到运行时闭合
参考文献
security/integrity/ima/security/integrity/evm/Documentation/admin-guide/device-mapper/verity.rstDocumentation/filesystems/fsverity.rst
工具
evmctlveritysetupfsveritytpm2-tools
上一篇:SELinux 与 AppArmor 下一篇:内核缓解措施
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
EEVDF 调度器:Linux 6.6 为什么换掉了 CFS
Linux 6.6 用 EEVDF 取代了 CFS 的 SCHED_NORMAL 选取逻辑。从 1995 年原始论文的 lag、eligibility、virtual deadline,到 commit 147f3ef 只重写 placement/pick/preempt,再到本机内核 6.6 上读 sched/debug 把每个任务的 vruntime、eligible 标志、deadline 一一对上 vd=ve+r/w,外加 nice 带宽与 base_slice 抢占两组实测,讲清换的是哪一块、延迟敏感任务凭什么先跑。
【操作系统百科】Windows 内核与 Linux 的关键差异
NT Executive/Kernel/HAL 分层、Object Manager 与 handle、IRP 驱动栈、IOCP 完成端口 vs epoll/io_uring、EPROCESS/KTHREAD vs task_struct、Registry vs 文件配置,以及 WSL2 为何选择 Hyper-V 轻量 VM。
【操作系统百科】实时 OS 巡礼
硬实时与软实时的可调度性边界、VxWorks/QNX/Zephyr 机制对照、Linux PREEMPT_RT 与主线合入、DO-178C/ISO 26262 认证语境,以及选型决策树。
【操作系统百科】Unikernel
Unikernel 在云上为什么没成主流?MirageOS、IncludeOS、Unikraft、OSv 的设计取舍——库操作系统、启动时间、工具链、调试困难、POSIX 兼容。