NarahariRaghava/Pre-Deployment-Detection-of-Terraform-Security-Misconfigurations-Using-Machine-Learning
GitHub: NarahariRaghava/Pre-Deployment-Detection-of-Terraform-Security-Misconfigurations-Using-Machine-Learning
基于机器学习的 Terraform IaC 安全配置预检工具,在部署前自动扫描并标记 AWS 资源的安全风险。
Stars: 0 | Forks: 0
# Terraform 安全配置错误检测器
一个 CLI 工具,用于扫描 Terraform `.tf` 文件并在其进入生产环境之前标记安全风险。该工具是在审查了 45+ 个云应用程序的基础设施并发现相同的配置错误反复出现后构建的。

## 问题所在
Terraform 是大多数团队管理 AWS 基础设施的方式。它快速且可重复,但这种速度是把双刃剑:一个配置错误的 resource block,例如开放的 SSH 端口、公共的 S3 存储桶或通配符 IAM policy,其部署过程与正确配置的块一样容易。
大多数工具在部署后(即云安全审计或发生安全事件期间)才会发现这些问题。而此工具会在源头,即在运行 `terraform apply` 之前,就将它们拦截。
## 功能介绍
将其指向一个 `.tf` 文件或项目文件夹。它会找到每个 resource block,通过训练好的 ML 模型对其进行检测,并告诉你存在什么风险以及原因。
```
Resource : aws_security_group.open_ssh
Risk : High (High: 94% | Low: 2% | Medium: 4%)
Reason : CIDR range is open to the entire internet (0.0.0.0/0); SSH (port 22) is exposed.
Resource : aws_db_instance.reporting_db
Risk : Medium (High: 13% | Low: 10% | Medium: 76%)
Reason : the database is publicly accessible.
Resource : aws_db_instance.secure_db
Risk : Low (High: 1% | Low: 73% | Medium: 26%)
Reason : No high-risk indicators detected.
Summary : High=3 Medium=1 Low=5
```
它还会生成一份颜色编码的 HTML 报告,方便你直接分享或在浏览器中打开。
## 工作原理
**1. 解析:** 该工具读取 `.tf` 文件,并使用大括号平衡分词技术将其拆分为独立的 resource block。
**2. 提取:** 对照常见 AWS 资源类型(如开放的 CIDR 范围、暴露的端口、未加密的存储、硬编码的密钥等)的 17 项安全指标检查每个块。每项指标对应 1 或 0。这样,每个块就转换成了一行包含 17 个数字的数组。
**3. 分类:** 该行数据被输入到训练好的 Random Forest 模型中,模型会输出低、中或高风险,并附带每个类别的置信度分数。
**4. 解释:** 触发的指标会被转换为通俗易懂的纯文本原因,让工程师明确知道需要修复什么。
## 覆盖的资源类型
| 资源 | 标记内容 |
|---|---|
| `aws_security_group` / `aws_security_group_rule` | 对互联网开放的 SSH/RDP、暴露的数据库端口、开放的 IPv6 |
| `aws_s3_bucket` | 公共读取 ACL、缺少公共访问拦截配置 |
| `aws_iam_policy` | 使用通配符的 action 或 resource |
| `aws_db_instance` | 可公开访问、存储未加密 |
| `aws_instance` | 分配了公共 IP、未加密的 EBS、硬编码凭证 |
| `aws_lambda_function` | 环境变量中硬编码的密码或 token |
| `aws_lb_listener` | 纯 HTTP 且未重定向至 HTTPS |
| `aws_cloudtrail` | 日志记录被显式禁用 |
## 模型
我们在包含 300 个带标签 Terraform 代码片段的均衡数据集上,对三种分类器进行了训练和比较:
| 模型 | 测试准确率 | 5 折交叉验证 (5-Fold CV) |
|---|---|---|
| Logistic Regression | **81.33%** | 78.67% ± 3.71% |
| Random Forest | 77.33% | 78.33% ± 3.50% |
| Decision Tree | 77.33% | 77.00% ± 3.23% |
Random Forest 是默认模型,它提供各类别的置信度分数,并且绝不会将高风险资源误判为低风险。Logistic Regression 获得了最高的原始准确率,这很合理:因为二值特征空间在很大程度上是线性可分的。
## 项目结构
```
terraform-security-ml/
├── data/
│ ├── generate_dataset.py
│ ├── terraform_dataset.csv
│ └── sample_tf/
│ └── example.tf
├── src/
│ ├── feature_extractor.py
│ ├── model_trainer.py
│ ├── predictor.py
│ └── report_generator.py
├── notebooks/
│ └── exploration.ipynb
├── outputs/
│ ├── evaluation_report.json / .txt
│ ├── confusion_matrix_*.png
│ ├── feature_importance_*.png
│ ├── scan_*.json / .txt / .html
│ └── models/
├── main.py
└── requirements.txt
```
## 环境配置
```
cd terraform-security-ml
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
## 使用说明
运行此工具:
```
python main.py
```
这将启动一个交互式菜单,你可以选择扫描文件、扫描目录、训练模型或运行演示预测。
你也可以直接使用命令行参数:
```
python main.py --file path/to/main.tf # Scan a single file
python main.py --dir path/to/project/ # Scan a project directory
python main.py --train # Train the models
python main.py --predict # Run demo predictions
```
扫描完成后,打开生成的 HTML 报告:
```
open outputs/scan_.html
```