pleme-io/blackmatter-selinux

GitHub: pleme-io/blackmatter-selinux

一个为 NixOS 提供完整 SELinux 强制访问控制的四层模块化 flake,涵盖内核、用户空间、策略和容器标签,旨在为容器宿主机构建可复现、可回滚的深度防御体系。

Stars: 0 | Forks: 0

# blackmatter-selinux NixOS SELinux 强制访问控制 —— 内核构建、用户空间工具、适配 NixOS 的引用策略以及容器卷标签。 ## 这为您提供了什么 一个由四个层级组成的 NixOS 模块,每个层级均可独立使用: | 层级 | 功能 | 成熟度 | |---|---|---| | **T1 — 内核** | 编译启用了 `CONFIG_SECURITY_SELINUX*` 的 `pkgs.linux_selinux`;连接 `boot.kernelPackages` | 实质可用 | | **T2 — 用户空间 + init** | 安装 policycoreutils/libselinux,渲染 `/etc/selinux/config`,systemd 自动重新标记钩子,内核命令行 | 实质可用 | | **T3 — 适配 NixOS 的策略** | 知道 `/nix/store` 路径的引用策略;按服务划分的模块;激活时的重新标记 | **仅包含框架** — 策略模块需要数月时间积累 | | **T4 — 容器卷标签** | 将 podman / docker 的 `:Z` / `:z` 连接到内核;类型为 `container_t` / `container_file_t` | 依赖 T3 | ## 快速开始 ### Permissive 模式的研究测试机(仅限 T1 + T2) ``` # 在你的 NixOS configuration 中 { inputs, ... }: { imports = [ inputs.blackmatter-selinux.nixosModules.default ]; blackmatter.components.selinux = { enable = true; kernel.enable = true; userspace.enable = true; userspace.bootMode = "permissive"; # T3 policy not enabled — kernel logs every access decision but blocks nothing. }; } ``` 在重建 + 重启后: ``` $ getenforce Permissive $ cat /sys/kernel/security/lsm capability,selinux,landlock,lockdown,yama,integrity,bpf $ ausearch -m AVC | head # every access the kernel saw ``` ### 容器宿主机(T1 + T2 + T3 + T4) ``` blackmatter.components.selinux = { enable = true; kernel.enable = true; userspace.enable = true; userspace.bootMode = "enforcing"; policy.enable = true; policy.modules = [ "${inputs.blackmatter-selinux}/policy/modules/podman-host" ]; containers.enable = true; containers.podman.relabelVolumes = true; }; ``` `podman run -v /srv/data:/data:Z …` 现在会将 `/srv/data` 重新标记为 `container_file_t`,并且正在运行的容器进程将获得 `container_t` 类型。 ## 内容位置 ``` flake.nix # consumes substrate's blackmatter-component-flake module/nixos/ ├── default.nix # composes T1–T4, gates each behind enable flags ├── kernel.nix # T1 → docs/T1-KERNEL.md ├── userspace.nix # T2 → docs/T2-USERSPACE.md ├── policy.nix # T3 → docs/T3-POLICY.md └── containers.nix # T4 → docs/T4-CONTAINERS.md module/home-manager/ # researcher tools (secilc, sesearch, audit2allow) overlays/kernel-selinux.nix # alias for the substrate-built overlay policy/ # T3 deliverable ├── modules/ │ ├── nixos-base/ # systemd, kernel, syslog (base.te + base.fc) │ ├── nix-store/ # /nix/store labeling │ └── podman-host/ # rootless podman host policy (ported from container-selinux) ├── README.md # how to author a new policy module └── build.nix # checkmodule + semodule_package pipeline checks/ ├── vm-selinux-permissive.nix # T1+T2 boot test └── vm-selinux-podman-mcs.nix # M3 gate — cross-container isolation proof docs/ # operator runbook + per-tier deep-dives ├── README.md # docs index ├── T1-KERNEL.md ├── T2-USERSPACE.md ├── T3-POLICY.md ├── T4-CONTAINERS.md ├── OPERATOR-RUNBOOK.md # day-to-day ops + recovery └── AUDIT2ALLOW-WORKFLOW.md # policy-authoring loop ``` 有关深入的操作细节,请从 [`docs/README.md`](./docs/README.md) 开始。 ## 复合钩子(无论 SELinux 结果如何的底层基础设施收益) 即使仅使用第 1 层,也能产生可复用的底层原语: 1. **`substrate/lib/build/nixos/kernel-lsm.nix`** — 通用的 参数化 kernel-with-LSM 构建器。可复用于 Landlock、eBPF-LSM, 以及任何未来的 LSM 堆叠工作。 2. **NixOS VM 测试安全模块工具** — 位于 `checks/vm-*.nix` 中的模式,作为任何 `blackmatter-*` 安全组件的 规范模式提升至底层。 3. **arch-synthesizer 中类型化的 `SecurityPosture` 插槽**(M6,参见 理论文档)。集群声明在类型系统中携带其 LSM 选择。 4. **支柱 11 审计告警层。** 每台 `selinux=enforcing` 主机 都会自动获取一个通过 Vector → VictoriaLogs → Alertmanager 连接的 AVC 拒绝激增告警。 ## 状态 | 里程碑 | 状态 | 仓库状态 | |---|---|---| | M0 — 仓库建立,T1 实质可用,T2/T3/T4 为存根,CI 通过 | **进行中** | 本次提交 | | M1 — rio 在 permissive 模式下采用 T1+T2 | 等待 M0 | — | | M2 — 基础策略(systemd + sshd + nix-daemon + journald) | 等待 M1 | — | | M3 — podman 策略 + T4 | 等待 M2 | — | | M4 — rio 实施强制 | 等待 M3 | — | | M5 — 推广至 akeyless-dev / openclaw | 等待 M4 | — | | M6 — `SecurityPosture` 类型体系原语 | 等待 M5 | — | ## 承诺账本 —— 每个里程碑实际闭环的内容 以下威胁来自 [`pleme-io/theory/SELINUX-NIXOS.md` §"Threat model"](https://github.com/pleme-io/theory/blob/main/SELINUX-NIXOS.md)。✅ 表示某个里程碑*作为可推导、可证明的属性*闭环了该威胁(不仅是“我们尝试去做了”——而是有 CI 门禁证明它)。⚠️ 表示部分闭环/仅记录日志。 | 威胁 | M0 | M1 | M2 | M3 | M4 | M5 | |---|:-:|:-:|:-:|:-:|:-:|:-:| | **#1** 通过内核漏洞进行容器逃逸 → 受限于 `container_t` | ❌ | ⚠️ 日志 | ⚠️ 日志 | ✅ | ✅ | ✅ | | **#2** 容器内的应用被攻陷 → 受限于域 | ❌ | ⚠️ 日志 | ⚠️ 日志 | ✅ | ✅ | ✅ | | **#3** 卷挂载配置错误 → 跨容器访问被阻止 (MCS) | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | | **#4** 卷上的符号链接攻击 → 被文件标签阻止 | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | | **#5** 宿主机内的进程注入 → 被域 + MCS 阻止 | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | | **#6** 单层防御失效 → 其他层进行保护 | ❌ | ❌ | ❌ | ⚠️ podman | ✅ 所有 rio 服务 | ✅ 集群范围 | | 用于合规性证明的审计日志证据 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | | 可复现的策略构建 (Nix derivation) | — | — | ✅ | ✅ | ✅ | ✅ | | 通过 `nixos-rebuild switch --rollback` 实现的原子策略回滚 | — | — | ✅ | ✅ | ✅ | ✅ | | 类型化的集群范围策略一致性 | — | — | — | — | — | ✅ | **图例。** ✅ = 附带 CI 证明闭环。⚠️ 日志 = 拒绝记录在审计日志中(适用于取证 + 合规审计)但未被阻止。⚠️ podman = 仅针对 podman 宿主机工作负载类别闭环;其他工作负载仍为单层防御。❌ = 未闭环;威胁依然存在。 **诚实的解读:** 直到 M3 发布且 `vm-selinux-podman-mcs` 测试不再被标记为 `meta.broken = true`,其他代理分析中所称的深度防御承诺仍停留在*路线图*中,而非*运行代码*中。任何基于此仓库做出安全决策的人都应首先查看此表。 ### 如何在客户 / 合规语境中解读此表 - **“我们受到 SELinux 保护了吗?”** → “我们拥有一项强制模式的 SELinux 策略,闭环了针对 podman 工作负载的威胁 #1–#5(根据由 `nix build .#checks.x86_64-linux.vm-selinux-podman-mcs` 验证的 M3 交付物)。其他工作负载类别将随着其策略模块的发布而逐步纳入保护。” - **“向我展示证据。”** → `nix flake check` 运行每一个 CI 门禁;`vm-selinux-*.nix` 输出即为字面意义上的证明。 - **“与 Fedora CoreOS 的差距是什么?”** → 参见理论文档中的 FCOS 比较部分;一旦 M3 发布,剩余的差距在于策略成熟度(随着时间推移,按服务划分的策略会逐步闭环),而不是架构。 ## 许可证 MIT —— 与 pleme-io 其余的开源底层项目保持一致。
标签:DevSecOps, DNS解析, Docker, JSONLines, Linux内核, LSM, MAC, Nix Flakes, NixOS, Podman, SELinux, Type Enforcement, Web截图, 上游代理, 内核编译, 安全模块, 安全策略, 安全防御评估, 容器安全, 开源项目, 强制访问控制, 提示词设计, 操作系统安全, 文件上下文标签, 用户空间工具, 系统初始化, 系统加固, 网络安全, 请求拦截, 隐私保护, 零信任