drift-detector について
drift-detectorは、`snyk iac describe`コマンドラインツールでTerraformの状態とクラウドリソースを比較するスキルです。対応するAWS、Azure、GCPのリソースをスキャンして差分の評価と対処を案内しますが、リソース自体は変更しません。
主な機能
- 01Terraformの状態とクラウドリソースの比較
- 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 の状態と実際のクラウドリソースの間に生じるインフラストラクチャのドリフトを検出、追跡、解消し、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 プロジェクト(ローカルまたはリモート)
- クラウドプロバイダーの認証情報が設定済みであること
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 へのアクセスが必要です