【実務・中級編】IaCにおけるドリフト検知と自動修復の仕組み – アプリケーションセキュリティ & 安全な開発防御ガイド

「設定変更は深夜の魔物」:IaCドリフトが招く脆弱性と、自動修復で守る鉄壁のクラウド環境

現場で戦うエンジニア諸君、お疲れ様。

「ちょっとだけ本番環境の設定を確認しよう」「緊急対応で一時的にIAM権限を広げた」――その“ちょっとした手動修正”が、数ヶ月後に致命的なセキュリティインシデントの引き金になる。これを我々の業界では「ドリフト(Drift)」と呼ぶ。

コード(IaC)で定義した理想の状態と、現場の「生きた」環境が乖離した瞬間、そこにはセキュリティの盲点が生まれる。今日は、このドリフトをどう検知し、どう自動修復して「コードこそが唯一の真実」という世界を作り上げるか、その泥臭い実装術を伝授しよう。

1. なぜ「ドリフト」が攻撃者の入り口になるのか

攻撃者は、完璧に守られたシステムを直接叩くことはしない。彼らが狙うのは、「管理者が忘れた頃に残された、意図しない設定の穴」だ。

例えば、開発者がトラブルシューティングのためにSecurity Groupのポート80を一時的に「0.0.0.0/0」へ開放し、そのまま戻し忘れたとしよう。IaCツール(Terraform等)の管理外で手動変更されたこのポートは、コード上は「制限されている」ように見えるため、監査ツールも開発者の目も欺く。

これがドリフトの恐怖だ。攻撃者は「コード上の防御策」と「実環境の脆弱な穴」の隙間を正確に突いてくる。

2. 実践:Terraform Drift検知と自動修復の設計

ドリフトを放置するのは、鍵のかかっていない玄関を放置するのと同じだ。我々は、これをCI/CDパイプラインに組み込み、機械的に矯正させる必要がある。

思考のプロセス

1. 検知: 定期的に `terraform plan` を実行し、差分があれば通知(Slack/Teamsへ)。
2. 修復: 意図しない変更であれば、TerraformのApplyを自動実行して「コードの状態」に強制的に戻す。

実装サンプル:GitHub Actionsによるドリフト検知パイプライン

以下のYAMLは、毎日深夜や定期的に実行し、ドリフトがあれば即座に検知するパイプラインの雛形だ。

.github/workflows/drift-detection.yml
name: “Terraform Drift Detection”

on:
schedule:
# 毎日午前3時に実行し、夜中の勝手な変更を検知する

  • cron: ‘0 3 ‘

workflow_dispatch:

jobs:
drift-check:
runs-on: ubuntu-latest
steps:

  • uses: actions/checkout@v3
  • name: Terraform Init

run: terraform init

  • name: Terraform Plan

# -detailed-exitcode: 差分がある場合に終了コード2を返す
run: terraform plan -detailed-exitcode -out=tfplan
continue-on-error: true
id: plan

  • name: Notify & Auto-Remediate

if: steps.plan.outcome == ‘failure’
run: |
echo “ドリフトを検知!自動修復を開始します…”
# ここでSlack通知を飛ばすフックを入れるのが定石
terraform apply -auto-approve tfplan

3. なぜ「手動修正」を許してはいけないのか(IAMによる封じ込め)

どんなにパイプラインを組んでも、現場のエンジニアがコンソールから手動でポチポチ変更できてしまっては意味がない。「権限の最小化」こそが最大の防御だ。

AWSであれば、サービスコントロールポリシー(SCP)やIAMポリシーで、手動変更を物理的に防ぐ設計を導入しよう。

推奨:特定のIAMロール以外からの「変更」を拒否するポリシー例

{
“Version”: “2012-10-17”,
“Statement”: [
{
“Sid”: “DenyManualChanges”,
“Effect”: “Deny”,
“Action”: [
“ec2:AuthorizeSecurityGroupIngress”,
“iam:PutRolePolicy”,
“s3:PutBucketPolicy”
],
“Resource”: “”,
“Condition”: {
“StringNotLike”: {
“aws:PrincipalArn”: [
“arn:aws:iam::123456789012:role/TerraformExecutionRole”
]
}
}
}
]
}

このポリシーを適用すれば、Terraform専用の実行ロール以外がセキュリティグループを弄ろうとした瞬間に、AWS側でアクセス拒否が発生する。これで「手動の魔物」を物理的に締め出せる。

4. セキュリティチーフからの提言:泥臭い運用こそが最強

多くのエンジニアが「ツールを入れれば安心」と錯覚するが、それは大きな罠だ。

1. ドリフトを「悪」と決めつけない: 時には緊急対応で手動修正が必要なケースもある。その場合は、「手動で直したら、必ずその日のうちにIaCのコードを修正し、Terraformを流して『状態を同期』させる」という文化を根付かせること。
2. 可視化を怠るな: ドリフトが発生したこと自体を隠してはいけない。Slackの監視チャネルに流し、「なぜドリフトしたのか」をチームで振り返る文化こそが、真のセキュリティレベルを向上させる。

セキュリティとは、完璧なシステムを作ることではない。「異常が発生したときに、それを即座に検知し、あるべき姿へ戻すサイクルを止めないこと」だ。

さあ、明日からの運用で、あなたのクラウド環境の「ドリフト」を徹底的に排除してくれ。現場からは以上だ。何かあればまた聞きに来なさい。

コメント

タイトルとURLをコピーしました