sufield/stave
GitHub: sufield/stave
一款离线云配置安全评估工具,通过分析本地配置快照检测 S3 存储桶的不安全配置,无需云凭证或网络访问。
Stars: 0 | Forks: 0
# Stave
云配置快照的离线安全评估器。
[文档](docs/index.md) | [快速入门](docs/time-to-first-finding.md) | [版本发布](https://github.com/sufield/stave/releases) | [安全](SECURITY.md) | [贡献](CONTRIBUTING.md)
[](https://securityscorecards.dev/viewer/?uri=github.com/sufield/stave)
[](https://goreportcard.com/report/github.com/sufield/stave)
[](https://codecov.io/gh/sufield/stave)
## Stave 存在的原因
S3 公开暴露问题之所以持续存在,是因为现有工具要求:
- 云凭证才能扫描
- 网络访问才能查询 API
- 运行时环境扩大了攻击面
这些限制阻碍了连续、可重复的安全评估。
Stave 的工作方式不同。它针对本地配置快照评估安全控制 —— 离线、确定性且无需凭证。
## Stave 的功能
Stave 读取时间点配置快照,并根据 YAML 定义的安全控制对其进行评估:
- **43 个内置 S3 控制** —— 公开暴露、ACL 提权、加密、版本控制、生命周期、对象锁、日志记录、治理、接管预防
- **不安全持续时间追踪** —— 检测资产在多次快照中保持错误配置的时长
- **确定性输出** —— 相同的输入总是产生相同的发现结果
- **执行产物** —— 生成包含具体修复措施的修复计划
所有评估均在本地运行。无需云凭证。无需网络访问。设计上支持物理隔离。
## 快速入门
### 安装
```
brew tap sufield/tap && brew install stave
```
或从源码构建:
```
git clone https://github.com/sufield/stave.git
cd stave && make build
```
### 60 秒内完成首次发现
```
stave demo
cat stave-report.json
```
预期输出:
```
Found 1 violation: CTL.S3.PUBLIC.001
Asset: s3://demo-public-bucket
Evidence: BlockPublicAccess=false, ACL=public-read
Fix: enable account/bucket Block Public Access + deny public principals
```
与安全配置进行对比:
```
stave demo --fixture known-good
```
### 完整工作流
```
stave init --profile aws-s3
stave validate
stave apply --format json > output/evaluation.json
stave diagnose
```
## 工作原理
```
Capture → Evaluate → Act
1. Capture Export resource configurations as JSON snapshots
2. Evaluate Stave reads snapshots + evaluates against safety controls
3. Act Review findings, remediate, re-evaluate
```
快照必须符合 [observation contract](docs/observation-contract.md)。您至少需要两个快照(两个时间点)才能让 Stave 计算不安全持续时间窗口。
## Stave 的对比
| 类别 | 示例 | 无需凭证 | 离线快照 | 确定性 | 感知持续时间 | 执行 |
|----------|----------|:---:|:---:|:---:|:---:|:---:|
| CSPM | AWS Config, Wiz, Prisma, Prowler | ❌ | ❌ | ❌ | ❌ | ⚠️ |
| IaC policy | OPA, Checkov, tfsec | ✅ | ❌ | ✅ | ❌ | ❌ |
| S3 审计器 | ScoutSuite, s3audit, CloudMapper | ❌ | ❌ | ❌ | ❌ | ❌ |
| **Stave** | | ✅ | ✅ | ✅ | ✅ | ✅ |
可以将其理解为:
| 工具类型 | 类比 |
|-----------|---------|
| CSPM | 运行时云扫描器 |
| IaC policy | 模板检查器 |
| S3 auditor | 暴露枚举器 |
| **Stave** | 快照安全评估器 |
## 安全模型
- **零网络访问** —— 评估从不联系外部服务
- **无需凭证** —— 处理导出的快照,而非实时 API
- **确定性输出** —— `--now` 标志固定评估时间以确保可复现性
- **输出脱敏** —— `--sanitize` 从发现结果中清除资产标识符
- **签名发布** —— 使用 Sigstore cosign 签名的 SHA256 校验和
- **构建来源** —— 发布存档上的 GitHub 原生 SLSA 证明
- **SBOM** —— 每个版本附带的 SPDX 软件物料清单
详情:[安全与信任](docs/trust/01-security-and-trust.md) | [威胁模型](docs/security/threat-model.md) | [验证版本](docs/trust/verify-release.md)
## 内置控制
Stave 跨越 15 个类别提供 43 个 S3 控制:
| 类别 | 控制数 | 检测内容 |
|----------|:---:|-----------------|
| `public` | 13 | 通过策略、ACL、网站托管、前缀暴露进行的公开读取、写入、列出 |
| `acl` | 3 | ACL 提权 (WRITE_ACP)、侦察 (READ_ACP)、FULL_CONTROL 授权 |
| `access` | 5 | 跨账户访问、通配符操作、外部写入、认证用户访问 |
| `encrypt` | 4 | 缺少静态加密、传输中加密、PHI 的 KMS 要求 |
| `versioning` | 2 | 版本控制已禁用、备份上缺少 MFA 删除 |
| `lock` | 3 | 缺少对象锁、模式错误、PHI 保留期不足 |
| `logging` | 1 | 访问日志已禁用 |
| `lifecycle` | 2 | 缺少生命周期规则、PHI 保留期低于 HIPAA 最低标准 |
| `network` | 1 | 无 IP/VPC 条件的公开主体策略 |
| `governance` | 1 | 缺少数据分类标签 |
| `write_scope` | 2 | 前缀范围上传、不受限制的内容类型 |
| `tenant` | 1 | 缺少基于前缀的租户隔离 |
| `takeover` | 2 | 悬空桶引用、悬空 CDN 源 |
| `artifacts` | 1 | 公开桶上暴露的 VCS 产物 |
| `misc` | 2 | 阻碍安全证明的数据不完整、完整性检查 |
完整控制参考:[docs/controls/authoring.md](docs/controls/authoring.md)
## CLI 命令
| 命令 | 用途 |
|---------|---------|
| `demo` | 60 秒内完成首次发现 |
| `quickstart` | 自动检测快照并评估 |
| `status` | 项目状态和后续步骤 |
| `doctor` | 环境就绪检查 |
| `init` | 项目脚手架 |
| `validate` | 输入正确性 |
| `plan` | 就绪检查门禁 |
| `apply` | 评估控制,生成发现 |
| `diagnose` | 解释意外结果 |
| `trace` | 子句级别谓词详情 |
| `ingest` | 将 AWS 快照转换为 observations |
| `controls list` | 列出可用控制 |
| `explain` | 显示控制所需的字段 |
| `lint` | 控制质量检查 |
| `snapshot upcoming` | 下一次快照计划 |
| `snapshot prune` | 有界的快照保留 |
| `snapshot diff` | 快照间的差异分类 |
| `ci baseline` | 保存发现基线 |
| `ci gate` | 发现新违规时使 CI 失败 |
| `ci fix-loop` | 在 CI 中验证修复 |
```
validate → plan → apply → diagnose
↓ ↓ ↓
Inputs Findings Insights
OK? Found? Why?
↓
trace
(clause detail)
```
## 概念
| 术语 | 定义 |
|------|------------|
| **Snapshot (快照)** | 基础设施资产的时间点观察 (JSON) |
| **Asset (资产)** | 具有属性的单个基础设施组件(例如 S3 bucket) |
| **Control (控制)** | 资产必须满足的安全规则 (YAML, `ctrl.v1` schema) |
| **Unsafe predicate (不安全谓词)** | 将资产标记为不安全的条件 |
| **Finding (发现)** | 包含证据和修复指导的已检测违规 |
| **Episode (事件段)** | 资产保持不安全状态的连续时间段 |
| **Max unsafe duration (最大不安全持续时间)** | 资产在被判定为违规前可保持不安全状态的最长时间 |
## 数据格式
| 格式 | Schema | 用途 |
|--------|--------|---------|
| Observations | `obs.v0.1` | 标准化快照 —— 扁平 JSON,每个时间戳一个文件 |
| Controls | `ctrl.v1` | 安全规则 —— 带有 `unsafe_predicate` 的 YAML |
| Output | `out.v0.1` | 发现结果 —— 带有 `summary` 和 `findings` 数组的 JSON |
Schema 参考:[ctrl.v1](docs/schema/ctrl.v1.md) | [obs.v0.1](docs/schema/obs.v0.1.md) | [out.v0.1](docs/schema/out.v0.1.md)
## 状态
**v0.0.1 (MVP)**
- 仅限 AWS S3
- 仅限配置快照
- 离线评估
### Schema 稳定性
| Schema | 版本 | 状态 |
|--------|---------|--------|
| Observations | `obs.v0.1` | 稳定 |
| Controls | `ctrl.v1` | 稳定 |
| Output | `out.v0.1` | 稳定 |
### 退出代码
| 代码 | 含义 |
|------|---------|
| 0 | 成功 |
| 2 | 输入错误 |
| 3 | 发现违规 |
| 4 | 内部错误 |
| 130 | SIGINT |
## 文档
- [从这里开始](docs/start-here.md)
- [首次发现时间](docs/time-to-first-finding.md)
- [设计理念](docs/design-philosophy.md)
- [系统控制即代码](docs/system-invariant-as-code.md)
- [评估语义](docs/evaluation-semantics.md)
- [编写控制](docs/controls/authoring.md)
- [用户文档](docs/user-docs.md)
- [架构概览](docs/architecture/overview.md)
- [完整文档索引](docs/index.md)
## 贡献
有关设置、开发工作流和 PR 指南,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
- [Bug 复现指南](docs/contrib/bug-repro-guide.md)
- [Bug 模板](docs/bug-template.md)
- [CLI 样式指南](docs/cli-style-guide.md)
## 许可证
[Apache License 2.0](LICENSE)
标签:Air-gapped 安全, CLI 工具, CSPM, DevSecOps, EVTX分析, Go 语言, Homebrew安装, S3 安全, TinkerPop, 上游代理, 云安全监控, 关系图谱, 动态调试, 反取证, 基线检查, 安全合规, 安全评估, 快照分析, 文档结构分析, 无凭证扫描, 日志审计, 本地安全扫描, 离线分析, 网络代理, 网络安全审计, 误配置检测, 静态分析