卡尔塞塔
安全代理的开源数据层。
Calseta接收来自任何SIEM的安全警报,用威胁情报和身份上下文丰富它们,并向您的安全代理提供干净、结构化的有效载荷——因此代理将令牌用于推理,而不是管道。
v1.0.0已发布。 Calseta已经上线,可以使用了。自助主机 docker compose up,连接您的SIEM,并开始构建代理。标记此回购以跟踪开发。______________________________________________________________________
问题
为警报调查构建人工智能代理的安全团队一直遇到同样的问题:
- 背景差距 --代理无法访问检测规则文档、运行手册、IR计划和SOP。没有组织背景,代理会产生通用输出。
- 整合负担 --调查单个警报需要调用5个以上的外部API。每个集成都是定制代码,构建起来很昂贵,维护起来很脆弱。
- 代币浪费 -原始API响应冗长且无结构。将它们填充到上下文窗口中的代理会燃烧令牌并产生更差的输出。
- 无确定性层 --富集和警报路由是确定性任务,不应使用LLM令牌。如今,代理自己这样做是因为没有专门构建的基础设施。
Calseta在您的代理看到单个字节之前处理所有这些。
______________________________________________________________________
运作原理
每个警报都经过五个确定的步骤:
Alert Source → Ingest → Normalize → Enrich → Contextualize → Dispatch
│
Your AI Agent ←──┘
(webhook or MCP)- 摄取 --警报通过webhook从Sentinel、Elastic、Splunk或任何兼容源到达
- 规范化 --映射到干净的、代理可读的模式;源特定字段保存在
raw_payload - 丰富 --通过VirusTotal、AbuseIPDB、Okta和Entra并行丰富的指标(IP、域、哈希、帐户)
- 情境化 --通过目标规则附加的检测规则文档、运行手册、IR计划、SOP和工作流文档
- 派遣 -通过webhook传递给注册代理的富集有效载荷,或通过REST API或MCP提取
您的代理收到一个结构化对象,其中包含调查和响应所需的一切。
______________________________________________________________________
为什么不是OCSF?
OCSF是为数据生产者(EDR供应商、网络设备、身份提供者)设计的,可以将他们的字段映射到一个通用模式,这样安全团队就可以从不同的来源摄取到SIEM中。设计选择反映了这一目标:数字类ID、纪元时间戳和 unmapped 针对机器索引和SIEM存储进行了优化的存储桶。
这对人工智能代理来说是错误的权衡。
Calseta标准化为自己的代理原生模式:人类可读的字段名,作为一级输出而非事后补充的丰富数据,以及每个有效载荷中都包含的组织上下文。指标也存在于按以下方式键入的关系表中 (type, value) --一个全局实体模型,以一种不适合OCSF扁平结构的方式跟踪警报中的IOC历史。
目标是让代理将令牌用于推理,而不是解析。
______________________________________________________________________
快速入门
git clone https://github.com/calseta/calseta
cd calseta
cp .env.local.example .env
docker compose up三个服务启动:API服务器(localhost:8000),MCP服务器(localhost:8001),PostgreSQL(localhost:5432).管理用户界面位于 localhost:8000 如果你跑过 make ui-build.
# Bootstrap your first admin API key
docker compose exec api python -m app.cli.create_api_key \
--name my-admin --scopes admin
# Save the printed key (cai_...) — it's shown once, never againAPI参考文件可在 http://localhost:8000/redoc 一旦堆栈运行。
完整设置指南,请访问 docs/architecture/DEVELOPMENT.md.生产部署 docs/guides/HOW_TO_DEPLOY.md.
______________________________________________________________________
您的代理人会收到什么
每个警报上都有一个富集的有效载荷:
{
"event": "alert.enriched",
"alert": {
"uuid": "9f2a-b3c1-...",
"title": "Impossible Travel Detected",
"severity": "High",
"source": "elastic",
"status": "Open",
"created_at": "2025-01-15T03:42:18.441Z"
},
"indicators": [
{
"type": "ip",
"value": "185.220.101.47",
"first_seen": "2024-08-12T00:00:00.000Z",
"last_seen": "2025-01-15T03:42:18.441Z",
"geo": { "country": "Germany", "city": "Frankfurt am Main" },
"virustotal": { "malicious": 14, "suspicious": 2, "score": "47/94" },
"abuseipdb": { "score": 97, "categories": ["hacking", "vpn"] },
"greynoise": { "classification": "malicious", "name": "TOR Exit Node", "noise": true }
},
{
"type": "ip",
"value": "67.180.201.3",
"first_seen": "2022-03-05T00:00:00.000Z",
"last_seen": "2025-01-15T01:10:42.000Z",
"geo": { "country": "United States", "city": "San Francisco" },
"virustotal": { "malicious": 0, "suspicious": 0, "score": "0/94" },
"abuseipdb": { "score": 4, "categories": [] }
},
{
"type": "account",
"value": "nick.hathaway@calseta.com",
"okta": {
"status": "ACTIVE",
"profile": {
"full_name": "Nick Hathaway",
"title": "Senior Software Engineer",
"department": "Engineering",
"employee_type": "employee",
"location": "San Francisco, CA, US",
"manager": "Emily Rhodes",
"manager_email": "emily.rhodes@calseta.com"
},
"account_created": "2022-03-14T09:00:00.000Z",
"last_login": "2025-01-14T22:31:05.000Z",
"last_password_change": "2024-10-01T11:23:44.000Z",
"mfa_factors": [
{ "type": "push", "provider": "OKTA", "status": "ACTIVE" },
{ "type": "totp", "provider": "GOOGLE", "status": "ACTIVE" }
],
"group_membership": ["Engineering", "VPN-Users", "github-org-members"]
}
}
],
"detection_rule": {
"name": "Impossible Travel",
"rule_id": "impossible-travel-v1",
"severity": "High",
"priority": "High — likely credential compromise or session hijacking",
"mitre_tactics": ["TA0001 - Initial Access", "TA0005 - Defense Evasion", "TA0006 - Credential Access"],
"mitre_techniques": ["T1078 - Valid Accounts"],
"false_positive_tags": ["vpn", "corporate_proxy", "executive_travel"],
"blind_spots": ["same-region cross-state travel", "VPN or proxy exit nodes"],
"goal": "Detect credential compromise or session hijacking via geo-velocity analysis.",
"documentation": "## Overview\nCorrelates sign-in timestamps and geolocation to flag logins from two countries within a short window — physically impossible without credential theft or session hijacking.\n\n## Responses\n1. Confirm travel or VPN activity with user\n2. Force sign-out and reset credentials\n3. Review concurrent risky sign-in alerts\n4. Notify SOC team of potential compromise"
},
"past_alerts": [
{
"uuid": "3c1d-a2f4-...",
"title": "Impossible Travel Detected",
"status": "closed",
"classification": "true_positive_suspicious_activity",
"closed_at": "2024-11-03T14:22:00.000Z",
"indicators": ["91.108.56.130", "nick.hathaway@calseta.com"],
"analyst_notes": "Confirmed malicious. Sessions revoked. Password reset. INC-2847."
}
],
"context_documents": [
{
"title": "Company Incident Response Plan",
"type": "ir_plan",
"content": "## Incident Response Plan\n1. Detect & triage\n2. Contain affected accounts\n3. Notify security lead\n4. Preserve evidence\n5. Remediate & recover..."
},
{
"title": "Account Compromise Runbook",
"type": "runbook",
"content": "## Account Compromise Response\n1. Isolate account\n2. Revoke active sessions\n3. Force password reset\n4. Re-enroll MFA..."
}
],
"workflows": [
{ "name": "Revoke User Sessions", "description": "Terminate all active sessions for the affected account across all providers." },
{ "name": "Force Password Reset", "description": "Expire current credentials and require the user to set a new password on next login." },
{ "name": "Request User Attestation", "description": "Send the user a confirmation request to verify whether the activity was theirs." },
{ "name": "Notify Security Team", "description": "Page the on-call analyst and open a P1 incident ticket for human review." }
]
}______________________________________________________________________
特性
| 特性 | 描述 |
|---|---|
| 警报摄入 | 基于插件。附带Sentinel、Elastic、Splunk和通用webhook |
| 浓缩发动机 | 异步、并行、缓存。VirusTotal、AbuseIPDB、Okta、Entra |
| 检测规则库 | 摄入时自动创建。MITRE用标记文件绘制 |
| 上下文文档 | 运行手册、IR计划、SOP——通过目标规则附加到警报中 |
| 工作流目录 | SOC剧本作为结构化降价,作为背景出现在代理人面前 |
| REST API | 所有实体的完整CRUD。包含OpenAPI规范 |
| MCP服务器 | 端口8001上的本地MCP。可与任何MCP兼容的代理或工具配合使用 |
| 指标API | 警报量、MTTD、假阳性率——可通过REST和MCP访问 |
| API密钥验证 | 用于代理访问的作用域API密钥 |
| 管理用户界面 | 内置深色主题管理面板,用于分类、配置和监控 |
______________________________________________________________________
管理用户界面
Calseta附带了一个内置的管理面板,该面板由同一个FastAPI容器提供服务,不需要额外的基础设施。
用户界面提供:
- 仪表盘 -指标API的KPI卡和图表
- 警报 --带过滤器的分页列表,带指标、发现、上下文、活动时间线和原始有效载荷查看器的深入查看
- 工作流 --列表、创建、代码编辑器、测试沙盒、运行历史和审批管理
- 设置 -检测规则、上下文文档、源集成、代理注册和API密钥
身份验证使用与REST API相同的API密钥。粘贴a cai_ 登录键。
UI是用Vite构建的React SPA。在生产环境中,它被编译为静态文件,并由根路径上的FastAPI提供服务。在开发过程中,Vite的开发服务器在端口5173上运行,带有热重载,并将API调用代理到后端。
# Development (hot reload)
make ui-dev # http://localhost:5173
# Production build (served at http://localhost:8000)
make ui-build______________________________________________________________________
沙盒模式
沙盒模式允许您使用模拟丰富数据和预反馈警报来探索完整的平台,不需要真正的API密钥。
启用它 通过设置两个env变量:
ENRICHMENT_MOCK_MODE=true
SANDBOX_MODE=true然后正常启动:
docker compose up您将获得:
- 4个模拟富集提供者(VirusTotal、AbuseIPDB、Okta、Entra)——确定性响应,无HTTP调用
- 来自Sentinel、Elastic和Splunk的5个预种子警报,具有现实场景(暴力破解、恶意软件、不可能的旅行、数据泄露、编码的PowerShell)
- 带有MITRE映射和调查文档的检测规则
- 通过目标规则将上下文文档(运行手册、SOP、IR计划)与警报相匹配
- 公共只读API密钥:
cai_sandbox_demo_key_not_for_production - UTC午夜每日自动重置——用户创建的数据被擦除,赛程重新播种
手动种子/重置:
# Seed sandbox data on an existing database
docker compose exec api python -m app.cli.seed_sandbox
# Or via Make
make seed-sandbox禁用它 通过删除或将env变量设置为 false。使用相同的Docker镜像——没有单独的沙盒构建。
______________________________________________________________________
技术栈
Python 3.12·FastAPI·PostgreSQL 15·SQLAlchemy 2.0异步·Pydantic v2·Alembic·delay·httpx·MCP Python SDK·Docker·React 19·Vite·顺风CSS·TanStack查询/路由器
______________________________________________________________________
项目状态
v1.0.0已经发布。所有核心系统都经过构建和测试:
- \[x\] 架构和API设计
- \[x\] 项目脚手架和Docker Compose
- \[x\] 数据库模式和迁移
- \[x\] 警报接收(Sentinel、Elastic、Splunk、通用webhook)
- \[x\] 富集引擎(VirusTotal、AbuseIPDB、Okta、Entra)
- \[x\] 上下文文档系统
- \[x\] 带有审批门的工作流引擎
- \[x\] 代理注册和webhook调度
- \[x\] REST API(完整的CRUD,OpenAPI规范)
- \[x\] MCP服务器(12个资源,6个工具)
- \[x\] 管理UI
- \[x\] 代理示例
- \[x\] 1200+次测试
______________________________________________________________________
贡献
欢迎捐款。目前最有价值的领域:
- Bug报告和反馈
- 其他警报源集成
- 额外的富集提供程序(通过CRUD API无代码,或社区JSON配置)
- 示例代理和工作流脚本
看 CONTRIBUTING.md 关于如何开始。阅读 CLAUDE.md 和 PRD.md 在打开PR之前,它们涵盖了架构决策、编码理念和扩展模式。
该平台是为扩展而设计的。警报源使用干净的插件接口——添加新源是一个文件,不需要进行核心更改。扩展提供程序是数据库驱动的-添加新的提供程序只需一个API调用或JSON配置,不需要更改代码,也不需要重新启动。社区提供程序以JSON文件共享,并与一个 curl 命令。完整的操作指南(docs/guides/HOW_TO_ADD_ALERT_SOURCE.md, docs/guides/HOW_TO_ADD_ENRICHMENT_PROVIDER.md, docs/project/COMMUNITY_INTEGRATIONS.md)v1版本附带了可运行的示例代理。
______________________________________________________________________
链接
- 网站: calseta.com
- 许可证: Apache 2.0
______________________________________________________________________
*Calseta不是AI SOC产品。它不构建、托管或运行AI代理。正是数据基础架构使您的代理快速、准确且经济高效。*
