mcpField
D
drift-detector

drift-detector

github.com/snyk云与 DevOps68123 次安装1 周前更新
代码仓库

关于 drift-detector

drift-detector 使用 `snyk iac describe` 命令行工具比较 Terraform 状态与云资源。它引导团队扫描、评估并规划受支持的 AWS、Azure 和 GCP 资源的修复;本技能不会修改资源。

主要功能

  1. 01比较 Terraform 状态与云资源
  2. 02扫描本地和远程状态
  3. 03按服务筛选扫描范围
  4. 04以 JSON 导出漂移结果
  5. 05指导漂移评估与修复

适用场景

  1. 01部署前检查基础设施漂移
  2. 02事件发生后审计基础设施
  3. 03发现未纳入管理的云资源

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/snyk/studio-recipes --skill drift-detector

安装后在 Claude Code 中输入/drift-detector确认已加载。

附带文件references/drift-remediation.md

详细介绍

基础设施漂移检测器

检测、跟踪并解决 Terraform 状态与实际云资源之间的基础设施漂移,以维护基础设施即代码的完整性。

核心原则:云环境应与代码保持一致。

注意:此技能使用 snyk iac describe CLI 命令(需要执行 shell 命令)。


快速开始

# Basic drift scan against a local Terraform state file
snyk iac describe --from=tfstate://terraform.tfstate

# Output as JSON for further analysis
snyk iac describe --from=tfstate://terraform.tfstate --json > drift-report.json

前提条件

  • 包含状态文件(本地或远程)的 Terraform 项目
  • 已配置云服务提供商凭据
  • 已安装 snyk CLI
  • 可访问云 API 的网络连接
支持的云服务提供商
服务提供商设置
AWSAWS 凭据(配置文件、环境变量或 IAM 角色)
Azure登录 Azure CLI 或使用服务主体
GCP应用程序默认凭据或服务账号

各服务提供商支持的资源类型完整列表,请参见 SERVICES.md。


阶段 1:设置

目标:配置漂移检测环境。

步骤 1.1:验证 Terraform 状态

检查 Terraform 状态:

本地状态:

ls terraform.tfstate

远程状态(S3 后端):

terraform {
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "state/terraform.tfstate"
    region = "us-east-1"
  }
}
步骤 1.2:验证云凭据

AWS:

aws sts get-caller-identity

Azure:

az account show

GCP:

gcloud auth application-default print-access-token

阶段 2:运行漂移检测

目标:识别 IaC 与实际云状态之间的差异。

步骤 2.1:基本漂移扫描
snyk iac describe --from=tfstate://terraform.tfstate
步骤 2.2:远程状态扫描

对于 S3 后端:

snyk iac describe --from=tfstate+s3://my-bucket/state.tfstate

对于 Terraform Cloud:

snyk iac describe \
  --from=tfstate+tfcloud://organization/workspace \
  --tfc-token=$TFC_TOKEN
步骤 2.3:扫描特定服务

要聚焦于特定 AWS 服务:

snyk iac describe \
  --from=tfstate://terraform.tfstate \
  --service=aws_s3,aws_ec2,aws_rds
步骤 2.4:生成 JSON 输出以供分析
snyk iac describe \
  --from=tfstate://terraform.tfstate \
  --json > drift-report.json

阶段 3:分析结果

目标:理解并分类漂移。

步骤 3.1:漂移类别
类别描述风险级别
未受管理不在 Terraform 中的资源高——影子 IT
已更改在 Terraform 之外修改的资源中——配置漂移
缺失状态中存在但已删除的资源低——通常是有意为之
步骤 3.2:生成报告
## Infrastructure Drift Report

Scan Date: 2024-01-15
Terraform State: s3://my-bucket/prod.tfstate
Cloud Provider: AWS (us-east-1)

### Summary
- Unmanaged Resources: 12 (High)
- Changed Resources:    5  (Medium)
- Missing Resources:    2  (Low)
- Total Drift:         19

