mcpField
D
drift-detector

drift-detector

github.com/snykCloud & DevOps68123 installsUpdated 1w ago
Repository

About drift-detector

drift-detector is a skill for comparing Terraform state with cloud resources using the `snyk iac describe` CLI. It guides teams through scanning, assessing drift, and planning remediation for supported AWS, Azure, and GCP resources; it does not modify resources.

Key features

  1. 01Compare Terraform state with cloud resources
  2. 02Scan local and remote state
  3. 03Filter scans by service
  4. 04Export drift findings as JSON
  5. 05Guide drift assessment and remediation

Use cases

  1. 01Check for drift before deployment
  2. 02Audit infrastructure after an incident
  3. 03Find unmanaged cloud resources

Install

Copy the command and run it in a terminal.

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

After installing, type/drift-detectorin Claude Code to confirm it loaded.

Bundled filesreferences/drift-remediation.md

Details

From the project README

Infrastructure Drift Detector

Detect, track, and resolve infrastructure drift between Terraform state and actual cloud resources to maintain Infrastructure as Code integrity.

Core Principle: Your cloud should match your code.

Note: This skill uses snyk iac describe CLI command (requires shell execution).


Quick Start

# 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

Prerequisites

  • Terraform project with state file (local or remote)
  • Cloud provider credentials configured
  • snyk CLI installed
  • Network access to cloud APIs
Supported Cloud Providers
ProviderSetup
AWSAWS credentials (profile, env vars, or IAM role)
AzureAzure CLI login or service principal
GCPApplication default credentials or service account

For a full list of supported resource types per provider, see SERVICES.md.


Phase 1: Setup

Goal: Configure drift detection environment.

Step 1.1: Verify Terraform State

Check for Terraform state:

Local state:

ls terraform.tfstate

Remote state (S3 backend):

terraform {
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "state/terraform.tfstate"
    region = "us-east-1"
  }
}
Step 1.2: Verify Cloud Credentials

AWS:

aws sts get-caller-identity

Azure:

az account show

GCP:

gcloud auth application-default print-access-token

Phase 2: Run Drift Detection

Goal: Identify differences between IaC and actual cloud state.

Step 2.1: Basic Drift Scan
snyk iac describe --from=tfstate://terraform.tfstate
Step 2.2: Remote State Scan

For S3 backend:

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

For Terraform Cloud:

snyk iac describe \
  --from=tfstate+tfcloud://organization/workspace \
  --tfc-token=$TFC_TOKEN
Step 2.3: Specific Service Scan

To focus on specific AWS services:

snyk iac describe \
  --from=tfstate://terraform.tfstate \
  --service=aws_s3,aws_ec2,aws_rds
Step 2.4: JSON Output for Analysis
snyk iac describe \
  --from=tfstate://terraform.tfstate \
  --json > drift-report.json

Phase 3: Analyze Results

Goal: Understand and categorize drift.

Step 3.1: Drift Categories
CategoryDescriptionRisk Level
UnmanagedResources not in TerraformHigh - shadow IT
ChangedResources modified outside TerraformMedium - config drift
MissingResources in state but deletedLow - usually intentional
Step 3.2: Generate Report
## 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
Step 3.3: Risk Assessment

Prioritize Critical issues first (e.g. SSH opened to 0.0.0.0/0, production HA disabled), then High risk issues (e.g. unmanaged IAM users or security groups). Document the affected resource, the risk, and the intended remediation action for each finding.


Phase 4: Remediation

Goal: Resolve drift and restore IaC integrity.

Step 4.1: Import Unmanaged Resources

For resources that should be in 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"
}
Step 4.2: Remove Unauthorized Resources

For resources that shouldn't exist:

# After verification, delete unmanaged resources
aws s3 rb s3://unauthorized-bucket --force
aws ec2 terminate-instances --instance-ids i-temp-server
Step 4.3: Revert Changes

For resources modified outside Terraform:

# Re-apply Terraform to restore intended state
terraform apply
Step 4.4: Update Terraform (Adopt Changes)

If the manual change should be kept:

# 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
  }
}

Phase 5: Prevention

Goal: Prevent future drift.

Step 5.1: Generate Exclude Policy

For expected drift (auto-scaling, etc.):

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

This creates a .snyk policy file:

exclude:
  iac-drift:
    - aws_autoscaling_group.*
    - aws_ecs_service.*:desiredCount
Step 5.2: CI/CD Integration

Add drift detection to 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
Step 5.3: Regular Audits

Schedule regular drift audits:

FrequencyScopePurpose
DailyCritical resourcesSecurity monitoring
WeeklyAll productionConfiguration audit
MonthlyAll environmentsComprehensive review

Common Scenarios

For detailed worked examples, see EXAMPLES.md. Brief references:

  • Post-Incident Audit: Run drift detection with JSON output, filter for security-related resources, identify unauthorized changes, generate incident report, remediate and document.
  • Pre-Deployment Check: Run drift detection, fail deployment if drift exists, resolve drift first, then proceed with deployment.
  • Shadow IT Discovery: Run drift detection, filter to unmanaged resources, categorize by owner/purpose, import or remove as appropriate.

Error Handling

State Access Error
Error: Could not read Terraform state

Solutions:
1. Verify state file path
2. Check S3/backend permissions
3. Ensure terraform init has been run
Cloud Credential Error
Error: Authentication failed

Solutions:
1. Verify cloud credentials
2. Check IAM permissions for describe/list
3. Ensure credentials not expired
Service Not Supported
Warning: Service X not supported

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

Constraints

  1. Read-only: This skill only detects drift, doesn't modify resources
  2. Credentials required: Needs cloud provider access
  3. Service coverage: Not all resource types supported
  4. State required: Must have Terraform state to compare
  5. Network required: Needs access to cloud APIs

Comments

Markdown supported