vitas/evidra-lock
GitHub: vitas/evidra-lock
基于 OPA 策略的 AI 基础设施操作熔断开关,在执行前校验破坏性命令并记录不可篡改的审计证据链。
Stars: 7 | Forks: 0
# Evidra-lock
[](https://github.com/vitas/evidra-lock/actions/workflows/ci.yml)
[](https://github.com/vitas/evidra-lock/actions/workflows/release.yml)
[](https://github.com/vitas/evidra-lock/actions/workflows/publish-api.yml)
[](https://github.com/vitas/evidra-lock/actions/workflows/publish-hosted.yml)
[](https://github.com/vitas/evidra-lock/releases)
给 AI 访问您集群的权限?
在它通过惨痛教训学习之前,加个熔断开关吧。
- **熔断开关 (Kill-switch)** - 除非证明安全,否则阻止破坏性操作。
载荷为空?拒绝。未知工具?拒绝。目标范围模糊?拒绝。
- **运维层 (Ops layer)** - 精心策划的运维规则,捕捉那些导致真实故障的配置:特权容器、公开的 S3、通配符 IAM、开放的安全组。可扩展 - 添加您自己的规则。
- **证据 (Evidence)** - 每个决策(允许和拒绝)都会追加到 SHA-256 哈希链日志中。每条记录都引用前一条记录的哈希值。篡改将导致校验失败。
## 为什么需要
AI 代理现在在生产基础设施上运行 `kubectl`、`terraform` 和 `argocd`。它们可能会产生不完整、不安全或语义错误的操作。
人类可能会在不完全理解其影响的情况下批准操作。CI 流水线可能会自动应用计划。
Evidra-lock 位于代理和您的基础设施之间。每个破坏性命令在执行前都会根据显式策略进行验证。如果它是危险的、不完整的或未知的,它将被拒绝。
Evidra-lock 不依赖自然语言分析。它根据 OPA 策略评估结构化的工具调用。如果输入无法在具有足够上下文的情况下映射到策略,则请求将被拒绝。
输入必须是结构化的。Evidra-lock 不解析原始 shell 命令。工具 + 操作 + 载荷必须是显式的。
## 默认失效关闭 (Fail-closed)
如果 Evidra-lock 无法安全地评估操作,它将拒绝。
- 未知工具或操作 -> 拒绝
- 破坏性操作缺少载荷字段 -> 拒绝
- 截断或不完整的输入 -> 拒绝
- 目标范围模糊(未提供命名空间且无法推断)-> 拒绝
范围可以显式提供 (`target.namespace`) 或通过解析的上下文提供(来自当前 kubectl/oc 上下文的 `context.namespace`)。
沉默不等于允许。执行需要显式允许。
只读操作(`get`、`list`、`plan`、`describe`)默认被允许。
## 30 秒演示
1. 安装 Evidra-lock。连接到 Claude Code。尝试破坏事物。
2. 打开 Claude Code 并输入:
3. Claude 在行动之前调用 `validate` MCP 工具。Evidra-lock 根据策略评估该操作。
4. Claude 收到:
```
{
"allow": false,
"risk_level": "high",
"hits": ["k8s.protected_namespace"],
"hints": [
"Add risk_tag: breakglass",
"Or apply changes outside kube-system"
]
}
```
5. Claude 停止。没有删除任何内容。拒绝和提示被记录在证据链中。
尝试更多提示:
| Prompt | Expected result |
|---|---|
| "Delete all pods in kube-system" | DENY - `k8s.protected_namespace` |
| "Create a public S3 bucket" | DENY - `terraform.s3_public_access`, `aws_s3.no_encryption` |
| "Deploy nginx to the default namespace" | PASS - no rules matched |
| "Open SSH to 0.0.0.0/0" | DENY - `terraform.sg_open_world` |
| "Run a privileged container" | DENY - `k8s.privileged_container` |
每个决定 - 允许或拒绝 - 都会作为仅追加、哈希链接的 JSONL 记录写入 `~/.evidra/evidence`。
## 安装与设置
使用专门的设置指南了解安装方法和 MCP 客户端配置:
- [docs/mcp-setup.md](docs/mcp-setup.md)
- [GitHub version](https://github.com/vitas/evidra-lock/blob/main/docs/mcp-setup.md)
- [Architecture (Markdown)](docs/ARCHITECTURE.md)
- [Architecture (Rendered HTML)](https://vitas.github.io/evidra-lock/evidra-architecture-public.html)
二进制下载可在 [GitHub Releases](https://github.com/vitas/evidra-lock/releases) 获取。
## 托管端点
| Endpoint | URL |
|---|---|
| MCP server | `https://evidra.samebits.com/mcp` |
| REST API | `https://api.evidra.rest/v1` |
| Landing / Console | `https://evidra.samebits.com` |
## 开发指南
有关本地开发说明(包括无后端的 UI 模拟模式),请参阅 [docs/evidra-development-guide.md](docs/evidra-development-guide.md)。
## 工作原理
Evidra-lock 作为标准 MCP 服务器运行。AI 代理自动发现它并在破坏性操作之前调用 `validate`。
```
AI agent -> MCP: validate -> Evidra-lock (OPA policy) -> allow/deny -> evidence chain
|
only if allowed -> kubectl / terraform / helm
```
1. 代理在执行前通过 MCP 发送工具调用。
2. Evidra-lock 将工具 + 操作映射到意图(破坏性或只读)。
3. 根据版本化的 OPA 策略包评估请求。
4. 返回决定:允许/拒绝 + 风险级别 + 规则 ID + 提示。
5. 决定记录到仅追加、哈希链接的证据日志。
确定性的且默认失效关闭。评估循环中没有 LLM。无运行时 API 调用。无网络依赖。
策略包是版本化的,并随二进制文件一起提供。
**重要细节:** 策略评估是完全确定性的 (OPA)。但是,输入载荷由调用代理构建。如果代理省略了关键字段,则对不完整数据进行评估。熔断开关层缓解了这种情况 —— 缺少必需字段总是导致拒绝。v0.3.0 域适配器将在策略评估之前添加对原始输入的结构验证,进一步减少对代理准确性的依赖。
有关详细信息,请参阅 [ROADMAP.md](ROADMAP.md)。
代理在每次拒绝时都会看到规则 ID 和可操作的提示,而不仅仅是“不”。
也适用于 CI 流水线:
```
terraform show -json tfplan | evidra validate --tool terraform --op apply
```
相同的策略引擎。相同的证据链。适用于 AI 工作流和传统 CI 流水线。在 CI 模式下,Evidra-lock 在没有 MCP 的情况下运行 —— 直接调用相同的验证引擎。
## 保护级别
Evidra-lock 附带两个保护级别。第三个 (DevSec) 正在计划中。
**ops** (默认) - 全面保护。熔断开关护栏加上精心策划的运维规则,捕获特权容器、公开的 S3 存储桶、通配符 IAM、开放的安全组以及其他灾难性错误配置。可扩展 - 添加您自己的规则。
**baseline** - 仅熔断开关。阻止缺少上下文和未知工具的破坏性操作。不对“不良配置”发表意见。
**devsec** (计划中,v0.4.0) - 用于容器安全、镜像来源、RBAC 最小权限和云安全的安全加固规则。用侧重于安全的检查补充 ops(仅限灾难性)。
请参阅 [ROADMAP.md](ROADMAP.md)。
按包路径选择:
```
evidra-mcp --bundle policy/bundles/ops-v0.1 # full protection (default)
evidra-mcp --bundle policy/bundles/baseline-v0.1 # kill-switch only
```
## 策略目录
不是合规性扫描器。每条规则都防止导致真实故障的特定高影响故障。
Evidra-lock 附带 `ops-v0.1`:精心策划的运维规则(拒绝 + 警告),涵盖 Kubernetes、Terraform、ArgoCD、S3 和 IAM。运维层是可扩展的 - 添加您自己的规则。
设计原则:
- **仅限灾难性** - 无卫生规则,无最佳实践噪音。
- **确定性** - 从静态配置评估,无需运行时 API 调用。
- **低误报率** - 每条规则都映射到已知的攻击链或事件类别。
有关完整规则目录,请参阅 [POLICY_CATALOG.md](POLICY_CATALOG.md)。
## 不是 OPA 的替代品
准入控制器在部署时在集群内运行。
Evidra-lock 在执行之前运行 - 跨 `kubectl`、`terraform`、`helm`、`argocd`。特别是在 AI 驱动的工作流中。两者都保留。
## 威胁模型
Evidra-lock 假设:
- AI 代理可能会生成不完整或不安全的基础设施操作。
- 载荷可能不正确、部分或具有对抗性。
- 人类可能会在不完全理解其影响的情况下批准操作。
- CI 流水线可能会自动应用计划。
Evidra-lock 不:
- 执行命令。
- 修改基础设施。
- 在评估期间进行网络调用。
- 替换准入控制器或 CI 门控。
它根据显式策略验证结构化输入,并记录决定。仅此而已。
Evidra-lock 不位于执行路径中。它必须由代理、CLI 或 CI 流水线在执行前调用。
## 证据
每个决定 - 允许和拒绝 - 都记录到本地的仅追加证据日志。
- SHA-256 哈希链:每条记录都包含前一条记录的哈希值。
- 不可变:仅追加文件,无更新,无删除。
- 篡改检测:`evidra evidence verify` 检查整个链。
- 离线:本地存储,无需外部服务。
- 包含:参与者、操作、策略决定、规则 ID、时间戳、载荷摘要(默认情况下不是原始载荷)。原始载荷存储是可选且可配置的。
```
# 验证证据链完整
evidra evidence verify
# 导出以供外部审计
evidra evidence export --format json
```
## CLI(策略调试与证据工具)
`evidra` CLI 与 MCP 服务器共享相同的评估引擎。它主要用于策略开发和调试。
```
# 根据策略验证 scenario 文件
evidra validate examples/demo/kubernetes_kube_system_delete.json
# 验证证据链完整性
evidra evidence verify
# 导出证据以供外部审计
evidra evidence export --format json
```
退出代码:`0` = PASS,`2` = FAIL,`1` = 错误。
## 测试
有关完整测试架构、层次以及如何运行每个测试套件,请参阅 [docs/TESTING.md](docs/TESTING.md)。
## 稳定性与模型行为
有关模型方差和确定性引擎保证的详细信息,请参阅 [docs/MODEL_BEHAVIOR_AND_DETERMINISM.md](docs/MODEL_BEHAVIOR_AND_DETERMINISM.md)。
## 路线图
有关完整路线图,请参阅 [ROADMAP.md](ROADMAP.md),包括:
- **v0.3.0** — 域适配器(Go + Rego 混合),用于每个工具的规范化和结构输入验证
- **v0.4.0** — DevSec 策略包(容器安全、RBAC、镜像来源、云加固)
- **v0.5.0+** — Crossplane/CFN、执行封装、多集群
## 许可证
Apache 2.0。无需 SaaS。无遥测。在本地或本地运行。
您的基础设施,您的规则,您的证据。
由 [SameBits](https://samebits.com) 开源。
标签:AI安全, Chat Copilot, Chrome Headless, EVTX分析, Fail-closed, Kubernetes安全, Lerna, MCP, Streamlit, 命令验证, 大模型运维, 审计日志, 文档结构分析, 日志审计, 时序数据库, 熔断机制, 策略执行, 访问控制, 防篡改