### Unmanaged Resources (Not in Terraform)
- aws_s3_bucket      | prod-logs-manual   | High     | Import or delete
- aws_security_group | sg-temp-access     | Critical | Review and remove

### Changed Resources (Modified Outside Terraform)
- aws_security_group.web | ingress: [443]   → ingress: [443, 22]  | High
- aws_rds_instance.main  | multi_az: true   → multi_az: false      | Critical
步骤 3.3:风险评估

优先处理 严重 问题(例如,SSH 对 0.0.0.0/0 开放、生产环境 HA 已禁用),然后处理 高 风险问题(例如,未受管理的 IAM 用户或安全组)。针对每项发现,记录受影响的资源、风险以及计划采取的修复措施。


阶段 4:修复

目标:解决漂移并恢复 IaC 完整性。

步骤 4.1:导入未受管理的资源

对于应该纳入 Terraform 管理的资源:

# Generate import block
terraform import aws_s3_bucket.manual_bucket prod-logs-manual

# Or use import block (Terraform 1.5+)
import {
  to = aws_s3_bucket.manual_bucket
  id = "prod-logs-manual"
}
步骤 4.2:移除未经授权的资源

对于不应存在的资源:

# After verification, delete unmanaged resources
aws s3 rb s3://unauthorized-bucket --force
aws ec2 terminate-instances --instance-ids i-temp-server
步骤 4.3:还原更改

对于在 Terraform 之外修改的资源:

# Re-apply Terraform to restore intended state
terraform apply
步骤 4.4:更新 Terraform(采用更改)

如果应保留手动更改:

# Update Terraform to match new reality
resource "aws_security_group" "web" {
  # Add the new rule
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["10.0.0.0/8"]  # Restrict if keeping
  }
}

阶段 5:预防

目标:防止未来发生漂移。

步骤 5.1:生成排除策略

对于预期的漂移(自动扩缩等):

snyk iac update-exclude-policy \
  --exclude-unmanaged \
  --exclude-changed

这会创建一个 .snyk 策略文件:

exclude:
  iac-drift:
    - aws_autoscaling_group.*
    - aws_ecs_service.*:desiredCount
步骤 5.2:集成 CI/CD

将漂移检测添加到 CI/CD 中:

# GitHub Actions example
- name: Check for Infrastructure Drift
  run: |
    snyk iac describe \
      --from=tfstate+s3://my-bucket/prod.tfstate \
      --json > drift.json
    
    # Fail if unmanaged resources found
    if [ $(jq '.summary.total_unmanaged' drift.json) -gt 0 ]; then
      echo "Drift detected!"
      exit 1
    fi
步骤 5.3:定期审计

安排定期漂移审计:

频率范围用途
每日关键资源安全监控
每周所有生产环境配置审计
每月所有环境全面审查

常见场景

详细的完整示例请参见 EXAMPLES.md。简要参考:

  • 事件后审计:运行漂移检测并输出 JSON,筛选与安全相关的资源,识别未经授权的更改,生成事件报告,进行修复并记录。
  • 部署前检查:运行漂移检测,如果存在漂移则中止部署;先解决漂移,再继续部署。
  • 发现影子 IT:运行漂移检测,筛选未受管理的资源,按所有者/用途分类,并酌情导入或移除。

错误处理

状态访问错误
Error: Could not read Terraform state

Solutions:
1. Verify state file path
2. Check S3/backend permissions
3. Ensure terraform init has been run
云凭据错误
Error: Authentication failed

Solutions:
1. Verify cloud credentials
2. Check IAM permissions for describe/list
3. Ensure credentials not expired
不支持的服务
Warning: Service X not supported

Solutions:
1. Check supported services list
2. Use Terraform plan comparison instead
3. Report to Snyk for feature request

限制

  1. 只读:此技能仅检测偏差,不会修改资源
  2. 需要凭证:需要云服务提供商访问权限
  3. 服务覆盖范围:并非支持所有资源类型
  4. 需要状态:必须有 Terraform 状态才能进行比较
  5. 需要网络:需要访问云 API

评论

支持 Markdown