nanohype/cloudgov
GitHub: nanohype/cloudgov
一款零依赖的单二进制 AWS 安全与成本治理 CLI 工具,提供 IAM 最小权限审计、成本异常检测、资源卫生管理和 Kubernetes RBAC 扫描等综合能力。
Stars: 0 | Forks: 0
# cloudgov
AWS 安全与成本的瑞士军刀 — 单一二进制文件,零依赖。
审计 IAM 权限,发现成本异常,找出孤立的资源,标记不安全的存储,检测过度宽松的安全组,监控 TLS 证书过期,强制执行资源标签,检查服务配额使用情况,保存并比较扫描基准,生成 HTML 报告等等 — 跨越您的 AWS 账户,并附带一个 Kubernetes RBAC 扫描器。
## 云平台支持
cloudgov 目前是 **AWS 原生的**。每个域都是针对 AWS 实现的,并且一个
Kubernetes RBAC 扫描器覆盖了集群端。该架构是
提供者可插拔的 — 每个域都是一个能力接口 (`cloud.IAMProvider`,
`cloud.StorageProvider`, …) 通过提供者注册中心解析 — 因此添加 GCP 或
Azure 是*增量式*的:为域实现接口并注册工厂,
无需更改任何命令。这些提供者目前**尚未实现**。
| 域 (命令) | AWS | GCP | Azure | Kubernetes |
|------------------|:---:|:---:|:-----:|:----------:|
| IAM (`iam scan` / `iam fix`) | ✅ | ⬡ | ⬡ | — |
| 成本 (`cost diff`) | ✅ | ⬡ | ⬡ | — |
| 孤立资源 (`orphans`) | ✅ | ⬡ | ⬡ | — |
| 存储 (`storage audit`) | ✅ | ⬡ | ⬡ | — |
| 网络 (`network audit`) | ✅ | ⬡ | ⬡ | — |
| 证书 (`certs`) | ✅ | ⬡ | ⬡ | — |
| 标签 (`tags`) | ✅ | ⬡ | ⬡ | — |
| 密钥 (`secrets scan`) | ✅ | ⬡ | ⬡ | — |
| 漂移 (`drift`) | ✅ | ⬡ | ⬡ | — |
| 清单 (`inventory`) | ✅ | ⬡ | ⬡ | — |
| 配额 (`quota`) | ✅ | ⬡ | ⬡ | — |
| 综合审计 (`audit`) | ✅ | ⬡ | ⬡ | — |
| Lambda 策略 (`lambda audit`) | ✅ | — | — | — |
| RBAC (`k8s rbac`) | — | — | — | ✅ |
| 平台租户 (`platform audit`) | ✅† | — | — | ✅ |
✅ 已实现 · ⬡ 接口就绪 (存在能力接口;暂无提供者) · — 不适用
† 平台审计读取 AWS IAM 角色 (IRSA 一致性) 以及平台租户
集群对象 (namespace, ResourceQuota, NetworkPolicy, ServiceAccount) — 不是 RBAC,
那是单独的 `k8s rbac` 命令。
离线命令 — `compliance`, `compare`, `baseline`, `report`, `remediate` —
在已保存的扫描报告或本地状态上运行,并且与云平台无关;`mcp` 通过
MCP/stdio 为 AI 代理公开 AWS 扫描器。
## 安装说明
### Homebrew (macOS / Linux)
```
brew install nanohype/tap/cloudgov
```
### go install
```
go install github.com/nanohype/cloudgov@latest
```
### 直接下载
Linux、macOS 和 Windows 的预编译二进制文件附在每次 [GitHub 发布](https://github.com/nanohype/cloudgov/releases)中。
```
# macOS arm64 示例
curl -sSL https://github.com/nanohype/cloudgov/releases/latest/download/cloudgov_Darwin_arm64.tar.gz \
| tar -xz cloudgov
sudo mv cloudgov /usr/local/bin/
```
根据已发布的 SHA256 校验和验证下载:
```
curl -sSL https://github.com/nanohype/cloudgov/releases/latest/download/checksums.txt | sha256sum --check --ignore-missing
```
### 从源码构建
需要 Go 1.26+ 和 [Task](https://taskfile.dev)。
```
git clone https://github.com/nanohype/cloudgov.git
cd cloudgov
task build
```
## 凭证设置
cloudgov 使用标准的 AWS SDK 凭证链。
```
# 选项 1 — 环境变量
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
export AWS_REGION=us-east-1
# 选项 2 — 命名配置文件
export AWS_PROFILE=my-profile
export AWS_REGION=us-east-1
# 选项 3 — IAM role / instance metadata(无需环境变量)
```
只读审计角色所需的 IAM 权限:
```
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:List*",
"iam:Get*",
"cloudtrail:LookupEvents",
"ce:GetCostAndUsage",
"ec2:Describe*",
"elasticloadbalancing:Describe*",
"s3:ListAllMyBuckets",
"s3:GetBucketAcl",
"s3:GetBucketEncryption",
"s3:GetBucketVersioning",
"s3:GetBucketLogging",
"s3:GetBucketPublicAccessBlock",
"s3:GetBucketTagging",
"acm:ListCertificates",
"acm:DescribeCertificate",
"rds:DescribeDBInstances",
"lambda:ListFunctions",
"lambda:GetFunction",
"lambda:ListTags",
"lambda:GetAccountSettings",
"ecs:ListClusters",
"ecs:DescribeClusters",
"eks:ListClusters",
"eks:DescribeCluster",
"dynamodb:ListTables",
"dynamodb:DescribeTable",
"dynamodb:ListTagsOfResource",
"sns:ListTopics",
"sns:ListTagsForResource",
"sqs:ListQueues",
"sqs:ListQueueTags",
"iam:GetAccountSummary",
"servicequotas:GetServiceQuota",
"logs:DescribeLogGroups",
"events:ListRules",
"events:ListTagsForResource"
],
"Resource": "*"
}
]
}
```
## 命令
### `cloudgov iam scan` — 未使用和过度特权的 IAM
将授予的权限与回溯窗口内的 CloudTrail 活动进行比较,并报告未使用、管理员和跨账户风险。
```
# 扫描当前 AWS 账户(回顾 90 天)
cloudgov iam scan
# 最近 30 天,仅显示 CRITICAL 和 HIGH
cloudgov iam scan --days 30 --severity HIGH
# 扫描特定 principal
cloudgov iam scan --principal arn:aws:iam::123456789012:role/scanner
# 用于下游工具的 JSON 输出
cloudgov iam scan --output json --output-file report.json
# 用于 GitHub Advanced Security 的 SARIF 输出
cloudgov iam scan --output sarif --output-file results.sarif
# 针对大型账户提高并行度
cloudgov iam scan --concurrency 20
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--days` | `90` | CloudTrail 回溯窗口 (以天为单位) |
| `--principal` | | 按名称或 ID 扫描单个主体 |
| `--severity` | `LOW` | 报告的最低严重级别:`CRITICAL`, `HIGH`, `MEDIUM`, `LOW`, `INFO` |
| `--output` | `table` | 输出格式:`table`, `json`, `sarif` |
| `--output-file` | | 将输出写入文件而不是 stdout |
| `--concurrency` | `10` | 最大并行 goroutines |
| `--profile` | | 用于凭证的 AWS 命名 profile |
### `cloudgov iam fix` — 生成 Terraform 修复
读取 JSON 扫描报告,并为每个被标记的主体生成最小特权 Terraform 策略文件。
```
# 为所有 HIGH+ 发现生成修复
cloudgov iam fix --from report.json
# 将修复写入自定义目录
cloudgov iam fix --from report.json --out ./tf-fixes
# 同时包含 MEDIUM 严重性修复
cloudgov iam fix --from report.json --severity MEDIUM
```
**工作流**
```
cloudgov iam scan --output json --output-file report.json
cloudgov iam fix --from report.json --out ./fixes
ls ./fixes/
# minimal_lambda_executor.tf
# minimal_ci_deploy_role.tf
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--from` | (必填) | 来自 `cloudgov iam scan --output json` 的 JSON 报告路径 |
| `--format` | `terraform` | 输出格式:`terraform`, `json` |
| `--out` | `./cloudgov-fixes` | 生成文件的输出目录 |
| `--severity` | `HIGH` | 生成修复的最低严重级别 |
| `--profile` | (默认链) | 用于凭证的 AWS 命名 profile (与用于扫描的 profile 相匹配) |
### `cloudgov cost diff` — 时间窗口之间的支出增量
将最近 N 天的 AWS 支出与之前 N 天进行比较,按服务显现出意外的增加。
```
# 对比最近 30 天与之前 30 天
cloudgov cost diff
# 7 天对比
cloudgov cost diff --days 7
# 用于告警管道的 JSON 输出
cloudgov cost diff --output json
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--days` | `30` | 比较最近 N 天与之前的 N 天 |
| `--threshold` | `0` | 仅显示变化 >N% 的服务 (例如 `--threshold 20`) |
| `--output` | `table` | 输出格式:`table`, `json` |
| `--output-file` | | 将输出写入文件而不是 stdout |
成本增加 >10% 将显示为红色;减少显示为绿色。
### `cloudgov orphans` — 未使用的磁盘、IP、负载均衡器和集群残留物
查找未挂载的磁盘、没有实例的保留 IP 以及空闲的负载均衡器 (带有
估计的每月成本),以及 **集群残留物** — 与现已删除的 EKS
集群绑定的资源,而集群的拆毁无法触及它们:控制平面日志组 (它会
阻止同名重新创建) 和 Karpenter 的中断 SQS 队列 + EventBridge 规则。残留
是根据 `eks:ListClusters` 匹配的,因此在线集群的资源永远不会被标记,并且
无论 `--min-cost` 为多少,它都会被报告 (这是一个冲突问题,而不是成本问题)。
```
# 扫描当前 AWS 账户
cloudgov orphans
# 仅报告成本超过 $5/月的资源
cloudgov orphans --min-cost 5
# 用于 Slack/PagerDuty 集成的 JSON
cloudgov orphans --output json
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--min-cost` | `0` | 仅报告每月成本超过此 USD 阈值的孤立资源 |
| `--output` | `table` | 输出格式:`table`, `json` |
| `--output-file` | | 将输出写入文件而不是 stdout |
该表格包含一个汇总所有每月成本的 TOTAL 行。
### `cloudgov storage audit` — 公开的存储桶和加密缺失
审计对象存储是否存在公开访问、缺少加密、禁用版本控制以及缺少访问日志。
```
# 扫描当前 AWS 账户
cloudgov storage audit
# 仅包含 HIGH 和 CRITICAL 发现
cloudgov storage audit --severity HIGH
# 用于 SIEM 摄取的 JSON
cloudgov storage audit --output json --output-file storage-findings.json
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--severity` | `LOW` | 报告的最低严重级别 |
| `--output` | `table` | 输出格式:`table`, `json`, `sarif` |
| `--output-file` | | 将输出写入文件而不是 stdout |
| `--fix` | `false` | 为每个发现生成 shell 修复脚本 |
| `--out` | `.` | 写入修复脚本的目录 (与 `--fix` 一起使用) |
### `cloudgov network audit` — 过度宽松的防火墙规则
检查安全组中是否有将敏感端口暴露给互联网的规则。
严重级别规则:
- **CRITICAL** — 在 SSH (22)、RDP (3389) 或数据库端口 (3306, 5432, 1433, 27017, 6379, 9200) 上的 `0.0.0.0/0`
- **HIGH** — 在任何非 HTTP/HTTPS 端口上的 `0.0.0.0/0`
- **MEDIUM** — 不受限制的出站流量 (所有流量发往 `0.0.0.0/0`)
```
# 扫描当前 AWS 账户
cloudgov network audit
# 仅显示 CRITICAL 发现
cloudgov network audit --severity CRITICAL
# JSON 输出
cloudgov network audit --output json --output-file network-findings.json
# 在表格旁边生成 shell 修复脚本
cloudgov network audit --fix --out fixes/
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--severity` | `LOW` | 报告的最低严重级别 |
| `--output` | `table` | 输出格式:`table`, `json` |
| `--output-file` | | 将输出写入文件而不是 stdout |
| `--fix` | `false` | 为每个发现生成 shell 修复脚本 |
| `--out` | `.` | 写入修复脚本的目录 (与 `--fix` 一起使用) |
### `cloudgov remediate` — 从保存的扫描报告生成修复脚本
读取先前保存的 JSON 扫描报告并输出用于修复每个发现的 shell 脚本。它是 ` audit --fix` 的离线等效版本 — 适用于您想先审查发现、在代码审查之后再进行修复、或按严重级别应用一部分修复的情况。
支持的报告类型:`storage`, `network`, `orphans`。报告是通过在相应的扫描命令中使用 `--output json --output-file ` 写入文件来读取的。
```
# 从已保存的存储扫描生成修复脚本
cloudgov storage audit --output json --output-file storage.json
cloudgov remediate --type storage --from storage.json --out fixes/
# 网络同理,仅包含 CRITICAL 发现
cloudgov network audit --output json --output-file network.json
cloudgov remediate --type network --from network.json --severity CRITICAL --out fixes/
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--type` | (必填) | 报告类型:`storage`, `network`, 或 `orphans` |
| `--from` | (必填) | JSON 扫描报告路径 |
| `--out` | `.` | 写入修复脚本的目录 |
| `--severity` | `LOW` | 包含在修复脚本中的最低严重级别 |
### `cloudgov certs` — TLS 证书过期
列出 ACM 中已过期或即将过期的 TLS 证书。
严重级别规则:
- **CRITICAL** — 已过期或在 7 天内过期
- **HIGH** — 在 30 天内过期
- **MEDIUM** — 在 60 天内过期
- **LOW** — 在 90 天内过期 (默认的 `--days` 阈值)
```
# 警告 90 天内过期的证书(默认)
cloudgov certs
# 仅显示 30 天内过期的证书
cloudgov certs --days 30
# 仅包含 CRITICAL 和 HIGH
cloudgov certs --severity HIGH
# JSON 输出
cloudgov certs --output json --output-file certs.json
# 用于 CI 摄取的 SARIF
cloudgov certs --output sarif --output-file certs.sarif
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--days` | `90` | 包含在这么多天内过期的证书 |
| `--severity` | `LOW` | 报告的最低严重级别 |
| `--output` | `table` | 输出格式:`table`, `json`, `sarif` |
| `--output-file` | | 将输出写入文件而不是 stdout |
### `cloudgov tags` — 缺失的资源标签/标记
审计 EC2 实例、S3 存储桶、RDS 数据库、Lambda 函数、ECS 集群、EKS 集群、DynamoDB 表、SNS 主题和 SQS 队列是否缺少必需的标签。
所有发现均为 **MEDIUM** 严重级别。
```
# 要求 owner、env 和 cost-center 标签
cloudgov tags --require owner,env,cost-center
# 基于已发布标签标准的必需 AWS keys 进行拦截,而不是手动输入
cloudgov tags --standard-file resource-tagging.json
# 如果缺少必需标签则 CI 失败
cloudgov tags --standard-file resource-tagging.json --fail-on medium
# JSON 输出
cloudgov tags --require owner,env --output json --output-file tags.json
```
必需的标签集来自 `--require` (临时) 或 `--standard-file` (一个 [nanohype 资源标签标准](https://github.com/nanohype/nanohype/blob/main/standards/resource-tagging.json) JSON 的必需 AWS 键 — `content.required_by_surface.aws`)。如果两者都设置了,以 `--require` 为准。与全局的 `--fail-on medium` 配合使用以拦截 CI (所有发现均为 MEDIUM,因此 `--fail-on medium` 在任何缺少必需标签时都会非零退出)。
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--require` | | 必须存在的、以逗号分隔的标签键 |
| `--standard-file` | | 源标签标准 JSON 的路径;根据其必需的 AWS 键进行拦截 |
| `--severity` | `MEDIUM` | 报告的最低严重级别 |
| `--output` | `table` | 输出格式:`table`, `json` |
| `--output-file` | | 将输出写入文件而不是 stdout |
`--require` 或 `--standard-file` 是必需的。
### `cloudgov lambda audit` — Lambda 资源策略暴露 (AWS)
检查每个 AWS Lambda 函数基于资源的策略 (`lambda:GetPolicy`),查找过度广泛授予调用权限的模式。这是 `cloudgov iam scan` 的 *基于资源的* 对应项 — 后者检查身份 *从* 内部可以做什么;而此命令检查谁 *从* 外部可以调用该函数。
严重级别规则:
- **CRITICAL** — `Principal: "*"` 或 `Principal: {"AWS": "*"}` (任何人都可以调用)
- **HIGH** — `Principal: {"AWS": "arn:..."}` 中的跨账户主体 (允许不同的账户进行调用)
- **HIGH** — 没有 `aws:SourceAccount` 或 `aws:SourceArn` 条件的 `Principal: {"Service": "..."}` (混淆代理风险)
- **HIGH** — 任何允许语句中的 `Action: "*"` 或 `Action: "lambda:*"`
没有资源策略的函数将被静默跳过 — 它们只能通过基于身份的 IAM 访问,这已在 IAM 扫描中涵盖。
```
# 审计当前 AWS 账户中的所有 Lambda resource policies
cloudgov lambda audit
# 仅包含 CRITICAL,JSON 输出
cloudgov lambda audit --severity CRITICAL --output json --output-file lambda.json
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--severity` | `LOW` | 报告的最低严重级别 |
| `--output` | `table` | 输出格式:`table`, `json`, `sarif` |
| `--output-file` | | 将输出写入文件而不是 stdout |
### `cloudgov k8s rbac` — 过度特权的 Kubernetes RBAC
扫描集群范围内的 ClusterRoles 和 ClusterRoleBindings,查找会导致真实事件的模式:通配符动词/资源、针对通配符资源的危险动词 (create/update/patch/delete),以及绑定到广泛主体组 (`system:authenticated`, `system:unauthenticated`, `system:masters`)。内置的默认角色 (`cluster-admin`, `admin`, `edit`, `view`, `system:*`, `kubeadm:*`) 将被跳过,以便输出专注于用户引入的风险。
连接使用标准的 kubeconfig 链:`--kubeconfig` 标志 → `$KUBECONFIG` → `~/.kube/config` → 集群内的 service-account token。
```
# 扫描当前 kubeconfig context 的集群
cloudgov k8s rbac
# 使用特定的 kubeconfig
cloudgov k8s rbac --kubeconfig /path/to/kubeconfig
# 用于 CI 的 JSON 输出
cloudgov k8s rbac --output json --output-file rbac.json
# 仅包含 HIGH 及以上
cloudgov k8s rbac --severity HIGH
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--kubeconfig` | (链式查找) | kubeconfig 文件路径 |
| `--severity` | `LOW` | 报告的最低严重级别 |
| `--output` | `table` | 输出格式:`table`, `json`, `sarif` |
| `--output-file` | | 将输出写入文件而不是 stdout |
### `cloudgov secrets scan` — 云资源中泄露的凭证
扫描 Lambda 环境变量、ECS 任务定义、EC2 用户数据及类似的运行时配置,以查找嵌入的密钥 — 泄露到 AWS 资源中的 AWS 密钥、Slack token、私钥、GitHub token、通用的高熵字符串以及第三方云凭证 (GCP service-account 密钥、Azure 连接字符串)。
```
# 扫描当前 AWS 账户
cloudgov secrets scan
# HIGH 及以上
cloudgov secrets scan --severity HIGH
# 用于 GitHub Advanced Security 的 SARIF 输出
cloudgov secrets scan --output sarif --output-file secrets.sarif
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--severity` | `LOW` | 报告的最低严重级别 |
| `--output` | `table` | 输出格式:`table`, `json`, `sarif` |
| `--output-file` | | 将输出写入文件而不是 stdout |
### `cloudgov compliance ` — 将发现映射到合规性控制
加载先前 cloudgov 运行的 JSON 扫描报告,并将发现映射到指定基准中的控制措施,为每个控制措施生成通过/失败评估。
可用的基准:`cis-aws-v3`, `soc2`。
```
# 首先生成 JSON 报告
cloudgov iam scan --output json --output-file iam.json
cloudgov storage audit --output json --output-file storage.json
# 然后对照 benchmark 进行评估
cloudgov compliance cis-aws-v3 --iam-report iam.json --storage-report storage.json
# 用于摄取到仪表板的 JSON 输出
cloudgov compliance soc2 --iam-report iam.json --output json --output-file soc2.json
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--iam-report` | | 来自 `iam scan` 的 JSON 报告路径 |
| `--storage-report` | | 来自 `storage audit` 的 JSON 报告路径 |
| `--network-report` | | 来自 `network audit` 的 JSON 报告路径 |
| `--certs-report` | | 来自 `certs` 的 JSON 报告路径 |
| `--tags-report` | | 来自 `tags` 的 JSON 报告路径 |
| `--output` | `table` | 输出格式:`table`, `json`, `sarif` |
| `--output-file` | | 将输出写入文件而不是 stdout |
### `cloudgov drift ` — Terraform 状态与实时 AWS 对比
读取 `terraform.tfstate` 文件,并通过 AWS API 检查每个受管资源,以检测在 Terraform 之外的修改或删除。支持安全组、IAM 策略和 S3 存储桶。
```
# 本地 state 文件
cloudgov drift terraform.tfstate
# 过滤为单一 resource type
cloudgov drift terraform.tfstate --resource-type aws_security_group
# 降低并发
cloudgov drift terraform.tfstate --concurrency 5
# JSON 输出
cloudgov drift terraform.tfstate --output json --output-file drift.json
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--resource-type` | | 过滤为单个 Terraform 资源类型 |
| `--concurrency` | `10` | 最大并发 API 调用 |
| `--output` | `table` | 输出格式:`table`, `json`, `sarif` |
| `--output-file` | | 将输出写入文件而不是 stdout |
### `cloudgov audit` — 统一的全面审计
一次性运行所有安全和成本扫描 (IAM、存储、网络、孤立资源、证书、标签、密钥),并生成一个单一的合并报告。使用 `--skip` 跳过特定域。
```
# 对当前 AWS 账户进行全面审计
cloudgov audit
# 跳过 IAM 和证书域
cloudgov audit --skip iam,certs
# 仅包含 HIGH 和 CRITICAL 发现,JSON 输出
cloudgov audit --severity HIGH --output json --output-file audit.json
# 用于 GitHub Advanced Security 的 SARIF 输出
cloudgov audit --output sarif --output-file audit.sarif
# 自定义阈值
cloudgov audit --iam-days 30 --cert-days 60 --require-tags owner,env
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--skip` | | 要跳过的域:`iam`, `storage`, `network`, `orphans`, `certs`, `tags`, `secrets` |
| `--severity` | `LOW` | 报告的最低严重级别 |
| `--output` | `table` | 输出格式:`table`, `json`, `sarif` |
| `--output-file` | | 将输出写入文件而不是 stdout |
| `--iam-days` | `90` | IAM 审计日志回溯期 (以天为单位) |
| `--cert-days` | `90` | 证书过期警告阈值 (以天为单位) |
| `--require-tags` | | 标签审计所需的标签 (以逗号分隔) |
| `--concurrency` | `10` | IAM 扫描的最大并行 goroutines |
| `--sink` | | 通知 sink (可重复)。请参阅下方的 **通知 sinks**。 |
| `--report-url` | | 嵌入在 sink 通知中的 URL (指向完整报告的链接) |
#### 通知 sinks
`cloudgov audit --sink ` 在扫描完成后将运行摘要发布到外部系统。Sinks 尽力触发 — 一个坏的 sink 不会阻止其他 sink,并且审计退出代码不受影响。该标志是可重复的,因此您可以同时将其传递到多个目标。
| 规范形式 | 作用 |
|---|---|
| `slack:` | 包含严重级别编码标题、按域划分的摘要、前 10 项发现以及可选报告链接的 Block Kit 消息 |
| `webhook:` | 将原始 JSON 摘要 POST 到任何 URL;接收方可以按自己喜欢的方式解析 |
| `pagerduty:` | PagerDuty Events API v2 触发器 — 仅在摘要包含至少一个关键或高危发现时触发 (避免警报疲劳) |
```
# 在每次审计运行时发送 Slack 通知
cloudgov audit --sink slack:https://hooks.slack.com/services/T00/B00/XXX
# 呼叫 on-call 并通知 Slack 并转发到自定义收集器
cloudgov audit \
--sink slack:https://hooks.slack.com/services/T00/B00/XXX \
--sink pagerduty:my-pd-routing-key \
--sink webhook:https://collector.example.com/cloudgov \
--report-url https://reports.example.com/audit-$(date +%F).html
```
### `cloudgov inventory` — 列出所有 AWS 资源
列出所有 AWS 资源,包括类型、区域、标签和创建日期。按类型和区域分组,以提供完整的资产概览。
```
# 列出当前 AWS 账户中的所有资源
cloudgov inventory
# 过滤为特定的 resource types
cloudgov inventory --type ec2,s3,lambda
# JSON 输出
cloudgov inventory --output json --output-file inventory.json
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--type` | all | 要列出的资源类型 (例如 `ec2`, `s3`, `lambda`) |
| `--output` | `table` | 输出格式:`table`, `json` |
| `--output-file` | | 将输出写入文件而不是 stdout |
### `cloudgov quota` — 服务配额利用率
检查 AWS 服务配额使用情况,以防止因悄然达到限制而导致服务中断。报告 IAM、EC2、S3、Lambda 和 RDS 配额。
```
# 所有配额
cloudgov quota
# 仅显示使用率超过 50% 的配额
cloudgov quota --threshold 50
# JSON 输出
cloudgov quota --output json --output-file quotas.json
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--threshold` | `0` | 报告的最低利用率百分比 |
| `--output` | `table` | 输出格式:`table`, `json` |
| `--output-file` | | 将输出写入文件而不是 stdout |
利用率采用颜色编码:绿色 (<50%)、黄色 (50-80%)、红色 (>80%)。
### `cloudgov baseline` — 保存和管理扫描基准
将任何扫描报告保存为命名基准,以便稍后使用 `cloudgov compare` 进行比较。
```
# 从扫描报告保存 baseline
cloudgov iam scan --output json --output-file scan.json
cloudgov baseline save --from scan.json --name pre-deploy
# 列出已保存的 baselines
cloudgov baseline list
# 删除 baseline
cloudgov baseline delete --name old-scan
```
基准存储在 `~/.cloudgov/baselines/` 中。
**子命令**
| 子命令 | 描述 |
|------------|-------------|
| `baseline save --from --name ` | 将报告保存为命名基准 |
| `baseline list` | 列出所有已保存的基准及其日期 |
| `baseline delete --name ` | 删除已保存的基准 |
### `cloudgov compare` — 对比两个扫描报告
比较两个扫描报告 (或保存的基准与当前报告),并将每个发现分类为新增、已解决或未更改。
```
# 将保存的 baseline 与新扫描进行对比
cloudgov compare --baseline pre-deploy --current scan-after.json
# 直接对比两个报告文件
cloudgov compare --from old-report.json --to new-report.json
# JSON 输出
cloudgov compare --from old.json --to new.json --output json
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--baseline` | | 要与之比较的已保存基准的名称 |
| `--current` | | 当前报告 JSON 文件的路径 |
| `--from` | | 较旧的报告 JSON 文件的路径 |
| `--to` | | 较新的报告 JSON 文件的路径 |
| `--output` | `table` | 输出格式:`table`, `json` |
| `--output-file` | | 将输出写入文件而不是 stdout |
使用 `--baseline` + `--current` 或 `--from` + `--to` (不能同时使用)。支持所有报告类型:audit, IAM, storage, network, orphans, certs, tags, secrets, quotas。
**端到端工作流**
```
# 部署前:扫描并保存 baseline
cloudgov audit --output json --output-file audit.json
cloudgov baseline save --from audit.json --name pre-deploy-v2
# 部署后:再次扫描并对比
cloudgov audit --output json --output-file audit-after.json
cloudgov compare --baseline pre-deploy-v2 --current audit-after.json
# 输出显示:
# +NEW 自 baseline 以来引入的发现
# -RESOLVED 不再出现的发现
# =UNCHANGED 两者中都存在的发现
```
您还可以跳过基准,直接比较任意两个 JSON 文件:
```
cloudgov compare --from monday-scan.json --to friday-scan.json --output json
```
### `cloudgov report` — 生成 HTML 执行摘要
从任何 JSON 扫描输出中生成一个独立的、自包含的 HTML 报告。包括摘要卡片、严重级别细分、特定域的表格以及客户端表格排序。通过 `prefers-color-scheme` 支持浅色和深色模式。
```
# 从审计报告生成
cloudgov audit --output json --output-file audit.json
cloudgov report --from audit.json --out report.html --open
# 从任意扫描报告生成
cloudgov report --from iam-scan.json --out iam-report.html
# 显式 type override
cloudgov report --from data.json --type orphans --out orphans.html
```
**Flags**
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--from` | (必填) | 扫描报告 JSON 文件的路径 |
| `--out` | `report.html` | 输出 HTML 文件路径 |
| `--type` | `auto` | 报告类型:`auto`, `audit`, `iam`, `storage`, `network`, `orphans`, `certs`, `tags`, `secrets`, `cost`, `quotas` |
| `--open` | `false` | 生成后在默认浏览器中打开报告 |
## 全局标志
| 标志 | 描述 |
|------|-------------|
| `--quiet`, `-q` | 抑制 stderr 上的所有进度和摘要输出 (用于脚本) |
| `--version` | 打印版本、commit hash 和构建日期 |
## CI 用法
### GitHub Actions — SARIF 上传
将 IAM 发现上传到 GitHub Advanced Security (需要 `security-events: write` 权限):
```
name: cloudgov security scan
on:
schedule:
- cron: '0 6 * * 1' # every Monday at 06:00 UTC
workflow_dispatch:
permissions:
security-events: write
jobs:
iam-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install cloudgov
run: |
curl -sSL https://github.com/nanohype/cloudgov/releases/latest/download/cloudgov_Linux_amd64.tar.gz \
| tar -xz cloudgov
sudo mv cloudgov /usr/local/bin/
- name: Run IAM scan
env:
AWS_ROLE_ARN: ${{ secrets.CLOUDGOV_ROLE_ARN }}
AWS_REGION: us-east-1
run: |
cloudgov iam scan \
--severity HIGH \
--output sarif \
--output-file results.sarif \
--quiet
- name: Upload SARIF to GitHub Security
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
```
### GitHub Actions — 全面审计
在 CI 中跨所有域运行统一审计:
```
name: cloudgov full audit
on:
schedule:
- cron: '0 6 * * 1'
workflow_dispatch:
permissions:
security-events: write
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install cloudgov
run: |
curl -sSL https://github.com/nanohype/cloudgov/releases/latest/download/cloudgov_Linux_amd64.tar.gz \
| tar -xz cloudgov
sudo mv cloudgov /usr/local/bin/
- name: Run full audit
env:
AWS_ROLE_ARN: ${{ secrets.CLOUDGOV_ROLE_ARN }}
AWS_REGION: us-east-1
run: |
cloudgov audit \
--severity HIGH \
--output sarif \
--output-file audit.sarif \
--quiet
- name: Upload SARIF to GitHub Security
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: audit.sarif
```
### GitLab CI — JSON 报告产物
```
cloudgov:
image: ubuntu:24.04
before_script:
- curl -sSL https://github.com/nanohype/cloudgov/releases/latest/download/cloudgov_Linux_amd64.tar.gz
| tar -xz cloudgov
- mv cloudgov /usr/local/bin/
script:
- cloudgov iam scan --output json --output-file report.json --quiet
- cloudgov storage audit --severity HIGH --output json --output-file storage.json --quiet
artifacts:
paths:
- report.json
- storage.json
expire_in: 30 days
```
### 发现关键问题时使 CI 失败
```
# 如果存在任何 CRITICAL 发现则以非零状态退出
cloudgov iam scan --severity CRITICAL --output json --quiet | \
jq -e '.findings | length == 0'
```
## 输出格式
| 格式 | 标志 | 用例 |
|--------|------|----------|
| 表格 | `--output table` | 带有颜色、易于阅读的终端输出 |
| JSON | `--output json` | 脚本、警报、仪表板 |
| SARIF | `--output sarif` | GitHub Advanced Security、IDE 集成 |
所有格式都可以使用 `--output-file path/to/file` 写入文件。
## 版本
_BLOCK_35/>
## 许可证
Apache 2.0 — 请参阅 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。
标签:AWS, DPI, EVTX分析, IAM, StruQ, 子域名突变, 成本管理, 日志审计