You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu系统中GRUB AppArmor内核参数审计脚本修复后仍失败的原因及可靠检测方法

问题原因分析

你的审计脚本返回失败,核心原因是没有区分真正的Linux内核启动条目和其他以linux开头的非内核条目。

从你给出的审计输出可以看到,脚本匹配到了memtest86+的启动行:

/boot/memtest86+x64.bin /boot/memtest86+x64.bin console=ttyS0,115200

memtest是内存检测工具,它的启动条目根本不需要AppArmor相关参数,但你的脚本会把所有以^\s*linux开头的行都纳入检查范围,自然会因为这些无关行缺少参数而返回失败。

可靠的AppArmor内核参数检测方法

针对CIS加固规则,推荐从配置文件验证、生成的grub.cfg精准检查、当前运行内核验证三个层面来做检测,以下是具体实现:

方法1:检查GRUB配置文件(最可靠,因为grub.cfg由它生成)

直接检查/etc/default/grub中的GRUB_CMDLINE_LINUX参数,确保两个AppArmor参数已经配置,这样可以避免grub.cfg中无关条目的干扰:

#!/bin/bash
GRUB_FILE="/etc/default/grub"

# 提取GRUB_CMDLINE_LINUX的内容
cmdline=$(grep '^GRUB_CMDLINE_LINUX=' "$GRUB_FILE" 2>/dev/null | sed 's/^GRUB_CMDLINE_LINUX="\(.*\)"$/\1/' || echo "")

# 检查apparmor=1是否存在
if ! [[ "$cmdline" =~ (^|[[:space:]])apparmor=1([[:space:]]|$) ]]; then
    echo "FAIL: GRUB_CMDLINE_LINUX missing 'apparmor=1'"
    exit 1
fi

# 检查security=apparmor是否存在
if ! [[ "$cmdline" =~ (^|[[:space:]])security=apparmor([[:space:]]|$) ]]; then
    echo "FAIL: GRUB_CMDLINE_LINUX missing 'security=apparmor'"
    exit 1
fi

# 可选:验证当前运行内核是否已加载参数(如果规则要求立即生效)
if ! grep -q "apparmor=1" /proc/cmdline; then
    echo "WARNING: Current kernel not using 'apparmor=1' (reboot required)"
fi
if ! grep -q "security=apparmor" /proc/cmdline; then
    echo "WARNING: Current kernel not using 'security=apparmor' (reboot required)"
fi

echo "PASS: All AppArmor kernel parameters are properly configured"
exit 0

方法2:精准检查grub.cfg中的Linux内核条目

如果你必须直接检查grub.cfg,需要过滤掉memtest等非内核条目,只针对Ubuntu的内核启动行:

#!/bin/bash
# 提取所有Ubuntu内核menuentry下的linux行,排除memtest
linux_entries=$(grep -A 15 'menuentry.*Ubuntu' /boot/grub/grub.cfg | grep "^\s*linux" | grep -v memtest)

# 检查每个条目是否包含两个参数
if echo "$linux_entries" | grep -v "apparmor=1" >/dev/null; then
    echo "FAIL: Some Linux entries missing 'apparmor=1'"
    exit 1
fi
if echo "$linux_entries" | grep -v "security=apparmor" >/dev/null; then
    echo "FAIL: Some Linux entries missing 'security=apparmor'"
    exit 1
fi

echo "PASS: All valid Linux entries have required AppArmor parameters"
exit 0

方法3:验证当前运行的内核参数

如果需要确认当前系统已经启用了AppArmor,还可以直接检查/proc/cmdline:

#!/bin/bash
if ! grep -q "apparmor=1" /proc/cmdline; then
    echo "FAIL: Current kernel not running with 'apparmor=1'"
    exit 1
fi
if ! grep -q "security=apparmor" /proc/cmdline; then
    echo "FAIL: Current kernel not running with 'security=apparmor'"
    exit 1
fi
echo "PASS: AppArmor parameters are active on current kernel"
exit 0
补充说明

你的修复脚本本身是没问题的——它会备份原配置、添加缺失的参数并更新grub。问题完全出在审计脚本的范围过滤上,只要调整审计逻辑,排除无关条目,就能得到正确的检测结果。

内容的提问来源于stack exchange,提问作者ÇAĞRI KARAKUŞ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 12:37:37