LinuxKit 中的内核自防护(KSPP):从推荐配置到 CI 强制校验的实践指南

发布时间:2026/9/26 2:07:22
LinuxKit 中的内核自防护(KSPP):从推荐配置到 CI 强制校验的实践指南 操作系统云原生容器运行时【免费下载链接】linuxkitA toolkit for building secure, portable and lean operating systems for containers项目地址https://gitcode.com/gh_mirrors/li/linuxkit点击查看免费下载导读本文以 projects/kspp/README.md 为骨架系统梳理 LinuxKitMoby 项目衍生如何落实内核自防护项目KSPP的加固思路——从 KSPP 的社区背景与 Roadmap到仓库内真实可查的kernel_config/sysctl 落地清单再到 CI 中用于强制校验的check-kernel-config.sh测试脚本及其调用链。读完本文你将掌握KSPP 推荐设置具体落在哪些内核选项与 sysctl 参数上、这些选项在 LinuxKit 各内核版本配置中的实际形态、以及如何自行复用这套配置与测试来加固自己的容器内核。一、背景什么是 KSPP为什么 LinuxKit 要跟进KSPPKernel Self Protection Project内核自防护项目是一个社区协作项目目标是通过消除整类漏洞classes of vulnerabilities来加固上游 Linux 内核而非逐个修补具体 CVE。其 wiki 维护着一份推荐设置清单Recommended settings涵盖编译期内核选项Kconfig与运行时 sysctl 参数。LinuxKit 之所以主动对齐这套推荐设置原因写在 README 中Moby 是 Linux 内核的消费方并且aims to be the most secure distro it can be。许多类似防护在其他项目中早已存在但尚未被合入上游作为上游 Linux 安全加固工作的直接受益者与协作者LinuxKit 维护者选择把 KSPP 的推荐项固化进自己的内核配置。事实依据以上表述均出自 projects/kspp/README.mdKSPP 与推荐设置的原始出处为 kernsec.org 社区 wikiREADME 中给出的外链本文不转述其外部细节仅聚焦本仓库内的落地证据。二、LinuxKit 的 KSPP RoadmapREADME 将 LinuxKit 的 KSPP 参与计划分为两个阶段短期Near-term已将kernel_config和sysctl设置与 KSPP 推荐设置对齐且持续跟踪这些推荐的演进在 CI 测试中检查这些设置是否生效——即 test/pkg/kernel-config/check-kernel-config.sh由 tych0 牵头向 kernel-hardening 邮件列表提交 KSPP 补丁。长期Long-term提高对 KSPP 社区的参与度增加贡献。这段 Roadmap 虽短但对齐配置 CI 校验这两条承诺在仓库中都有可验证的落地配置侧见 kernel/ 下各版本config-*文件与 pkg/sysctl/etc/sysctl.d/00-linuxkit.conf校验侧见 test/pkg/kernel-config/ 测试套件。三、配置侧落地一内核编译期选项Kconfig3.1 基础完整性检查所有架构、所有版本KSPP 推荐设置强调内存破坏类漏洞的防御。以 kernel/6.6.x/config-x86_64 为例可确认以下选项均为y配置项作用6.6.x x86_64 证据CONFIG_BUGy内核 BUG 处理基础设施第 248 行CONFIG_DEBUG_KERNELy打开内核调试选项门类第 4863 行CONFIG_STRICT_DEVMEMy限制对 /dev/mem 的访问第 5148 行CONFIG_IO_STRICT_DEVMEMy进一步限制对 MMIO 区域的访问第 5149 行CONFIG_SYN_COOKIESyTCP SYN cookies 抗 SYN 洪泛第 1114 行CONFIG_DEBUG_NOTIFIERSynotifier 链调试第 5046 行CONFIG_DEBUG_LISTy链表完整性校验防双重释放/破坏第 5043 行CONFIG_PANIC_ON_OOPSyOops 即 panic防止继续运行在已破坏状态第 4980 行CONFIG_BUG_ON_DATA_CORRUPTIONy检测到数据破坏立即 BUG第 4438 行CONFIG_GENERIC_CPU_VULNERABILITIESy统一的 CPU 漏洞幽灵/熔断等暴露接口第 1832 行3.2 内存与栈防护按内核版本条件启用KSPP 的很多推荐项依赖内核版本某些选项在旧内核尚未引入或在 5.11 被重命名/合并。LinuxKit 的测试脚本对此做了按版本分支而各版本 config 文件也确实同步演进栈保护4.18 之前为CONFIG_CC_STACKPROTECTOR_STRONGy4.18 重命名为CONFIG_STACKPROTECTORyCONFIG_STACKPROTECTOR_STRONGykernel/6.6.x/config-x86_64 第 764-765 行。用户拷贝加固CONFIG_HARDENED_USERCOPYykernel/6.6.x/config-aarch64 第 4743 行4.8 引入。内核/模块 RXW 分区CONFIG_STRICT_KERNEL_RWXy、CONFIG_STRICT_MODULE_RWXy4.11kernel/6.6.x/config-x86_64 第 814、816 行阻止内核页同时可写可执行。页毒化CONFIG_PAGE_POISONINGy4.9kernel/6.6.x/config-x86_64 第 4941 行其子选项CONFIG_PAGE_POISONING_NO_SANITY/CONFIG_PAGE_POISONING_ZERO在 5.11 被移除。slab 随机化CONFIG_SLAB_FREELIST_RANDOMy4.7kernel/6.6.x/config-x86_64 第 971 行。UBSan 未定义行为检测CONFIG_UBSANy4.5kernel/6.6.x/config-aarch64 第 5302 行。凭据调试CONFIG_DEBUG_CREDENTIALSy6.x 之前。地址随机化CONFIG_RANDOMIZE_BASEyKASLR4.5kernel/6.6.x/config-x86_64 第 467 行x86_64 上另有CONFIG_RANDOMIZE_MEMORYy4.8第 471 行。3.3 架构相关加固x86_64CONFIG_LEGACY_VSYSCALL_NONEy彻底禁用旧式 vsyscall 映射kernel/6.6.x/config-x86_64 第 476 行是 KSPP 负向清单中的重点。页表隔离与 Retpoline6.11 及以前为CONFIG_PAGE_TABLE_ISOLATIONyCONFIG_RETPOLINEy第 493-494 行6.12 重命名为CONFIG_MITIGATION_PAGE_TABLE_ISOLATION/CONFIG_MITIGATION_RETPOLINE测试脚本同样做了版本分支见下文。3.4 负向清单必须is not setKSPP 推荐不仅要求某些选项开启还要求关闭一批高风险功能。在 kernel/6.6.x/config-x86_64 中对应为# CONFIG_COMPAT_BRK is not set第 979 行禁止堆地址随机化兼容性豁免# CONFIG_KEXEC is not set第 291 行禁用 kexec 动态加载内核# CONFIG_HIBERNATION is not set第 513 行禁用休眠避免镜像投毒面# CONFIG_MODIFY_LDT_SYSCALL is not set第 478 行# CONFIG_X86_X32_ABI is not set第 647 行禁用 x32 ABI6.x 起改名旧版为CONFIG_X86_X32# CONFIG_DEVKMEM is not set5.13 之前的内核禁用 /dev/kmem。四、配置侧落地二运行时 sysctl 参数编译期选项之外KSPP 推荐还包括运行时内核参数。LinuxKit 将这些参数固化在 pkg/sysctl/etc/sysctl.d/00-linuxkit.conf随 sysctl 包在启动早期应用。其中与安全强相关的条目sysctl 参数值含义kernel.kptr_restrict2限制内核指针在 /proc/kallsyms 等处的暴露kernel.dmesg_restrict1仅特权进程可读 dmesgkernel.perf_event_paranoid3严格限制 perf 事件防侧信道/提权探测kernel.unprivileged_bpf_disabled1禁止非特权 eBPF防提权注释引用了 LWN 相关讨论net.ipv4.tcp_syncookies1与内核CONFIG_SYN_COOKIESy配合net.ipv4.conf.all/default.rp_filter1反源地址欺骗net.ipv4.conf.*.accept_redirects/accept_source_route0关闭路由重定向/源路由fs.protected_hardlinks/fs.protected_symlinks1防硬链接/符号链接提权这些条目共同构成 KSPP 推荐设置中运行时那一半也印证了 README 中aligned ourkernel_configandsysctlsettings with the KSPP recommendations的说法。五、CI 强制校验check-kernel-config.sh 的完整逻辑5.1 调用入口与镜像组装README 提到的 CI 检查实现在 test/pkg/kernel-config/check-kernel-config.sh入口包装在 test/pkg/kernel-config/check.sh。测试镜像由 test/pkg/kernel-config/Dockerfile 构建基于linuxkit/alpine基础镜像额外拉取 moby 的contrib/check-config.sh固定 commit38005cfc12...用于 5.x 之前内核的兼容性检查最终产物以scratch镜像形式运行ENTRYPOINT为check.sh。在 CI 编排中该测试作为onboot阶段服务运行见 test/hack/test.yml 第 14-15 行onboot: - name: check-kernel-config image: linuxkit/test-kernel-config:75b54d40268141d966b0c820e184981d3a30fac0测试镜像通过 Dockerfile 中的 LABELreadonly: true、binds/lib/modules、/dev、/sys、capabilitiesall获得读取宿主/被测内核配置与加载模块的权限。5.2 配置来源与版本/架构探测脚本开头的关键设计if [ -n $1 ]; then UNZIPPED_CONFIG$(cat $1) # 显式传入配置文件 else UNZIPPED_CONFIG$(zcat /proc/config.gz) # 默认读取运行中内核的 /proc/config.gz fi即默认从运行中的内核读取配置/proc/config.gz也支持把某个config-*文件作为参数传入做离线校验同时解析uname -r得到kernelMajor/kernelMinor用uname -m得到架构以便做版本与架构分支判断。5.3 正向断言必须为y脚本逐条grep断言任一条不满足即fail并最终退出码 1基础项全版本CONFIG_BUG、CONFIG_DEBUG_KERNEL、CONFIG_STRICT_DEVMEM、CONFIG_SYN_COOKIES、CONFIG_DEBUG_NOTIFIERS、CONFIG_DEBUG_LIST、CONFIG_SECCOMP、CONFIG_SECCOMP_FILTER、CONFIG_SECURITY、CONFIG_SECURITY_YAMA、CONFIG_PANIC_ON_OOPS、CONFIG_BPF_JIT_ALWAYS_ON。版本条件项 6CONFIG_DEBUG_CREDENTIALS4.x ≤ 4.10CONFIG_DEBUG_RODATA、CONFIG_DEBUG_SET_MODULE_RONX旧命名5.x或4.x ≥ 4.5CONFIG_UBSAN≥ 4.7CONFIG_SLAB_FREELIST_RANDOM≥ 4.8CONFIG_HARDENED_USERCOPY≥ 4.9CONFIG_PAGE_POISONING及其在 5.11 时的两个子选项≥ 4.10CONFIG_BUG_ON_DATA_CORRUPTION≥ 4.11CONFIG_STRICT_KERNEL_RWX/CONFIG_STRICT_MODULE_RWX≥ 4.5CONFIG_RANDOMIZE_BASE栈保护新旧命名分支≥ 4.18 断言CONFIG_STACKPROTECTOR/CONFIG_STACKPROTECTOR_STRONG否则断言CONFIG_CC_STACKPROTECTOR_STRONGx86_64 分支CONFIG_LEGACY_VSYSCALL_NONE、CONFIG_GENERIC_CPU_VULNERABILITIES、≥ 4.5 的CONFIG_IO_STRICT_DEVMEM、≥ 4.8 的CONFIG_RANDOMIZE_MEMORY以及 6.12 前后的CONFIG_PAGE_TABLE_ISOLATION/CONFIG_RETPOLINE与CONFIG_MITIGATION_*新旧命名分支。5.4 负向断言必须is not set全版本CONFIG_COMPAT_BRK、CONFIG_SCSI_PROC_FS必须关闭x86_64CONFIG_COMPAT_VDSO、CONFIG_KEXEC、CONFIG_MODIFY_LDT_SYSCALL必须关闭≥ 4.5 时CONFIG_LEGACY_PTYS、CONFIG_HIBERNATION必须关闭 5.13 时CONFIG_DEVKMEM必须关闭6.x 前后分别断言CONFIG_X86_X32与CONFIG_X86_X32_ABI关闭 6.12 时CONFIG_ACPI_CUSTOM_METHOD关闭。5.5 运行期行为校验配置检查之外脚本还做了两类运行期验证模块加载冒烟依次modprobe nfs nfsd并按版本modprobe ntfs 6.12或ntfs3≥ 6.12验证内核模块子系统可用内建文件系统清单遍历sysfs tmpfs bdev proc cgroup devtmpfs binfmt_misc debugfs tracefs securityfs sockfs bpf pipefs ramfs hugetlbfs rpc_pipefs devpts ext4 vfat msdos iso9660 nfs nfs4 nfsd cifs fuseblk fuse fusectl overlay udf xfs 9p pstore mqueue等逐一在/proc/filesystems中确认存在保证容器运行时所需的文件系统全部内建或可加载。全部通过后输出kernel config test succeeded!否则输出kernel config test failed!并exit 1从而在 CI 中让加固配置回退即失败。六、如何复用这套 KSPP 加固流程6.1 离线校验任意内核配置不启动虚拟机直接对仓库内的 config 文件运行测试脚本# 以 6.6.x 的 x86_64 配置为例 ./test/pkg/kernel-config/check-kernel-config.sh kernel/6.6.x/config-x86_64 6.6.0脚本支持第二个参数传入内核版本字符串用于触发对应的版本分支断言如 6.12 前后的CONFIG_MITIGATION_*新旧命名判断。6.2 在 LinuxKit 镜像内运行时校验按 test/hack/test.yml 的模式在onboot阶段加入check-kernel-config服务或直接构建 test/pkg/kernel-config/Dockerfile 的镜像由其check.sh依次执行check-kernel-config.sh与5.x 以下内核的mobycheck-config.sh。6.3 把 KSPP 推荐固化进自己的构建编译期参考 kernel/ 下config-*文件中的 KSPP 正向/负向清单尤其CONFIG_HARDENED_USERCOPY、CONFIG_STRICT_KERNEL_RWX、CONFIG_PAGE_POISONING、CONFIG_STACKPROTECTOR_STRONG、CONFIG_PANIC_ON_OOPS与负向的COMPAT_BRK、KEXEC、HIBERNATION运行期直接复用 pkg/sysctl/etc/sysctl.d/00-linuxkit.confkptr_restrict2、dmesg_restrict1、perf_event_paranoid3、unprivileged_bpf_disabled1等或按其格式扩展自己的 sysctl 文件。七、小结从 projects/kspp/README.md 的 Roadmap 出发LinuxKit 对 KSPP 的参与形成了闭环编译期内核配置kernel/ 各config-*落实静态加固运行期 sysctlpkg/sysctl/etc/sysctl.d/00-linuxkit.conf落实动态加固而CI 测试test/pkg/kernel-config/check-kernel-config.sh test/hack/test.yml保证这些设置在任何一次内核变更中都不会悄然回退。对希望构建默认安全容器内核的团队这套推荐设置清单 自动断言 版本兼容分支的组合本身就是一份可直接移植的最佳实践模板。关键路径速查关联文档projects/kspp/README.md内核配置kernel/6.6.x/config-x86_64、kernel/6.6.x/config-aarch64其余版本见 kernel/sysctlpkg/sysctl/etc/sysctl.d/00-linuxkit.conf校验脚本test/pkg/kernel-config/check-kernel-config.sh、test/pkg/kernel-config/check.sh、test/pkg/kernel-config/DockerfileCI 编排test/hack/test.yml赞分享操作系统云原生容器运行时【免费下载链接】linuxkitA toolkit for building secure, portable and lean operating systems for containers项目地址https://gitcode.com/gh_mirrors/li/linuxkit点击查看免费下载相关推荐如何以 unread_dot 为例在 Agent Zero 中创建、测试并审查一个本地 Web UI 插件如何以 unread_dot 为例在 Agent Zero 中创建、测试并审查一个本地 Web UI 插件 如果你的目标是理解 Agent Zero 的插件操作系统云原生容器运行时从崩溃到自愈Canal配置校验工具的终极实践指南从崩溃到自愈Canal配置校验工具的终极实践指南 Canal是由阿里巴巴开源的分布式数据库同步系统主要用于实现MySQL数据库的日志解析和实时增量数据订阅与后端变更数据捕获数据同步数据集成Changesets 自动化发布实战指南从 CI 强制校验到 version/publish 全流程自动化Changesets 自动化发布实战指南从 CI 强制校验到 version/publish 全流程自动化 Changesets 是一款面向 monorepo开发工具CLI上一篇Vector 数据管道实战日志采集、指标路由与多目标转发快速上手下一篇猫抓浏览器资源嗅探与流媒体下载完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考