holbein-io/ephor-scanner
GitHub: holbein-io/ephor-scanner
一款 Kubernetes 漏洞扫描代理,定期发现集群工作负载并使用 Trivy 扫描容器镜像,将结果汇总至 Ephor API 实现集中式漏洞管理。
Stars: 1 | Forks: 0
# Ephor Scanner
Kubernetes 漏洞扫描代理,用于发现运行中的工作负载,使用 [Trivy](https://github.com/aquasecurity/trivy) 扫描容器镜像,并将结果报告给 [Ephor](https://github.com/holbein-io/ephor) API。
## 工作原理
扫描器作为 Kubernetes CronJob 运行,每次执行时运行一个无状态的 6 阶段流水线:
```
1. Load config Read environment variables, initialize logging
|
2. Discover workloads Query K8s API for Deployments, StatefulSets,
| DaemonSets, and CronJobs across target namespaces
|
3. Deduplicate images Extract unique container images across all workloads
|
4. Scan images Update Trivy vulnerability DB, then scan all unique
| images concurrently (configurable parallelism)
|
5. Build payloads Group results by namespace, map to Ephor schema
|
6. Deliver POST per-namespace results to /api/v1/scans/ingest
```
每次运行都会生成一个扫描组 ID (UUID),用于将所有按命名空间划分的 payload 关联在一起。镜像扫描失败会被记录,但不会阻止成功结果的交付。
## 快速开始
前置条件:一个已安装 [Helm 3](https://helm.sh/) 的 Kubernetes 集群。
```
helm install ephor-scanner ./deploy/helm/ephor-scanner \
--set ephor.apiUrl=http://ephor-api:8080 \
--set scan.namespaces=default,production
```
扫描器将按默认计划运行(每 6 小时一次)。要触发立即扫描:
```
kubectl create job --from=cronjob/ephor-scanner ephor-scanner-manual
```
## 配置
所有配置均通过环境变量完成。使用 Helm chart 部署时,这些变量通过 `values.yaml` 文件设置。
### 必需项
| Variable | Description |
|---|---|
| `EPHOR_API_URL` | Ephor API 的 Base URL(例如 `http://ephor-api:8080`) |
| `SCAN_NAMESPACES` | 要扫描的 Kubernetes 命名空间的逗号分隔列表 |
### 可选项
| Variable | Default | Description |
|---|---|---|
| `SCAN_CONCURRENCY` | `3` | 并行镜像扫描的数量 |
| `SCAN_SEVERITY` | `CRITICAL,HIGH,MEDIUM,LOW` | 要包含的严重性级别 |
| `SCAN_WORKLOAD_TYPES` | `Deployment,StatefulSet,DaemonSet,CronJob` | 要发现的工作负载类型 |
| `EPHOR_AUTH_HEADER` | _(none)_ | 自定义认证 header 名称 |
| `EPHOR_AUTH_VALUE` | _(none)_ | 认证 header 值 |
| `TRIVY_BINARY` | `trivy` | Trivy 可执行文件的路径 |
| `TRIVY_CACHE_DIR` | `/tmp/trivy-cache` | Trivy 缓存目录 |
| `TRIVY_TIMEOUT` | `300` | 单个镜像扫描超时时间(秒) |
| `TRIVY_DB_UPDATE_TIMEOUT` | `60` | 漏洞数据库更新超时时间(秒) |
| `TRIVY_DB_REPO` | _(none)_ | Trivy DB 的自定义 OCI 仓库(离线环境) |
| `TRIVY_SKIP_DB_UPDATE` | `false` | 如果缓存已预填充,则跳过 DB 更新 |
| `LOG_LEVEL` | `info` | 日志级别(`debug`, `info`, `warn`, `error`) |
| `LOG_FORMAT` | `json` | 日志格式(`json` 或 `text`) |
## Helm Values
位于 `deploy/helm/ephor-scanner/` 的 Helm chart 关键值:
| Value | Default | Description |
|---|---|---|
| `schedule` | `0 */6 * * *` | CronJob 调度计划 |
| `ephor.apiUrl` | `""` | Ephor API URL(必需) |
| `scan.namespaces` | `""` | 目标命名空间(必需) |
| `scan.concurrency` | `3` | 并行镜像扫描数 |
| `cache.enabled` | `true` | 通过 PVC 在多次运行间持久化 Trivy DB |
| `cache.size` | `1Gi` | PVC 存储大小 |
| `activeDeadlineSeconds` | `3600` | 最大作业运行时间 |
| `resources.requests.memory` | `128Mi` | 内存请求 |
| `resources.limits.memory` | `512Mi` | 内存限制 |
有关可配置值的完整列表,请参阅 `deploy/helm/ephor-scanner/values.yaml`。
## 开发
前置条件:Go 1.25+, Make。
```
# 构建
make build
# 运行单元测试
make test
# 运行集成测试(需要 Trivy 二进制文件和网络访问)
make test-integration
# Lint
make lint
# 格式化
make fmt
```
二进制文件构建到 `bin/ephor-scanner`。版本号从 git 标签自动检测。
### Docker
```
docker build -t ephor-scanner .
```
该镜像为多阶段构建:从源代码编译的 Go 二进制文件,从 `aquasec/trivy:0.69.3` 复制的 Trivy 二进制文件,两者都放置在 Alpine 3.21 基础镜像上。以非 root 用户 (uid 10001) 运行。
## 架构
```
ephor-scanner/
cmd/scanner/ Entry point (6-phase orchestration)
config/ Environment variable loading
internal/
api/ HTTP client for Ephor API delivery
discovery/ Kubernetes workload discovery (client-go)
models/ Data structures matching Ephor API schema
processor/ Image deduplication, concurrent scanning, payload building
scanner/ Trivy CLI wrapper (os/exec)
deploy/helm/ Helm chart (CronJob, RBAC, ConfigMap, Secret, PVC)
tests/integration/ Integration tests
docs/adr/ Architecture Decision Records
```
设计决策记录在 `docs/adr/` 中。关键选择:
- **Trivy 作为 CLI wrapper** (ADR-001) -- 通过稳定的 JSON 接口将扫描器版本与 Trivy 版本解耦
- **无状态架构** (ADR-002) -- 无本地状态,所有持久化由 Ephor API 处理
- **直接 K8s API 发现** (ADR-003) -- 使用 client-go 进行细粒度的工作负载控制
- **CronJob 部署模型** (ADR-004) -- 资源高效的批处理执行
- **持久化 Trivy 缓存** (ADR-009) -- PVC 避免每次运行时重新下载漏洞 DB
## 兼容性
Ephor 组件独立版本化。请查看 [兼容性矩阵](https://docs.holbein.io/reference/compatibility) 以确保您的扫描器、API 和 Trivy 版本能够协同工作。
## 贡献
欢迎贡献。请阅读我们的[贡献指南](CONTRIBUTING.md)以了解开发工作流程、提交约定和 pull request 流程的详细信息。
所有贡献者在第一个 pull request 被接受之前必须签署我们的[贡献者许可协议](CLA.md)。GitHub Action 将自动引导您完成该流程。
## 许可证
本项目采用 [GNU Affero General Public License v3.0](LICENSE) 许可。
标签:Anthropic, CIS基准, Claude, CronJob, CVE检测, DevSecOps, Docker, Ephor, EVTX分析, Go, Helm Chart, Ruby工具, SBOM, TLS, Web截图, 上游代理, 子域名突变, 安全代理, 安全合规, 安全防御评估, 容器安全, 工作负载发现, 日志审计, 活动识别, 硬件无关, 网络代理, 请求响应过滤, 请求拦截, 镜像扫描, 镜像漏洞, 防御工具