关于 drift-detector
drift-detector 使用 `snyk iac describe` 命令行工具比较 Terraform 状态与云资源。它引导团队扫描、评估并规划受支持的 AWS、Azure 和 GCP 资源的修复;本技能不会修改资源。
主要功能
- 01比较 Terraform 状态与云资源
- 02扫描本地和远程状态
- 03按服务筛选扫描范围
- 04以 JSON 导出漂移结果
- 05指导漂移评估与修复
适用场景
- 01部署前检查基础设施漂移
- 02事件发生后审计基础设施
- 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 项目
- 已配置云服务提供商凭据
- 已安装
snykCLI - 可访问云 API 的网络连接
支持的云服务提供商
| 服务提供商 | 设置 |
|---|---|
| AWS | AWS 凭据(配置文件、环境变量或 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
限制
- 只读:此技能仅检测偏差,不会修改资源
- 需要凭证:需要云服务提供商访问权限
- 服务覆盖范围:并非支持所有资源类型
- 需要状态:必须有 Terraform 状态才能进行比较
- 需要网络:需要访问云 API