detecting-container-drift-at-runtime について
コンテナイメージからの実行時の逸脱を検出し、調査と対応を進めるためのセキュリティスキルです。Falcoのルール例、Kubernetesでの制御、イメージダイジェストの確認を扱います。
主な機能
- 01バイナリ、ファイル、設定、パッケージ、ネットワークの逸脱分類
- 02実行中のファイルシステムと元イメージの比較
- 03動作とイメージダイジェストの監視
- 04Falco検出ルールの例
- 05隔離と排除の対応手順
活用シーン
- 01コンテナ侵害の疑いの調査
- 02実行時逸脱の検出ルール作成
- 03コンテナ変更の監視範囲の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill detecting-container-drift-at-runtimeインストール後、Claude Code で/detecting-container-drift-at-runtimeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
実行時のコンテナドリフトの検出
概要
コンテナドリフトとは、許可されていないファイル変更、予期しないバイナリの実行、設定の変更、パッケージのインストールによって、実行中のコンテナが元のイメージの状態から逸脱することです。コンテナは不変のインフラストラクチャーとして扱う必要があるため、ドリフトはすべて侵害の可能性を示す兆候です。検出手法では、DIE(検出、隔離、排除)モデルを活用します。不変であるべきワークロードは実行時に変更されないため、観測された変更は悪意のある活動を示す証拠となる可能性があります。
使用するタイミング
- 実行時のコンテナドリフト検出が必要なセキュリティインシデントを調査するとき
- この分野の検出ルールや脅威ハンティングクエリを作成するとき
- SOC アナリストが、この種の分析のための体系化された手順を必要とするとき
- 関連する攻撃手法に対するセキュリティ監視のカバレッジを検証するとき
前提条件
- ランタイムセキュリティツールを備えた Kubernetes クラスター v1.24+
- 実行時のドリフト検出に使用する Falco または Sysdig
- イメージマニフェストを利用できるコンテナイメージレジストリ
- Linux のファイルシステムレイヤーと OverlayFS に関する知識
主な概念
コンテナドリフトの種類
- バイナリドリフト:元のイメージに存在しないバイナリの実行(ダウンロードされたマルウェア、コンパイルされたツールなど)
- ファイルドリフト:コンテナのファイルシステム内でのファイルの作成、変更、削除
- 設定ドリフト:環境変数、マウントされたシークレット、ランタイムパラメーターの変更
- パッケージドリフト:実行時に apt、yum、pip、npm を介して新しいパッケージをインストールすること
- ネットワークドリフト:ワークロードで想定されていない新しい待ち受けポートやアウトバウンド接続
検出方法
イメージベースの比較:実行中のコンテナのファイルシステムをソースイメージと比較し、追加、変更、削除されたファイルを特定します。
振る舞いの監視:eBPF またはカーネルレベルの監視を使用して、想定される振る舞いから逸脱するプロセス実行、ファイルアクセス、ネットワークアクティビティを検出します。
ダイジェストの検証:実行中のコンテナイメージのダイジェストが、承認済みのデプロイマニフェストと一致することを継続的に検証します。
Falco による実装
新しいバイナリの実行を検出する
- rule: Drift Detected (Container Image Modified Binary)
desc: Detect execution of a binary not present in the original container image
condition: >
spawned_process and
container and
not proc.pname in (container_entrypoint) and
proc.is_exe_upper_layer = true
output: >
Drift detected: new binary executed in container
(user=%user.name command=%proc.cmdline container=%container.name
image=%container.image.repository:%container.image.tag
exe_path=%proc.exepath)
priority: WARNING
tags: [container, drift]
- rule: Container Shell Spawned
desc: Detect interactive shell in a container that should be immutable
condition: >
spawned_process and
container and
proc.name in (bash, sh, dash, zsh, csh, ksh) and
not proc.pname in (container_entrypoint)
output: >
Shell spawned in container (user=%user.name shell=%proc.name
container=%container.name image=%container.image.repository)
priority: WARNING
tags: [container, drift, shell]
パッケージマネージャーの使用を検出する
- rule: Package Manager Execution in Container
desc: Detect use of package managers indicating drift
condition: >
spawned_process and
container and
proc.name in (apt, apt-get, yum, dnf, apk, pip, pip3, npm, gem, cargo)
output: >
Package manager executed in container (user=%user.name
command=%proc.cmdline container=%container.name
image=%container.image.repository)
priority: ERROR
tags: [container, drift, package-manager]
ファイルシステムの変更を検出する
- rule: Container File System Write
desc: Detect writes to container upper layer filesystem
condition: >
open_write and
container and
fd.typechar = 'f' and
not fd.name startswith /tmp and
not fd.name startswith /var/log and
not fd.name startswith /proc
output: >
File write in container (user=%user.name file=%fd.name
container=%container.name)
priority: NOTICE
tags: [container, drift, filesystem]
Kubernetes による適用
ルートファイルシステムを読み取り専用にする
コンテナのファイルシステムを不変にして、ドリフトを防止します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: immutable-app
spec:
template:
spec:
containers:
- name: app
image: app:v1.0@sha256:abc123...
securityContext:
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
runAsNonRoot: true
volumeMounts:
- name: tmp
mountPath: /tmp
- name: cache
mountPath: /var/cache
volumes:
- name: tmp
emptyDir:
sizeLimit: 100Mi
- name: cache
emptyDir:
sizeLimit: 50Mi
Pod Security Standards の適用
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
イメージダイジェストの検証
継続的なダイジェストの監視
#!/bin/bash
# Compare running container digests against approved manifest
NAMESPACE="production"
kubectl get pods -n "$NAMESPACE" -o json | jq -r '
.items[] |
.spec.containers[] |
"\(.image) \(.imageID)"
' | while read IMAGE IMAGE_ID; do
APPROVED_DIGEST=$(kubectl get deploy -n "$NAMESPACE" -o json | \
jq -r ".items[].spec.template.spec.containers[] | select(.image==\"$IMAGE\") | .image")
if [[ "$IMAGE" != *"@sha256:"* ]]; then
echo "[WARN] Container using mutable tag: $IMAGE"
fi
done
Microsoft Defender for Containers との統合
Azure Kubernetes 環境では、Microsoft Defender に組み込みのバイナリドリフト検出機能が用意されています。
{
"alertType": "K8S.NODE_ImageBinaryDrift",
"severity": "Medium",
"description": "Binary executed that was not part of the original container image",
"remediationSteps": [
"Investigate the binary origin and purpose",
"Check if the container was compromised",
"Rebuild the container from a clean image",
"Enable readOnlyRootFilesystem"
]
}
ドリフト対応プレイブック
- 検出:ドリフトイベントに対するアラートが発生します(Falco、Defender、Sysdig)
- 検証:ドリフトが承認済みのプロセス(init コンテナ、設定の再読み込みなど)によるものではないことを確認します
- 隔離:影響を受けた Pod に deny-all NetworkPolicy を適用します
- 調査:コンテナのファイルシステム差分とプロセス一覧を取得します
- 排除:ドリフトした Pod を削除します(ReplicaSet がクリーンなイメージから再作成します)
- 修復:根本原因に対処します(脆弱性へのパッチ適用、イメージの更新、RBAC の強化)