yankawai/kube-shipguard
GitHub: yankawai/kube-shipguard
一款开源的 Kubernetes 发布就绪扫描器,在部署前检查清单配置并拦截高风险工作负载。
Stars: 0 | Forks: 0
# Kube ShipGuard
[](https://github.com/yankawai/kube-shipguard/actions/workflows/ci.yml)
[](go.mod)
[](.github/workflows/ci.yml)
[](LICENSE)
Kube ShipGuard 是一款开源的 Kubernetes 发布就绪扫描器,专为平台和 DevOps 团队设计。它会在部署前检查渲染后的清单,并在 CI 中拦截高风险工作负载。
该扫描器主要关注审查者通常需要手动检查的生产环境信号:探针、资源、非根容器、只读文件系统、镜像标签、PodDisruptionBudgets、NetworkPolicies 以及有风险的 Secret/ConfigMap 模式。

## 为什么开发它
Kubernetes 清单通常能通过语法验证,但直接部署仍然不安全。Kube ShipGuard 添加了一个发布门控,它能回答一个更具实际意义的问题:
## 功能
- 扫描普通的 Kubernetes YAML 和多文档文件。
- 支持 `Deployment`、`StatefulSet`、`DaemonSet`、`Pod`、`Service`、`Secret`、`ConfigMap`、`PodDisruptionBudget` 和 `NetworkPolicy`。
- 检测缺失的探针、缺失的资源 requests/limits、不安全的 security contexts、可变的镜像标签、单副本工作负载、缺失的 PDB 以及缺失的 NetworkPolicies。
- 输出 text、JSON 和 SARIF 格式的结果。
- 包含用于本地清单审查的交互式终端审查模式。
- 支持基于风险评分的发布结论:`SHIP`、`REVIEW` 或 `BLOCK`。
- 通过 `--changed-from` 支持感知差异的 PR 扫描。
- 支持为遗留扫描结果设置基线,并为已接受的例外情况设置过期的抑制规则。
- 扫描渲染后的 Helm 和 Kustomize 输出。
- 支持根据严重程度进行 CI 失败门控。
- 附带可复用的 GitHub Action。
## 快速开始
```
go run ./cmd/kube-shipguard scan examples/secure --format text --fail-on high
```
构建二进制文件:
```
make build
./bin/kube-shipguard scan examples/secure
```
为 GitHub 代码扫描生成 SARIF:
```
go run ./cmd/kube-shipguard scan deploy --format sarif --output kube-shipguard.sarif
```
在 Pull Request 中仅扫描已更改的清单:
```
go run ./cmd/kube-shipguard scan deploy --changed-from origin/main --fail-on high
```
为现有扫描结果创建基线,然后仅针对新风险失败:
```
go run ./cmd/kube-shipguard baseline deploy --output .kube-shipguard-baseline.yaml
go run ./cmd/kube-shipguard scan deploy --baseline .kube-shipguard-baseline.yaml --fail-on high
```
扫描渲染后的清单:
```
go run ./cmd/kube-shipguard scan --helm-chart charts/api --helm-values values-prod.yaml
go run ./cmd/kube-shipguard scan --kustomize overlays/prod
```
运行不安全示例且不让进程失败:
```
make demo
```
打开交互式终端审查:
```
go run ./cmd/kube-shipguard review examples/unsafe
```
审查模式快捷键:
- `1`、`2`、`3`、`a` 过滤高、中、低或所有发现;
- `/` 搜索规则 ID、文件、资源、消息和修复文本;
- `?` 打开帮助覆盖层;
- `j/k`、方向键、`home` 和 `end` 导航发现项;
- `q` 退出。
## 输出示例
```
Kube ShipGuard found 7 findings
HIGH KSG004 default/api Deployment/api container api allows privilege escalation
HIGH KSG006 default/api Deployment/api container api uses mutable image tag latest
MED KSG001 default/api Deployment/api container api has no readiness probe
```
## 退出行为
`--fail-on` 控制返回非零退出代码的最低严重程度:
- `none` 永不失败;
- `low` 在低、中或高风险时失败;
- `medium` 在中或高风险时失败;
- `high` 仅在高风险发现项时失败。
## GitHub Action
```
name: kube-shipguard
on:
pull_request:
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: yankawai/kube-shipguard@v1
with:
path: deploy
changed-from: origin/main
baseline: .kube-shipguard-baseline.yaml
config: .kube-shipguard.yaml
fail-on: high
format: sarif
output: kube-shipguard.sarif
```
如需上传 SARIF,请添加:
```
- uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: kube-shipguard.sarif
```
## 检查
| 规则 | 严重程度 | 描述 |
| --- | --- | --- |
| KSG001 | Medium | 容器没有 readiness probe |
| KSG002 | Medium | 容器没有 liveness probe |
| KSG003 | Medium | 容器的 CPU/memory requests 或 limits 不完整 |
| KSG004 | High | 容器允许特权提升 |
| KSG005 | Medium | 容器根文件系统可写 |
| KSG006 | High | 容器使用了可变的镜像标签 |
| KSG007 | High | 工作负载可以以 root 身份运行 |
| KSG008 | Medium | 容器未丢弃 Linux capabilities |
| KSG009 | Medium | 多副本工作负载的副本数少于两个 |
| KSG010 | Medium | 工作负载没有匹配的 PodDisruptionBudget |
| KSG011 | Medium | 工作负载没有匹配的 NetworkPolicy |
| KSG012 | High | Secret 清单存储在仓库的 YAML 中 |
| KSG013 | High | ConfigMap 键看起来像 secret |
| KSG014 | Low | Service 直接暴露 LoadBalancer |
## 文档
- [配置](docs/configuration.md)
- [SARIF 集成](docs/sarif.md)
- [安全策略](SECURITY.md)
标签:EVTX分析, Go, Ruby工具, 日志审计, 错误基检测, 静态代码分析