Wynn-hub/kubesentry

GitHub: Wynn-hub/kubesentry

KubeSentry 是一个基于 OPA/Rego 的 Kubernetes 准入 Webhook,通过策略强制资源验证和集群治理,解决配置合规与安全问题。

Stars: 0 | Forks: 0

# KubeSentry 监控 English | [中文](README_zh.md) [![Go版本](https://img.shields.io/badge/go-1.26+-blue)](https://golang.org) [![许可证](https://img.shields.io/badge/license-Apache%202.0-green)](LICENSE) [![Docker Hub](https://img.shields.io/docker/pulls/wynnhub/kubesentry-webhook?label=webhook%20pulls)](https://hub.docker.com/r/wynnhub/kubesentry-webhook) [![Docker Hub](https://img.shields.io/docker/pulls/wynnhub/kubesentry-operator?label=operator%20pulls)](https://hub.docker.com/r/wynnhub/kubesentry-operator) 一个 Kubernetes 验证准入 Webhook,用于强制执行以自定义资源定义形式定义的 OPA/Rego 策略,并配备一个 Operator 用于生命周期管理、版本控制和内置策略组。 ## 快速开始 ``` helm install kubesentry \ oci://registry-1.docker.io/wynnhub/kubesentry \ --namespace kubesentry-system \ --create-namespace ``` 无需登录 — 镜像和 Helm Chart 在 Docker Hub 上公开提供。Helm 预安装 Job 会自动生成 TLS 证书并修补 `ValidatingWebhookConfiguration`。 ## 架构 两个独立的 Go 二进制文件共享相同的自定义资源定义 API 类型: ``` ┌────────────────────────────────────────────────────────────────┐ │ Kubernetes Cluster │ │ │ │ ┌──────────────────┐ ┌────────────────────────────────┐ │ │ │ kubesentry- │ │ kubesentry-operator │ │ │ │ webhook │ │ │ │ │ │ │ │ PolicyGroupReconciler │ │ │ │ - OPA evaluator │ │ - creates child Policy CRDs │ │ │ │ - Policy cache │ │ - built-in library (37 rules) │ │ │ │ - /validate │ │ - conflict detection │ │ │ │ - /healthz │ │ │ │ │ │ - /readyz │ │ PolicyReconciler │ │ │ └────────┬─────────┘ │ - validates Rego │ │ │ │ │ - creates PolicyVersion │ │ │ │ watches │ - handles rollback │ │ │ ▼ │ │ │ │ ┌──────────────────┐ │ WebhookConfigReconciler │ │ │ │ Policy CRD │ │ - aggregates rules │ │ │ │ (cluster-scope)│ │ - patches VWC │ │ │ └──────────────────┘ └────────────────────────────────┘ │ │ │ │ ┌──────────────────┐ ┌────────────────────────────────┐ │ │ │ PolicyGroup CRD │ │ PolicyVersion CRD │ │ │ │ (cluster-scope) │ │ (immutable snapshots) │ │ │ └──────────────────┘ └────────────────────────────────┘ │ └────────────────────────────────────────────────────────────────┘ ``` ## 功能特性 - **OPA/Rego 策略引擎** — 直接内嵌 OPA,无需 sidecar - **基于 CRD 的策略** — 将策略定义为 `Policy` Kubernetes 资源 - **内置策略组** — 包含 37 条精选规则,涵盖安全性、效率和可靠性三个组,在安装时自动部署 - **策略分组** — 将策略组合在一起,支持按组和按策略的启用/禁用开关 - **自定义策略组** — 创建您自己的 `PolicyGroup` 自定义资源定义;当自定义策略与内置策略共享相同键时,自定义策略优先 - **结构化的违规消息** — 拒绝信息包含 `[group/key] message` 和描述字段;审计违规以 `AdmissionResponse.Warnings` 形式出现 - **执行模式** — `enforce` (阻止) 或 `audit` (仅记录日志 + 警告) - **版本控制** — 每次策略更改都会创建一个不可变的 `PolicyVersion` 快照 - **回滚** — 设置 `spec.rollbackTo.version` 可以恢复任何之前的版本 - **动态 Webhook 规则** — Operator 根据就绪的策略自动更新 `ValidatingWebhookConfiguration` - **自签名 TLS** — 在 Helm 安装期间通过预安装 Job 自动生成 - **并行评估** — 多个策略并发评估,超时时间为 5 秒 - **领导者选举** — Operator 以领导者选举方式运行以实现高可用 - **多平台** — 镜像支持 `linux/amd64` 和 `linux/arm64` ## 内置策略组 KubeSentry 包含 37 个内置策略,分为三个组,默认启用: ### 安全性 (23 个策略) | 键 | 默认模式 | 描述 | |---|---|---| | `runAsPrivileged` | enforce | 阻止以特权模式运行的容器 | | `privilegeEscalationAllowed` | enforce | 阻止 `allowPrivilegeEscalation: true` | | `runAsRootAllowed` | audit | 当未设置 `runAsNonRoot` 时发出警告 | | `notReadOnlyRootFilesystem` | audit | 当未设置 `readOnlyRootFilesystem` 时发出警告 | | `linuxHardening` | enforce | 要求至少满足以下之一:seccompProfile、seLinuxOptions、capabilities.drop | | `insecureCapabilities` | audit | 对不安全的能力添加发出警告 | | `dangerousCapabilities` | enforce | 阻止危险的能力 (SYS_ADMIN, NET_ADMIN, ...) | | `hostPIDSet` | enforce | 阻止 `hostPID: true` | | `hostIPCSet` | enforce | 阻止 `hostIPC: true` | | `hostNetworkSet` | audit | 当 `hostNetwork: true` 时发出警告 | | `hostPortSet` | audit | 当设置了 `hostPort` 时发出警告 | | `sensitiveContainerEnvVar` | enforce | 阻止名称匹配敏感模式的环境变量 | | `automountServiceAccountToken` | audit | 当自动挂载服务账户令牌时发出警告 | | `sensitiveConfigmapContent` | enforce | 阻止包含敏感内容键的 ConfigMaps | | `tlsSettingsMissing` | audit | 对没有 TLS 的 Ingress 发出警告 | | `clusterrolePodExecAttach` | enforce | 阻止授予 pods/exec 或 pods/attach 权限的 ClusterRoles | | `rolePodExecAttach` | enforce | 阻止授予 pods/exec 或 pods/attach 权限的 Roles | | `clusterrolebindingPodExecAttach` | enforce | 阻止按名称引用 exec/attach 角色的 ClusterRoleBindings | | `rolebindingRolePodExecAttach` | enforce | 阻止按名称引用 exec/attach 角色的 RoleBindings | | `rolebindingClusterRolePodExecAttach` | enforce | 阻止按名称引用 exec/attach ClusterRoles 的 RoleBindings | | `clusterrolebindingClusterAdmin` | enforce | 阻止绑定到 cluster-admin 的 ClusterRoleBindings | | `rolebindingClusterAdminClusterRole` | enforce | 阻止绑定到 cluster-admin ClusterRole 的 RoleBindings | | `rolebindingClusterAdminRole` | enforce | 阻止绑定到名为 cluster-admin 的 Roles 的 RoleBindings | ### 效率 (4 个策略) | 键 | 默认模式 | 描述 | |---|---|---| | `cpuRequestsMissing` | audit | 当未设置 CPU 请求时发出警告 | | `memoryRequestsMissing` | audit | 当未设置内存请求时发出警告 | | `cpuLimitsMissing` | audit | 当未设置 CPU 限制时发出警告 | | `memoryLimitsMissing` | audit | 当未设置内存限制时发出警告 | ### 可靠性 (10 个策略) | 键 | 默认模式 | 描述 | |---|---|---| | `readinessProbeMissing` | audit | 当缺少就绪探针时发出警告 | | `livenessProbeMissing` | audit | 当缺少存活探针时发出警告 | | `tagNotSpecified` | enforce | 阻止没有标签或使用 `:latest` 的镜像 | | `pullPolicyNotAlways` | audit | 当 imagePullPolicy 不是 Always 时发出警告 | | `priorityClassNotSet` | audit | 当未设置 priorityClassName 时发出警告 | | `deploymentMissingReplicas` | audit | 当 Deployment 副本数少于 2 时发出警告 | | `metadataAndInstanceMismatched` | audit | 当 `metadata.name` 和 `app.kubernetes.io/instance` 不一致时发出警告 | | `topologySpreadConstraint` | audit | 当未定义拓扑分散约束时发出警告 | | `hpaMaxAvailability` | audit | 当 HPA 的 maxReplicas ≤ minReplicas 时发出警告 | | `hpaMinAvailability` | audit | 当 HPA 的 minReplicas ≤ 1 时发出警告 | ### 自定义内置组 通过 Helm 值禁用整个组或单个策略: ``` builtinGroups: security: enabled: true policies: hostNetworkSet: enabled: false # disable this policy runAsRootAllowed: mode: enforce # override mode to enforce efficiency: enabled: false # disable the entire group ``` ## PolicyGroup 自定义资源定义 您还可以创建自己的组,混合使用内置和自定义策略: ``` apiVersion: kubesentry.io/v1alpha1 kind: PolicyGroup metadata: name: my-policies spec: enabled: true displayName: "My Custom Policies" policies: # use a built-in policy with mode override - key: runAsPrivileged mode: enforce # custom policy not in the built-in library - key: noDebugContainers mode: enforce rego: | package kubesentry deny[msg] { c := input.request.object.spec.containers[_] c.name == "debug" msg := "debug containers are not allowed" } match: operations: [CREATE, UPDATE] resources: - apiGroups: [""] apiVersions: ["v1"] resources: ["pods"] ``` 当 `PolicyGroup` 条目与现有的独立 `Policy` (即没有指向任何 `PolicyGroup` 的 `OwnerReference` 的策略) 共享相同的 `key` 时,独立策略具有更高优先级,组条目将被跳过。 ### 违规消息 当策略触发时,响应包含组、键和描述: ``` [security/runAsPrivileged] container "app" must not run as privileged 描述:Fails when securityContext.privileged is true. ``` `audit` 模式的违规以 `AdmissionResponse.Warnings` 形式出现 (请求被允许)。 ## PolicyException — 有时限、经审计的豁免 `PolicyException` 允许您绕过特定策略 (或整个 PolicyGroup,甚至所有策略) ,适用于一组有范围的资源,并在一段有限的时间内有效。 ### 快速示例 ``` apiVersion: kubesentry.io/v1alpha1 kind: PolicyException metadata: name: hr-system-legacy-migration spec: policyRefs: - run-as-privileged match: namespaces: [hr-system] duration: 24h reason: "Legacy billing migration; ticket OPS-1245" ``` ### 字段 - `policyRefs` / `policyGroupRefs` / `allPolicies` — 三者选一。选择特定策略、整个 PolicyGroup 或白名单所有策略。 - `match.namespaces` — 精确的命名空间名称 (无通配符)。 - `match.namespaceSelector` — `Namespace` 对象上的标签。 - `match.resourceSelector` — 被准入对象本身的标签。 - `duration` — 必填,Go `time.Duration` (例如 `24h`、`30m`)。 - `retainAfterExpiry` — 可选;默认 `0` (到期后立即删除)。 - `reason` — 必填,非空的审计字符串。 ### 规则 - 时间原点为 `metadata.creationTimestamp`。编辑 `duration` 会重新计算 `status.expiresAt`;`status.effectiveAt` 不会改变。 - `Expired` 是终态 — 曾经过期的异常对象无法通过编辑 `duration` 恢复。需创建新对象进行续期。 - 只有 `duration`、`retainAfterExpiry` 和 `reason` 是可变的。其他所有字段 (targets, match) 在创建时锁定。 - 不可变性通过 `ValidatingAdmissionPolicy` 强制执行,其 CEL 比较将列表字段 (`policyRefs`、`policyGroupRefs`、`match.namespaces`) 视为**有序**的。重新排序元素而不改变集合的补丁将被拒绝为违反不可变性。应用期间对 JSON 数组重新排序的工具应配置为保留原始顺序,或者您应该重新创建对象而不是修补。 ## 独立策略示例 ``` apiVersion: kubesentry.io/v1alpha1 kind: Policy metadata: name: deny-privileged spec: enforcementMode: enforce match: operations: [CREATE, UPDATE] resources: - apiGroups: [""] apiVersions: ["v1"] resources: ["pods"] rego: | package kubesentry deny[msg] { input.request.object.spec.containers[_].securityContext.privileged == true msg := "privileged containers are not allowed" } ``` 参见 [`examples/`](examples/) 获取更多即用型策略。 ### Pod 拦截 vs. Deployment 拦截 默认情况下,策略匹配 `pods`,这涵盖了所有工作负载类型。当应用 `Deployment` 时,`kubectl apply` 会立即成功 — Webhook 仅在 Deployment 控制器稍后尝试创建 Pod 时触发,因此拒绝会出现在 `kubectl describe deployment` 事件中,而不是在命令行上。 如果您希望对 Deployment 执行 `kubectl apply` 时立即失败,请将 `deployments` 添加到匹配规则**并**为每种资源类型编写单独的 Rego 规则,因为容器路径不同: | 资源 | Rego 中的容器路径 | |---|---| | `pods` | `input.request.object.spec.containers[_]` | | `deployments` | `input.request.object.spec.template.spec.containers[_]` | 同时拦截两者的策略示例 — 参见 [`examples/policy-no-privileged-with-deployments.yaml`](examples/policy-no-privileged-with-deployments.yaml)。 ## 回滚 设置 `spec.rollbackTo.version` — Operator 从目标 `PolicyVersion` 恢复 `spec.rego`、`spec.match` 和 `spec.enforcementMode`,并自动清除该字段: ``` apiVersion: kubesentry.io/v1alpha1 kind: Policy metadata: name: deny-privileged spec: rollbackTo: version: 2 ``` ## 安装 ### 前提条件 - Kubernetes 1.28+ - Helm 3.8+ - 已配置 `kubectl` ### 安装 (最新版) ``` helm install kubesentry \ oci://registry-1.docker.io/wynnhub/kubesentry \ --namespace kubesentry-system \ --create-namespace ``` ### 安装特定版本 ``` helm install kubesentry \ oci://registry-1.docker.io/wynnhub/kubesentry \ --version 1.0.1 \ --namespace kubesentry-system \ --create-namespace ``` ### 从源代码安装 ``` helm install kubesentry charts/kubesentry \ --namespace kubesentry-system \ --create-namespace ``` ### Docker Hub 镜像 | 镜像 | 标签 | |---|---| | [`wynnhub/kubesentry-webhook`](https://hub.docker.com/r/wynnhub/kubesentry-webhook) | `latest`, `v1.0.1`, `v1.0.0` | | [`wynnhub/kubesentry-operator`](https://hub.docker.com/r/wynnhub/kubesentry-operator) | `latest`, `v1.0.1`, `v1.0.0` | ## 配置 | 值 | 默认值 | 描述 | |---|---|---| | `webhook.replicas` | `2` | Webhook 服务器副本数 | | `webhook.image.tag` | *(chart 应用版本)* | 覆盖镜像标签 | | `operator.replicas` | `1` | Operator 副本数 | | `operator.image.tag` | *(chart 应用版本)* | 覆盖镜像标签 | | `tls.secretName` | `kubesentry-tls` | TLS Secret 名称 | | `failurePolicy` | `Fail` | Webhook 故障策略 | | `policy.versionHistoryLimit` | `20` | 每个策略的最大 `PolicyVersion` 对象数 | | `webhookNamespaceSelector` | 排除 `kube-system`, `kubesentry-system` | 命名空间选择器 | | `builtinGroups.security.enabled` | `true` | 启用安全策略组 | | `builtinGroups.efficiency.enabled` | `true` | 启用效率策略组 | | `builtinGroups.reliability.enabled` | `true` | 启用可靠性策略组 | | `builtinGroups..policies..enabled` | — | 启用/禁用单个内置策略 | | `builtinGroups..policies..mode` | — | 覆盖单个策略的模式 (`enforce`\|`audit`) | ## 开发 ### 要求 - Go 1.26+ - Docker (用于跨平台构建) - Helm 3.8+ ### 常用命令 ``` make test # run all tests make build # compile for local arch → bin/webhook, bin/operator make lint # go vet make helm-package # lint + package chart → dist/kubesentry-.tgz ``` ### 发布流水线 ``` # 首次:登录 Docker Hub docker login -u wynnhub helm registry login registry-1.docker.io -u wynnhub # 标记与发布 git tag v1.0.1 make release VERSION=v1.0.1 ``` `make release` 按顺序运行: | 步骤 | 命令 | 输出 | |---|---|---| | 1. 测试 | `go test ./...` | — | | 2. 交叉编译 | `docker run golang:1.26-alpine go build` | `bin/linux-amd64/`, `bin/linux-arm64/` | | 3. 推送镜像 | `docker buildx ... --push` | `wynnhub/kubesentry-webhook:v1.0.1` + `:latest` | | 4. 打包 Chart | `helm package` | `dist/kubesentry-1.0.1.tgz` | | 5. 推送 Chart | `helm push ... oci://` | `oci://registry-1.docker.io/wynnhub/kubesentry:1.0.1` | ### 多平台镜像 镜像以 OCI Manifest List 形式发布。Kubernetes 在拉取时会自动选择正确的平台 — 无需 Chart 配置。 ``` # 检查已发布平台 docker buildx imagetools inspect wynnhub/kubesentry-webhook:latest ``` ### 项目结构 ``` kubesentry/ ├── cmd/ │ ├── webhook/main.go # webhook server entrypoint │ └── operator/main.go # operator + tls-setup subcommand ├── internal/ │ ├── api/v1alpha1/ # CRD type definitions │ ├── builtins/ # embedded Rego library (37 built-in policies) │ │ └── rego/ # .rego files (one per policy) │ ├── webhook/ # OPA evaluator, cache, HTTP handler │ ├── operator/ # Policy, PolicyGroup, and WebhookConfig reconcilers │ └── tlssetup/ # ECDSA cert generation ├── charts/kubesentry/ # Helm chart │ ├── crds/ # CRD manifests (Policy, PolicyVersion, PolicyGroup) │ └── templates/ # K8s resource templates ├── Dockerfile.webhook # runtime-only, no build step └── Dockerfile.operator ``` ## 许可证 Apache License 2.0 — 详情参见 [LICENSE](LICENSE)。
标签:Docker, EVTX分析, Go语言, Groq API, Helm, OPA, pySHACL, RDFlib, Rego, 准入Webhook, 子域名突变, 安全可观测性, 安全合规, 安全策略, 安全防御评估, 提示词设计, 数据科学, 日志审计, 版本控制, 生命周期管理, 程序破解, 策略即代码, 策略组, 网络代理, 聊天机器人安全, 自动化策略, 自定义资源定义, 请求拦截, 资源治理, 资源验证, 集群治理, 靶场