8.5. 启用 IMA 和 EVM
您可以启用并配置完整性测量架构(IMA)和扩展验证模块(EVM)以提高操作系统的安全性。
始终将 EVM 与 IMA 一起启用。
虽然您可以单独启用 EVM,但 EVM 评估仅由 IMA 评估规则触发。因此,EVM 不会保护文件元数据,如 SELinux 属性。如果文件元数据在离线情况下被篡改了,则 EVMVM 只能防止文件元数据被更改。它不会阻止文件访问,如执行文件。
先决条件
安全引导被临时禁用。
注意启用安全引导后,
ima_appraise=fix
内核命令行参数无法正常工作。securityfs
文件系统挂载到/sys/kernel/security/
目录,并且/sys/kernel/security/integrity/ima/
目录存在。您可以使用mount
命令验证securityfs
挂载的位置:mount
# mount ... securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemd
服务管理器打了补丁,以在引导时支持 IMA 和 EVM。使用以下命令验证:grep <options> pattern <files>
# grep <options> pattern <files>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 流程
在 修复 模式下为当前引导条目启用 IMA 和 EVM,并通过添加以下内核命令行参数来允许用户收集和更新 IMA 测量:
grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ima_policy=appraise_tcb ima_appraise=fix evm=fix"
# grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ima_policy=appraise_tcb ima_appraise=fix evm=fix"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令在 fix 模式下为当前引导条目启用 IMA 和 EVM ,来收集并更新 IMA 测量。
ima_policy=appraise_tcb
内核命令行参数确保内核使用默认的可信计算基础(TCB)测量策略和 appraisal 步骤。评估步骤禁止访问之前和当前测量结果不匹配的文件。- 重启以使更改生效。
可选:验证添加到内核命令行中的参数:
cat /proc/cmdline BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-167.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet ima_policy=appraise_tcb ima_appraise=fix evm=fix
# cat /proc/cmdline BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-167.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet ima_policy=appraise_tcb ima_appraise=fix evm=fix
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个内核主密钥来保护 EVM 密钥:
keyctl add user kmk "$(dd if=/dev/urandom bs=1 count=32 2> /dev/null)" @u
# keyctl add user kmk "$(dd if=/dev/urandom bs=1 count=32 2> /dev/null)" @u 748544121
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kmk
完全保留在内核空间内存中。kmk
的 32 字节长值是从/dev/urandom
文件中的随机字节生成的,并放在用户(@u
)密钥环中。密钥序列号位于前面输出的第一行。根据
kmk
创建加密的 EVM 密钥:keyctl add encrypted evm-key "new user:kmk 64" @u
# keyctl add encrypted evm-key "new user:kmk 64" @u 641780271
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令使用
kmk
生成并加密 64 字节长用户密钥(名为evm-key
),并将其放在用户(@u
)密钥环中。密钥序列号位于前面输出的第一行。重要用户密钥必须命名为 evm-key,因为它是 EVM 子系统预期使用的且正在使用的名称。
为导出的密钥创建一个目录。
mkdir -p /etc/keys/
# mkdir -p /etc/keys/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 搜索
kmk
,并将其未加密的值导出到新目录中。keyctl pipe $(keyctl search @u user kmk) > /etc/keys/kmk
# keyctl pipe $(keyctl search @u user kmk) > /etc/keys/kmk
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 搜索
evm-key
,并将其加密值导出到新目录中。keyctl pipe $(keyctl search @u encrypted evm-key) > /etc/keys/evm-key
# keyctl pipe $(keyctl search @u encrypted evm-key) > /etc/keys/evm-key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow evm-key
已在早期由内核主密钥加密。可选:查看新创建的密钥:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:如果密钥从密钥环中删除了,例如在系统重启后,您可以导入已导出的
kmk
和evm-key
,而不是创建新的。导入
kmk
。keyctl add user kmk "$(cat /etc/keys/kmk)" @u 451342217
# keyctl add user kmk "$(cat /etc/keys/kmk)" @u 451342217
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 导入
evm-key
。keyctl add encrypted evm-key "load $(cat /etc/keys/evm-key)" @u 924537557
# keyctl add encrypted evm-key "load $(cat /etc/keys/evm-key)" @u 924537557
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
激活 EVM。
echo 1 > /sys/kernel/security/evm
# echo 1 > /sys/kernel/security/evm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新标记整个系统。
find / -fstype xfs -type f -uid 0 -exec head -n 1 '{}' >/dev/null \;
# find / -fstype xfs -type f -uid 0 -exec head -n 1 '{}' >/dev/null \;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告在不重新标记系统的情况下启用 IMA 和 EVM 可能会导致系统上的大多数文件无法访问。
验证
验证 EVM 是否已被初始化:
dmesg | tail -1
# dmesg | tail -1 […] evm: key initialized
Copy to Clipboard Copied! Toggle word wrap Toggle overflow