cloudmechanic-cli/cloudmechanic

GitHub: cloudmechanic-cli/cloudmechanic

一款基于 Go 的 AWS 安全与成本扫描 CLI,提供实时报告与可直接应用的 Terraform 修复。

Stars: 2 | Forks: 0

## 问题 随着时间的推移,每个 AWS 账户都会积累浪费和风险: - **被遗忘的资源** — 未挂载的 EBS 卷、空闲的负载均衡器、未使用的弹性 IP 每月悄悄烧钱。 - **安全配置错误** — 安全组开放给 `0.0.0.0/0`、IAM 用户未启用 MFA、公有的 S3 存储桶等待成为下一个头条。 - **手动审计无法扩展** — 点击 AWS 控制台或编写一次性脚本缓慢、易错,且永远无法保持一致性。 团队在账单飙升或发生安全漏洞后才发现这些问题。到那时,损害已经造成。 ## 解决方案 **CloudMechanic** 是一个快速、轻量级的单二进制 CLI 工具,用于扫描 AWS 账户并在终端中提供带颜色编码、可操作的报告 — 包含可直接应用的 Terraform 代码以修复每个问题。 - **快速** — 使用 goroutines 并发执行所有检查。完整扫描在 1 秒内完成。 - **零配置** — 使用现有的 AWS CLI 凭证。无需代理、无需 SaaS、无需注册。 - **可操作** — 每个发现都包含资源 ID、具体的修复步骤以及**可直接应用的 Terraform HCL**。 - **可扩展** — 基于 `Scanner` 接口。添加新检查只需一个文件和一行注册。 ``` $ cloudmechanic scan === CloudMechanic Scan Report === Security Issues (3): 🔴 [CRITICAL] Security Group sg-0db0d4a51a974f36b (caf-bastion-sg) allows SSH (port 22) from 0.0.0.0/0 Resource: sg-0db0d4a51a974f36b Fix: Restrict SSH access to specific IP ranges or use AWS Systems Manager Session Manager instead. 🔴 [CRITICAL] Security Group sg-09d33757e356808df (launch-wizard-2) allows SSH (port 22) from 0.0.0.0/0 Resource: sg-09d33757e356808df Fix: Restrict SSH access to specific IP ranges or use AWS Systems Manager Session Manager instead. -------------------------------------------------- ✅ Scan complete in 986ms Total issues: 3 (3 critical, 0 warnings) ``` ## 快速开始 在 2 分钟内开始扫描: ``` # 安装 brew tap cloudmechanic-cli/tap && brew install cloudmechanic # 配置 AWS 凭据(如果已配置则跳过) aws configure # 扫描 cloudmechanic scan # 或启动交互式仪表板 cloudmechanic dashboard ``` **Linux(无需 Homebrew):** ``` curl -L https://github.com/cloudmechanic-cli/cloudmechanic/releases/download/v1.6.2/cloudmechanic_1.6.2_linux_amd64.tar.gz -o /tmp/cm.tar.gz \ && sudo tar -xzf /tmp/cm.tar.gz -C /tmp/ \ && sudo install -m 755 /tmp/cloudmechanic /usr/local/bin/cloudmechanic ``` ## 先决条件 ### AWS 凭证 CloudMechanic 需要有效的 AWS 凭证来读取账户资源。它**从不修改**任何内容 — 所有操作均为只读。 **选项 A — AWS CLI(推荐):** ``` aws configure # 输入您的 Access Key ID、Secret Access Key 和默认区域 ``` **选项 B — 环境变量:** ``` export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE" export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" export AWS_REGION="us-east-1" ``` **选项 C — 命名配置文件**(适用于多账户环境): ``` aws configure --profile production cloudmechanic scan --profile production ``` ### IAM 权限 最简单的方法是为 IAM 用户或角色附加 **AWS 托管的 `ReadOnlyAccess` 策略**。这将授予 CloudMechanic 所需的所有权限。 如果需要最小权限策略:
点击展开最小 IAM 策略 ``` { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeVolumes", "ec2:DescribeSecurityGroups", "ec2:DescribeAddresses", "ec2:DescribeSnapshots", "ec2:DescribeRegions", "ec2:DescribeNatGateways", "ec2:DescribeRouteTables", "ec2:DescribeVpcs", "ec2:DescribeFlowLogs", "s3:ListAllMyBuckets", "s3:GetPublicAccessBlock", "s3:GetEncryptionConfiguration", "s3:GetBucketVersioning", "rds:DescribeDBInstances", "cloudwatch:GetMetricData", "dynamodb:ListTables", "dynamodb:DescribeContinuousBackups", "dynamodb:DescribeTable", "lambda:ListFunctions", "lambda:GetFunctionUrlConfig", "iam:ListUsers", "iam:ListMFADevices", "sts:GetCallerIdentity" ], "Resource": "*" } ] } ```
### 从源码构建(可选) 仅在不使用 Homebrew 或预编译二进制文件时需要: - **Go 1.24+** ## 安装 ### Homebrew(macOS / Linux) ``` brew tap cloudmechanic-cli/tap brew install cloudmechanic ``` ### 直接下载二进制文件(Linux / macOS) ``` # Linux amd64 curl -L https://github.com/cloudmechanic-cli/cloudmechanic/releases/download/v1.6.2/cloudmechanic_1.6.2_linux_amd64.tar.gz -o /tmp/cm.tar.gz \ && sudo tar -xzf /tmp/cm.tar.gz -C /tmp/ \ && sudo install -m 755 /tmp/cloudmechanic /usr/local/bin/cloudmechanic # Linux arm64 (Graviton) curl -L https://github.com/cloudmechanic-cli/cloudmechanic/releases/download/v1.6.2/cloudmechanic_1.6.2_linux_arm64.tar.gz -o /tmp/cm.tar.gz \ && sudo tar -xzf /tmp/cm.tar.gz -C /tmp/ \ && sudo install -m 755 /tmp/cloudmechanic /usr/local/bin/cloudmechanic ``` ### Go 安装 ``` go install github.com/cloudmechanic-cli/cloudmechanic@latest ``` ### 从源码构建 ``` git clone https://github.com/cloudmechanic-cli/cloudmechanic.git cd cloudmechanic go build -o cloudmechanic . ``` ## 使用方法 ### 运行全部扫描器 ``` cloudmechanic scan ``` ### 指定特定区域 ``` cloudmechanic scan --region us-west-2 ``` ### 扫描所有区域 ``` cloudmechanic scan --all-regions ``` ### 使用命名的 AWS 配置文件 ``` cloudmechanic scan --profile production ``` ### JSON 输出(用于 CI/CD 流水线) ``` cloudmechanic scan -o json ``` ### CSV 输出(用于电子表格) ``` cloudmechanic scan -o csv > report.csv ``` ### 自动更新 检查最新的 GitHub 发布版,下载适用于当前操作系统和架构的正确二进制文件,并就地替换当前二进制文件。无需 Homebrew 或包管理器。 ### 查看版本 ``` cloudmechanic version ``` ### 组合使用标志 ``` cloudmechanic scan --profile staging --region eu-west-1 -o json ``` ## 交互式仪表盘(TUI) 启动一个全屏终端仪表盘,支持实时扫描、区域过滤、严重性过滤、实时搜索以及即时 Terraform 修复代码: ``` cloudmechanic dashboard cloudmechanic dashboard --all-regions cloudmechanic dashboard --profile production ``` ``` ☁ CloudMechanic · AWS Security Scanner ╭──────────────╮ ╭──────────────╮ │ ⬡ Regions │ │ ≡ Issues │ ← Tab to switch. Active pane has bright border. ╰──────────────╯ ╰──────────────╯ ╭────────────────────────╮ ╭──────────────────────────────────────────────────────╮ │ REGIONS │ │ SEVERITY SERVICE DESCRIPTION │ │ │ │ │ │ ◉ All Regions 3🔴 2🟡 │ │ 🖥 EC2 │ │ us-east-1 2🔴 1🟡 │ │ CRITICAL EC2 sg-0db0d4a allows SSH 0.0.0.0│ │ eu-west-1 1🔴 1🟡 │ │ WARNING EC2 vol-0abc123 is unattached │ │ │ │ │ │ SUMMARY │ │ 🪣 S3 │ │ 3 Critical │ │ CRITICAL S3 my-bucket has no PAB enabled │ │ 2 Warnings │ │ │ │ 5 Total │ │ │ ╰────────────────────────╯ ╰──────────────────────────────────────────────────────╯ ☁ us-east-1 1.2s Tab Switch ↑↓ Nav ↵ Fix F Filter / Search R Rescan Q Quit ``` **视觉设计:** Catppuccin Macchiato 深色主题 — 激活的面板带有亮蓝色边框,非激活面板变暗。面板上方的标签栏显示当前聚焦的侧边。 ### 仪表盘快捷键 | 按键 | 操作 | |------|------| | `Tab` | 在区域侧边栏和问题列表之间切换焦点 | | `j` / `↓` | 向下移动 | | `k` / `↑` | 向上移动 | | `Enter` | **打开选中问题的 Terraform 修复视图** | | `F` | 循环切换严重性过滤 — 全部 → 仅严重 → 仅警告 | | `/` | 在描述、资源 ID 和扫描器名称中实时搜索 | | `Esc` | 清除搜索 | | `R` | 重新运行扫描 | | `Q` / `Ctrl+C` | 退出 | ## Terraform 修复视图 在仪表盘中按下任意问题的 `Enter` 键,即可打开全屏代码编辑器,显示修复该问题所需的精确 Terraform HCL — 并支持语法高亮。 ``` TERRAFORM REMEDIATION ───────────────────────────────────────────────────────────────── CRITICAL VPC VPCs Without Flow Logs Resource: vpc-0abc1234def567890 Region: us-east-1 Enable VPC Flow Logs to CloudWatch Flow Logs capture metadata for every IP packet crossing your VPC. Essential for security forensics, intrusion detection, and compliance. ╭─ main.tf ──────────────────────────────────────────────────────╮ │ resource "aws_iam_role" "flow_logs" { │ │ name = "vpc-flow-logs-role" │ │ │ │ assume_role_policy = jsonencode({ │ │ Version = "2012-10-17" │ │ Statement = [{ │ │ Effect = "Allow" │ │ Action = "sts:AssumeRole" │ │ Principal = { Service = "vpc-flow-logs.amazonaws.com" } │ │ }] │ │ }) │ │ } │ │ │ │ resource "aws_flow_log" "fix" { │ │ iam_role_arn = aws_iam_role.flow_logs.arn │ │ log_destination = aws_cloudwatch_log_group.flow_logs.arn │ │ traffic_type = "ALL" │ │ vpc_id = "" │ │ } │ ╰────────────────────────────────────────────────────────────────╯ [j/k] Scroll [Esc / q] Back to Issues [Ctrl+C] Quit ``` 所有 15 种扫描器类型均提供 Terraform 代码片段: | 问题 | Terraform 资源 | |------|----------------| | 公有 S3 存储桶 | `aws_s3_bucket_public_access_block` | | 未加密的 S3 存储桶 | `aws_s3_bucket_server_side_encryption_configuration` | | 未启用版本控制的 S3 存储桶 | `aws_s3_bucket_versioning` | | 无流量日志的 VPC | `aws_flow_log` + IAM 角色 + CloudWatch 日志组 | | 开放的安全组(SSH) | `aws_security_group_rule` | | 未使用的弹性 IP | `aws_eip_association` | | 未挂载的 EBS 卷 | `aws_volume_attachment` | | 旧的 EBS 快照 | `aws_dlm_lifecycle_policy` | | 未使用的 NAT 网关 | VPC 模块配置 | | 未启用 MFA 的 IAM 用户 | 带有 MFA 拒绝条件的 `aws_iam_policy` | | 空闲的 RDS 实例 | 停止/删除指导 | | 无备份的 DynamoDB | `point_in_time_recovery` 块 | | DynamoDB 预置容量 | `billing_mode = "PAY_PER_REQUEST"` | | 已废弃运行时的 Lambda 函数 | `runtime` 更新 | | 公有的 Lambda 函数 URL | `authorization_type = "AWS_IAM"` | | 未加密的 S3 存储桶 | `aws_s3_bucket_server_side_encryption_configuration` | | 未启用版本控制的 S3 存储桶 | `aws_s3_bucket_versioning` | ## 当前扫描器 | 扫描器 | 类型 | 检测内容 | |--------|------|----------| | **未挂载的 EBS** | 成本泄漏 | 处于 `available` 状态且未挂载到任何实例的 EBS 卷 | | **开放的安全组** | 安全 | 允许 `0.0.0.0/0` 或 `::/0` 访问 22 端口的安全组 | | **公有 S3 存储桶** | 安全 | 未启用完整 S3 公有访问阻断的存储桶 | | **IAM 用户无 MFA** | 安全 | 未启用 MFA 设备的 IAM 用户 | | **空闲的 RDS 实例** | 成本泄漏 | 过去 7 天连接数为 0 的 RDS 实例 | | **未使用的弹性 IP** | 成本泄漏 | 未关联任何资源(每月 $3.60)的弹性 IP | | **旧的 EBS 快照** | 成本泄漏 | 超过 90 天的 EBS 快照 | | **无备份的 DynamoDB** | 安全 | 未启用点时间恢复(PITR)的表 | | **预置容量的 DynamoDB** | 成本泄漏 | 可受益于按需模式的预置容量表 | | **未使用的 NAT 网关** | 成本泄漏 | 未在任何路由表中引用的 NAT 网关(每月约 $32) | | **无流量日志的 VPC** | 安全 | 未配置流量日志的 VPC | | **已废弃 Lambda 运行时** | 安全 | 运行在已停止支持版本且无安全补丁的函数 | | **公有的 Lambda 函数 URL** | 安全 | 无身份验证的公有函数 URL | | **未加密的 S3 存储桶** | 安全 | 未配置默认服务器端加密的存储桶 | | **未启用版本控制的 S3 存储桶** | 成本泄漏 | 未启用版本控制(存在数据丢失风险) | ## 路线图 - [x] 未使用的弹性 IP - [x] 公有 S3 存储桶 - [x] IAM 用户无 MFA -x] 空闲的 RDS 实例(7 天连接数为 0) - [x] 旧的 EBS 快照(超过 90 天) - [x] JSON / CSV 输出格式(`--output json`、`--output csv`) - [x] 多区域扫描(`--all-regions`) - [x] DynamoDB 备份与容量检查 - [x] VPC 流量日志与未使用 NAT 网关检查 - [x] Lambda 已废弃运行时与公有 URL 检查 - [x] S3 加密与版本化检查 - [x] 交互式 TUI 仪表盘(`cloudmechanic dashboard`) - [x] 双面板,支持区域过滤、严重性过滤和实时搜索 - [x] Terraform 修复视图 — 按下任意问题即可获取可直接应用的 HCL - [x] 自动更新命令(`cloudmechanic upgrade`) - [x] 高级 UI 主题 — Catppuccin Macchiato 风格、带标签栏和药丸状状态栏的服务图标 - [ ] HTML 报告导出 - [ ] Slack / Webhook 通知 - [ ] 每项问题的成本估算 - [ ] 自定义严重性阈值 ## 贡献 欢迎贡献!CloudMechanic 使用简单的 `Scanner` 接口,添加新检查非常直接: 1. 在 `internal/scanner/` 中创建新文件 2. 实现 `Scanner` 接口(`Name()` + `Scan()`) 3. 在 `cmd/scan.go` 中注册 4. 提交 PR ## 许可证 本项目根据 MIT 许可证授权 — 详见 [许可证文件](LICENSE)。

使用 Go、咖啡因和对意外 AWS 账单的敬畏之心构建。

标签:0配置, AWS, DPI, EBS, ECS, EVTX分析, Go, IAM, Ruby工具, S3, Terraform, 二进制发布, 关键词SEO, 单二进制, 可扩展审计, 威胁情报, 安全扫描, 安全组, 对称加密, 开发者工具, 开源工具, 弹性IP, 成本优化, 成本泄漏, 日志审计, 时序注入, 自动化审计, 行动建议, 负载均衡, 资源发现, 靶机