mcpField
D
drift-detector

drift-detector

github.com/snykクラウド・DevOps68123 回インストール1 週間前に更新
リポジトリ

drift-detector について

drift-detectorは、`snyk iac describe`コマンドラインツールでTerraformの状態とクラウドリソースを比較するスキルです。対応するAWS、Azure、GCPのリソースをスキャンして差分の評価と対処を案内しますが、リソース自体は変更しません。

主な機能

  1. 01Terraformの状態とクラウドリソースの比較
  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 の状態と実際のクラウドリソースの間に生じるインフラストラクチャのドリフトを検出、追跡、解消し、Infrastructure as Code の整合性を維持します。

基本原則:クラウドの状態はコードと一致している必要があります。

注:このスキルでは snyk iac describe CLI コマンドを使用します(シェルの実行が必要です)。


クイックスタート

# 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 ロール)
AzureAzure 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 へのアクセスが必要です

コメント