AxellGS/Wardk8s

GitHub: AxellGS/Wardk8s

WardK8s 是一个基于 Validating Admission Webhook 的 Kubernetes 安全策略控制器,通过默认拒绝模型在 Pod 创建时强制执行安全规则。

Stars: 0 | Forks: 0

# WardK8s 一个 Kubernetes 安全策略控制器,通过 Validating Admission Webhook 执行 Pod 安全策略,实现了**默认拒绝 (Default Deny)** 模型。 ## 功能说明 WardK8s 通过 Validating Admission Webhook 拦截 Pod 创建请求,并根据 `SecurityPolicy` 自定义资源对其进行评估。如果没有规则明确允许某个 Pod,则**默认拒绝** —— 这与防火墙和 Linux Security Modules 使用的模型相同。 ``` Pod Create Request → API Server → WardK8s Webhook → Allow/Deny ↓ SecurityPolicy CRD (Default Deny + Rules) ``` ## 主要特性 - **默认拒绝架构** —— 除非明确允许,否则 Pod 将被阻止 - **Dry-Run 模式** —— 仅记录违规而不执行强制策略,便于安全上线 - **规则评估** —— iptables 风格的从上至下评估,首条匹配生效 - **Pod 匹配器** —— Namespace、labels、privileged、hostNetwork、runAsRoot - **Prometheus 指标** —— `pods_denied_total`、`pods_allowed_total`、`policy_evaluations_total` - **亚微秒级延迟** —— 每次评估耗时 297ns(见下方基准测试) ## 前置条件 要在本地构建、测试和部署此控制器,请确保已安装以下软件: - **Go 1.22+**(用于构建和测试) - **Make**(用于执行 `Makefile` 目标) - **Docker** & **Kind**(或 Minikube)(用于本地集群) - **kubectl**(用于与集群交互) ## 快速开始 在终端中执行以下命令(跨平台兼容): ``` # 构建 controller 二进制文件 go build -v -o bin/wardk8s ./cmd/ # 运行单元测试 go test ./... -v -count=1 # 运行 benchmarks (证明纳秒级延迟) go test ./internal/webhook/ -bench=. -benchmem -run=^$ -count=3 # 在本地生成 TLS certs go run hack/certs.go ``` ## SecurityPolicy 示例 ``` apiVersion: ward.io/v1 kind: SecurityPolicy metadata: name: production-policy spec: mode: Enforce # or DryRun defaultAction: Deny rules: - name: allow-trusted match: namespaces: ["production"] podLabels: security-tier: "trusted" action: Allow - name: deny-privileged match: privileged: true action: Deny reason: "Privileged containers are not allowed" ``` ## 基准测试 策略评估算法针对高吞吐量进行了优化,从而对 API Server 造成极小的延迟开销: ``` BenchmarkEvaluatePolicy_SimplePolicy-12 4102887 297.4 ns/op 48 B/op 2 allocs/op BenchmarkEvaluatePolicy_10Rules-12 1654720 741.4 ns/op 48 B/op 2 allocs/op BenchmarkEvaluatePolicy_50Rules-12 431432 2704 ns/op 64 B/op 2 allocs/op ``` 即使有 50 条规则,评估时间也小于 3µs,且仅有 2 次内存分配。 ## 生产环境部署 已在真实的 Kubernetes 集群(Kind v0.27.0, K8s v1.32.2)上测试: ``` # 创建 cluster kind create cluster --name wardk8s # 构建并加载 image docker build -t wardk8s:latest . kind load docker-image wardk8s:latest --name wardk8s # 在本地生成 TLS certs go run hack/certs.go # 创建 namespace 以便注入 secret kubectl create namespace wardk8s-system # 创建用于 TLS 的 secret kubectl create secret tls wardk8s-webhook-certs \ --cert=config/webhook/certs/tls.crt \ --key=config/webhook/certs/tls.key \ -n wardk8s-system # 部署 CRDs、RBAC、Webhook 配置和 Controller kubectl apply -f config/crd/ kubectl apply -f config/rbac/ kubectl apply -f config/webhook/ go run hack/certs.go --patch-only kubectl apply -f config/deploy/ ``` ``` $ kubectl get pods -n wardk8s-system NAME READY STATUS RESTARTS AGE wardk8s-controller-7c97fdc478-5sd2n 1/1 Running 0 3m $ kubectl get all -n wardk8s-system pod/wardk8s-controller-7c97fdc478-5sd2n 1/1 Running service/wardk8s-webhook ClusterIP 10.96.124.113 443/TCP deployment.apps/wardk8s-controller 1/1 1 1 ``` ### 资源分析(基线) 通过 metrics-server 使用 `kubectl top pods` 在空闲状态(无传入准入请求)下测得: | 指标 | 基线(空闲) | 备注 | |---|---|---| | **CPU** | <2m (millicores) | 事件驱动 —— 无轮询循环 | | **Memory** | 8Mi | 多阶段 Alpine 构建,静态 Go 二进制文件 | | **Cold Start** | <100ms | 在就绪探针触发前已准备好提供服务 | | **Resource Requests** | 50m CPU / 64Mi RAM | 在部署中配置 | | **Resource Limits** | 200m CPU / 128Mi RAM | 硬性上限防止“吵闹邻居”效应 | **重要性说明:** 在大规模集群中,控制平面效率至关重要。仅消耗 8Mi 内存的 webhook 可最大限度地减少基础设施管理员的资源开销。架构比较如下: | 技术栈 | 典型空闲内存 | 配置 | |---|---|---| | 基于 JVM 的 webhook | ~300Mi | JIT 编译,垃圾回收 | | Python/FastAPI webhook | ~60Mi | 解释执行 | | **WardK8s (Go)** | **8Mi** | **AOT 编译,静态链接** | 结合亚微秒级的算法评估,WardK8s 旨在尊重 Kubernetes 控制平面的资源限制。 ## 架构 使用 [controller-runtime](https://github.com/kubernetes-sigs/controller-runtime) 构建(与 Kubebuilder 相同的基础),未使用脚手架生成器,以实现对架构的最大控制。 ``` cmd/main.go # Entry point, wires manager api/v1/ securitypolicy_types.go # CRD type definitions groupversion_info.go # Scheme registration zz_generated.deepcopy.go # runtime.Object implementation internal/ controller/ securitypolicy_controller.go # Reconciler (status management) webhook/ pod_validator.go # Admission webhook (enforcement) pod_validator_test.go # 7 unit tests + 3 benchmarks metrics/ prometheus.go # Metrics exporter ``` **设计决策:** | 决策 | 理由 | |---|---| | Validating(非 Mutating)webhook | Pod 应被拒绝,而非静默修改 | | 默认拒绝 | 与 iptables/LSM 相同的模型:先匹配显式规则,再应用默认策略 | | Controller 处理状态,webhook 处理执行 | 关注点分离 | | DryRun 模式 | 生产环境安全上线 —— 先测试后执行 | | 无 Kubebuilder 脚手架 | 代码库整洁,展示了对内部机制的理解 | ## 测试 ``` # 单元测试 (7 个测试覆盖所有安全 matchers) go test ./... -v -count=1 # Benchmarks (延迟证明) go test ./internal/webhook/ -bench=. -benchmem -run=^$ -count=3 # Coverage 报告 go test ./... -coverprofile=coverage.out go tool cover -func=coverage.out ``` ## 技术栈 - **Go 1.26** 配合 controller-runtime v0.23.1 - **Kubernetes** API machinery v0.35.2 - **Prometheus** client_golang 用于指标监控 - **Zap** 结构化 JSON 日志 ## 许可证 Apache 2.0
标签:Admission Webhook, DevSecOps, EVTX分析, EVTX分析, EVTX分析, Go, JSONLines, Pod安全, Policy Controller, Prometheus监控, Ruby工具, Streamlit, Web截图, 上游代理, 准入控制器, 子域名突变, 安全策略控制器, 容器安全, 微服务安全, 日志审计, 策略即代码, 聊天机器人安全, 自定义请求头, 访问控制, 请求拦截, 防火墙, 零信任, 默认拒绝