常见问题与解决方法
问题1:开启IMA评估enforce模式并配置默认策略后,系统启动失败
原因分析
IMA默认策略可能包含对应用程序执行、内核模块加载等关键文件访问流程的校验,如果关键文件访问失败,可能导致系统无法启动。通常原因有:
- IMA校验证书未导入内核,导致摘要列表无法被正确校验;
- 摘要列表文件未正确签名,导致摘要列表校验失败;
- 摘要列表文件未导入initrd中,导致启动过程无法导入摘要列表;
- 摘要列表文件和应用程序不匹配,导致应用程序匹配已导入的摘要列表失败。
解决方法
用户需要通过log模式进入系统进行问题定位和修复。重启系统,进入grub界面修改启动参数,采用log模式启动:
ima_appraise=log
系统启动后,可参考如下流程进行问题排查:
步骤1: 检查keyring中的IMA证书:
keyctl show %:.builtin_trusted_keys
对于openEuler LTS版本,至少应存在以下几本内核证书(其他未列出版本可根据发布时间前推参考):
版本 | 证书 |
---|---|
openEuler 22.03 LTS | private OBS b25e7f66 |
openEuler 22.03 LTS SP1/2/3 | private OBS b25e7f66 |
openeuler <openeuler@compass-ci.com> b675600b | |
openEuler 22.03 LTS SP4 | private OBS b25e7f66 |
openeuler <openeuler@compass-ci.com> b675600b | |
openeuler <openeuler@compass-ci.com> fb37bc6f | |
openEuler 24.03 | openEuler kernel ICA 1: 90bb67eb4b57eb62bf6f867e4f56bd4e19e7d041 |
如果用户导入了其他内核根证书,也同样需要通过keyctl
命令查询确认证书是否被成功导入。openEuler默认不使用IMA密钥环,如果用户存在使用的情况,则需要通过如下命令查询IMA密钥环中是否存在用户证书:
keyctl show %:.ima
如果排查结果为证书未正确导入,则用户需要根据用户证书导入场景章节进行流程排查。
步骤2: 检查摘要列表携带签名信息:
用户可通过如下命令查询当前系统中的摘要列表文件:
ls /etc/ima/digest_lists | grep '_list-compact-'
对于每个摘要列表文件,需要检查存在以下三种之一的签名信息:
- 检查该摘要列表文件存在对应的RPM摘要列表文件,且RPM摘要列表文件的ima扩展属性中包含签名值。以bash软件包的摘要列表为例,摘要列表文件路径为:
/etc/ima/digest_lists/0-metadata_list-compact-bash-5.1.8-6.oe2203sp1.x86_64
RPM摘要列表路径为:
/etc/ima/digest_lists/0-metadata_list-rpm-bash-5.1.8-6.oe2203sp1.x86_64
检查RPM摘要列表签名,即文件的security.ima
扩展属性不为空:
getfattr -n security.ima /etc/ima/digest_lists/0-metadata_list-rpm-bash-5.1.8-6.oe2203sp1.x86_64
- 检查摘要列表文件的
security.ima
扩展属性不为空:
getfattr -n security.ima /etc/ima/digest_lists/0-metadata_list-compact-bash-5.1.8-6.oe2203sp1.x86_64
- 检查摘要列表文件的末尾包含了签名信息,可通过检查文件内容末尾是否包含
~Module signature appended~
魔鬼字符串进行判断(仅openEuler 24.03 LTS及之后版本支持的签名方式):
tail -c 28 /etc/ima/digest_lists/0-metadata_list-compact-kernel-6.6.0-28.0.0.34.oe2403.x86_64
如果排查结果为摘要列表未包含签名信息,则用户需要根据摘要列表签名机制说明章节进行流程排查。
步骤3: 检查摘要列表的签名信息正确:
在确保摘要列表已携带签名信息的情况下,用户还需要确保摘要列表采用正确的私钥签名,即签名私钥和内核中的证书匹配。除用户自行进行私钥检查外,还可通过dmesg日志或audit日志(默认路径为/var/log/audit/audit.log
)判断是否有签名校验失败的情况发生。典型的日志输出如下:
type=INTEGRITY_DATA msg=audit(1722578008.756:154): pid=3358 uid=0 auid=0 ses=1 subj=unconfined_u:unconfined_r:haikang_t:s0-s0:c0.c1023 op=appraise_data cause=invalid-signature comm="bash" name="/root/0-metadata_list-compact-bash-5.1.8-6.oe2203sp1.x86_64" dev="dm-0" ino=785161 res=0 errno=0UID="root" AUID="root"
如果检查结果为签名信息错误,则用户需要根据摘要列表签名机制说明章节进行流程排查。
步骤4: 检查initrd中是否导入摘要列表文件:
用户需要通过如下命令查询当前initrd中是否存在摘要列表文件:
lsinitrd | grep 'etc/ima/digest_lists'
如果未查询到摘要列表文件,则用户需要重新制作initrd,并再次检查摘要列表导入成功:
dracut -f -e xattr
步骤5: 检查IMA摘要列表和应用程序是否匹配:
参考问题2章节。
问题2:开启IMA评估enforce模式后,部分文件执行失败
原因分析
开启IMA评估enforce模式后,对于配置IMA策略的文件访问,如果文件的内容或扩展属性设置有误(和导入的摘要列表不匹配),则可能会导致文件访问被拒绝。通常原因有:
摘要列表未成功导入(可参考FAQ1);
文件内容或属性被篡改。
解决方法
对于出现文件执行失败的场景,首先需要确定摘要列表文件已经成功导入内核,用户可以检查摘要列表数量判断导入情况:
cat /sys/kernel/security/ima/digests_count
然后用户可通过audit日志(默认路径为/var/log/audit/audit.log
)判断具体哪个文件校验失败以及原因。典型的日志输出如下:
type=INTEGRITY_DATA msg=audit(1722811960.997:2967): pid=7613 uid=0 auid=0 ses=1 subj=unconfined_u:unconfined_r:haikang_t:s0-s0:c0.c1023 op=appraise_data cause=IMA-signature-required comm="bash" name="/root/test" dev="dm-0" ino=814424 res=0 errno=0UID="root" AUID="root"
在确定校验失败的文件后,可对比TLV摘要列表确定文件被篡改的原因。对于未开启扩展属性校验的场景,仅对比文件SHA256哈希值和TLV摘要列表中的IMA digest
项即可,对于开启扩展属性校验的场景,则还需要对比文件当前的属性和TLV摘要列表中显示扩展属性的区别。
在确定问题原因后,可通过还原文件的内容及属性,或对当前文件再次生成摘要列表,签名并导入内核的方式解决问题。
问题3:开启IMA评估模式后,跨openEuler 22.03 LTS SP版本安装软件包时出现报错信息
原因分析
开启IMA评估模式后,当安装不同版本的openEuler 22.03 LTS的软件包时,会自动触发IMA摘要列表的导入。其中包含对摘要列表的签名验证流程,即使用内核中的证书验证摘要列表的签名。由于openEuler在演进过程中,签名证书发生变化,因此部分跨版本安装场景存在后向兼容问题(无前向兼容问题,即新版本的内核可正常校验旧版本的IMA摘要列表文件)。
解决方法
建议用户确认当前内核中包含以下几本签名证书:
# keyctl show %:.builtin_trusted_keys
Keyring
566488577 ---lswrv 0 0 keyring: .builtin_trusted_keys
383580336 ---lswrv 0 0 \_ asymmetric: openeuler <openeuler@compass-ci.com> b675600b
453794670 ---lswrv 0 0 \_ asymmetric: private OBS b25e7f66
938520011 ---lswrv 0 0 \_ asymmetric: openeuler <openeuler@compass-ci.com> fb37bc6f
如缺少证书,建议将内核升级至最新版本。
yum update kernel
openEuler 24.03 LTS及之后版本已具备IMA专用证书,且支持证书链校验,证书生命周期可覆盖整个LTS版本。
问题4:开启IMA摘要列表评估模式后,IMA摘要列表文件签名正确,但是导入失败
原因分析
IMA摘要列表导入存在检查机制,如果某次导入过程中,摘要列表的签名校验失败,则会关闭摘要列表导入功能,从而导致后续即使正确签名的摘要列表文件也无法被导入。用户可检查dmesg日志中是否存在如下打印确认是否为该原因导致:
# dmesg
ima: 0-metadata_list-compact-bash-5.1.8-6.oe2203sp1.x86_64 not appraised, disabling digest lists lookup for appraisal
如上述日志,则说明在开启IMA摘要列表评估模式的情况下,已经导入了一个签名错误的摘要列表文件,从而导致功能关闭。
解决方法
用户需要重启系统,并修复错误的摘要列表签名信息。
问题5:openEuler 24.03 LTS及之后版本导入用户自定义的IMA证书失败
Linux 6.6内核新增了对导入证书的字段校验限制,对于导入IMA密钥环的证书,需要满足如下约束(遵循X.509标准格式):
- 为数字签名证书,即设置
keyUsage=digitalSignature
字段; - 非CA证书,即不可设置
basicConstraints=CA:TRUE
字段; - 非中间证书,即不可设置
keyUsage=keyCertSign
字段。
问题6:开启IMA评估模式后kdump服务启动失败
开启IMA评估enforce模式后,如果IMA策略中配置了如下KEXEC_KERNEL_CHECK规则,可能导致kdump服务启动失败。
appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig
原因是在该场景下,所有通过KEXEC加载的文件都需要经过完整性校验,因此内核限制kdump加载内核映像文件时必须使用kexec_file_load系统调用。可通过修改/etc/sysconfig/kdump配置文件的KDUMP_FILE_LOAD开启kexec_file_load系统调用。
KDUMP_FILE_LOAD="on"
同时,kexec_file_load系统调用自身也会执行文件的签名校验,因此要求被加载的内核映像文件必须包含正确的安全启动签名,而且当前内核中必须包含对应的验签证书。
问题7:RAS安装后无法启动
原因分析
因为在当前RAS的设计逻辑中,程序启动后需要从当前目录查找一份名为 ecdsakey.pub
的文件进行读取并作为之后访问该程序的身份验证码,若当前目录没有该文件,则RAS启动会报错。
解决方法
解决方法一:运行 ras -T
生成测试用token后会生成 ecdsakey.pub
。
解决方法二:自行部署oauth2认证服务后,将对应JWT token生成方对应的验证公钥保存为 ecdsakey.pub
。
问题8:RAS启动后,通过restapi无法访问
因为RAS默认以https模式启动,开发者需要向RAS提供合法的证书才能正常访问,而http模式下启动的RAS则不需要提供证书。