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截图, 上游代理, 准入控制器, 子域名突变, 安全策略控制器, 容器安全, 微服务安全, 日志审计, 策略即代码, 聊天机器人安全, 自定义请求头, 访问控制, 请求拦截, 防火墙, 零信任, 默认拒绝