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 所需的所有权限。
如果需要最小权限策略:
### 从源码构建(可选)
仅在不使用 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)。
点击展开最小 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": "*" } ] } ```使用 Go、咖啡因和对意外 AWS 账单的敬畏之心构建。
标签:0配置, AWS, DPI, EBS, ECS, EVTX分析, Go, IAM, Ruby工具, S3, Terraform, 二进制发布, 关键词SEO, 单二进制, 可扩展审计, 威胁情报, 安全扫描, 安全组, 对称加密, 开发者工具, 开源工具, 弹性IP, 成本优化, 成本泄漏, 日志审计, 时序注入, 自动化审计, 行动建议, 负载均衡, 资源发现, 靶机