rajan-sharma-in/linux-container-security-verifier

GitHub: rajan-sharma-in/linux-container-security-verifier

该项目是一个基于 Linux 「/proc」文件系统的极简 CLI 工具,用于验证运行中进程实际生效的容器安全控制状态,弥补 Kubernetes 策略声明与内核真实执行之间的验证空白。

Stars: 0 | Forks: 0

# Linux Container Security 验证器 Linux Container Security Verifier 是一个小型开源 CLI 工具,用于检查正在运行的进程是否实际启用了 Linux 级别的容器安全控制。它特意设计得非常精简,适用于学习、演示和 Linux 安全讨论,包括 Linux Security Summit CFP 的演示。 该 verifier 直接读取 `/proc/`。它不会询问 Kubernetes、Docker、containerd 或策略引擎应该发生什么。它检查的是 Linux 内核为正在运行的进程所暴露的实际状态。 ## 为什么要验证 Kubernetes Policy 之下的状态 Kubernetes 安全设置、准入策略、Helm 值和 CI 检查非常重要,但它们只是意图。最终的执行状态存在于 Linux 原语中,例如 capabilities、seccomp、LSM 标签、挂载标志和 user namespaces。 运行时默认设置、CRI 实现细节、特权 pod、hostPath 挂载、init 系统或手动启动的容器,可能会导致实际生效的 Linux 状态与团队预期的策略不同。这款工具提供了一种快捷的方法,用于将声明的加固措施与内核可见的执行信号进行比较。 这是一个 verifier,而不是策略引擎。它报告来自 Linux 进程状态的检查结果,并在 `/proc` 无法证明完整运行时上下文的地方使用保守的启发式方法。 ## 检查内容 对于目标 PID,verifier 会检查: - `/proc//status` - `CapEff`:有效的 Linux capabilities,解码为 capability 名称 - `NoNewPrivs`:是否阻止了获取特权的 exec 转换 - `Seccomp`:是否激活了 seccomp 过滤 - `NSpid`:PID namespace 映射(如果可用) - `Uid` 和 `Gid`:进程凭证 ID - `/proc//attr/current` - AppArmor 或 SELinux 标签(如果可用) - 包含 `unconfined` 的标签将被视为失败 - `/proc//mountinfo` - 可写的敏感路径,例如 `/`、`/proc`、`/sys`、`/dev`、`/etc`、`/run` 和 `/var/run` - 类似于宿主机的挂载源或目标,可能表明存在 hostPath 暴露 - `/proc//uid_map` - 可能的身份用户 namespace 映射 - 直接的 `0 0 ...` 映射会被标记为可能的 container-root-to-host-root 映射 检查结果分类为 `PASS`、`WARN`、`FAIL` 或 `INFO`。 ## 构建 ``` go build -o verifier ./cmd/verifier ``` 你也可以在不构建的情况下运行它: ``` go run ./cmd/verifier --pid ``` ## 针对任意 Linux 进程运行 ``` sudo ./verifier --pid 1 ``` 可选标志: ``` sudo ./verifier --pid --json sudo ./verifier --pid --strict sudo ./verifier --pid --verbose ``` 退出码: - `0`:没有 `FAIL` 发现 - `1`:有一个或多个 `FAIL` 发现 - 带有 `--strict` 的 `1`:有一个或多个 `FAIL` 或 `WARN` 发现 - `2`:工具或运行时错误,例如无效的 PID 或缺少 `/proc/` ## 针对 Kubernetes 容器进程运行 verifier 需要容器进程的宿主机 PID。对于 CRI 运行时,`crictl` 通常是最快的方式: ``` crictl ps crictl inspect | jq '.info.pid' sudo ./verifier --pid ``` 如果你的运行时将应用程序进程嵌套在 shim 或 pause 进程之下,请检查进程树并选择你要验证的工作负载进程。 ## 针对Docker 容器运行 ``` docker inspect --format '{{.State.Pid}}' sudo ./verifier --pid ``` ## Kubernetes Pod 示例 该仓库包含两个示例 pod: - `examples/pod-privileged.yaml`:故意设计得不安全,包含特权模式、host namespaces、unconfined seccomp 以及对 `/` 的 hostPath 挂载 - `examples/pod-restricted.yaml`:更安全的基线配置,包含非 root 用户、丢弃的 capabilities、`allowPrivilegeEscalation: false`、只读根文件系统和 runtime-default seccomp 将它们部署到一次性的测试集群中: ``` kubectl apply -f examples/pod-privileged.yaml kubectl apply -f examples/pod-restricted.yaml ``` 找到它们的容器 ID 和宿主机 PID,然后运行: ``` sudo ./verifier --pid sudo ./verifier --pid ``` 特权 pod 应该会显示更多的警告或失败,尤其是在 capabilities、seccomp、namespace 暴露和挂载方面。受限 pod 应该具有较少的高风险 Linux 信号,尽管具体结果取决于你的内核、容器运行时和集群配置。 清理: ``` kubectl delete -f examples/pod-privileged.yaml kubectl delete -f examples/pod-restricted.yaml ``` ## 所需权限 某些 `/proc` 文件可能会被内核设置、user namespaces、mount namespaces 或 LSM 策略隐藏或限制。在节点上以 root 身份运行可以获得最完整的视图: ``` sudo ./verifier --pid ``` 该工具能够优雅地处理文件缺失和权限被拒绝的错误,通常将其列为 `INFO` 发现,除非缺少必需的运行时路径。 ## 局限性 - `/proc` 显示的是进程的内核状态,而不是原始的 Kubernetes 或运行时配置。 - 挂载和 hostPath 检测使用的是启发式方法,因为 `mountinfo` 不包含完整的 Kubernetes 数据卷源对象。 - `uid_map` 身份映射是强烈的信号,但 user namespace 的解释应通过运行时元数据来确认。 - Capability 风险取决于工作负载的上下文。该工具突出了宽泛和高风险的 capabilities;它不能替代威胁模型。 - 该 verifier 不执行策略、修改工作负载,也不证明工作负载是安全的。
标签:EVTX分析, Linux内核, Web截图, 子域名突变, 容器安全, 日志审计, 请求拦截