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+ 个云应用程序的基础设施并发现相同的配置错误反复出现后构建的。 ![CI](https://github.com/NarahariRaghava/Pre-Deployment-Detection-of-Terraform-Security-Misconfigurations-Using-Machine-Learning/actions/workflows/ci.yml/badge.svg) ## 问题所在 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 ```