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, 子域名突变, 成本管理, 日志审计