kagioneko/incident-skills

GitHub: kagioneko/incident-skills

一套面向AI编程代理的服务器入侵应急响应技能集,通过分层权限控制和结构化设计防止AI在取证与处置过程中误删证据或越权操作。

Stars: 0 | Forks: 0

# incident-response skills AIエージェント(Claude Code / Antigravity 等)向けの、サーバー侵害対応スキル一式。 実際のVPS侵害インシデントと、**その調査中にAIエージェントが証拠ファイルを削除した事故** から設計されている。 | | | |---|---| | **設計の根拠** | [`ORIGINS.md`](ORIGINS.md) — 各ルールがどの事故から生まれたか | | **開発中の失敗** | [`FAILURES.md`](FAILURES.md) — 8件の自損記録 | | **経緯を書いた記事** | (note の URL をここに) | ## なぜ3つに分かれているのか インシデント対応の操作は、**緊急性**と**不可逆性**が一致しない。 だから権限も一律にできない。 | 操作 | 緊急性 | 不可逆性 | 自動発火 | 承認の単位 | |---|---|---|---|---| | 調査・判断 | 高 | 低 | **あり** | スコープ | | 封じ込め実行 | 高 | 中 | なし | Plan ID | | 証拠削除 | 低 | **高** | なし | 絶対パス + 確認トークン | incident-response 証拠を取って調べる (自動発火あり/環境を変更しない) incident-containment 攻撃者の動きを止める (手動起動のみ/dry-run既定) incident-cleanup 分析後に不要物を消す (手動起動のみ/原証拠は対象外) `incident-response` は封じ込め案・影響・ロールバック手順まで**生成する**が、**実行しない。** 実行は `incident-containment` に引き渡す。 ## 構成 incident-response/ ├── SKILL.md 保全・分析。原証拠を変更しない ├── scripts/ │ ├── collect_evidence.sh 証拠収集(quick/full・揮発性順・ギャップ記録) │ └── rehearse_containment.sh 平時演習(環境チェック・デッドマン付き実適用) └── references/ ├── rehearsal.md 平時演習の手順(本番を初回実行にしない) ├── containment_matrix.md Phase 0 封じ込め判断・事業者別コンソール案内 ├── persistence_hunting.md 永続化・バックドア探索(Tier 1〜3) └── hardening.md Layer 0〜5 の構造的ガード設定 └── templates/ ├── forensic_report.md 確度4段階・3範囲併記の報告書 └── credential_rotation.md 失効/再発行/再配備の3段階チェック incident-containment/ └── SKILL.md 隔離・遮断・失効。Plan ID 承認必須 incident-cleanup/ └── SKILL.md 削除。DELETE-CONFIRM 必須 ORIGINS.md 設計原則と、その元になった事故の対応表 FAILURES.md 開発中に踏んだ失敗の記録(設計判断の背景) TODO.md 未着手項目 ## 設計の核 ### 1. 指示ではなく構造で守る SKILL.md に「消すな」と書くのは**お願い**であって保証ではない。 Layer 0 OSレベルの読み取り専用マウント ← 物理境界 Layer 1 サンドボックス Layer 2 permissions の deny ルール Layer 3 PreToolUse フック(終了コード2で遮断) Layer 4 SKILL.md の判断規則 ← お願い Layer 5 監査ログ ### 2. 証拠ディレクトリを分ける evidence/ ├── original/ 読み取り専用。エージェントの作業範囲外に置くのが理想 ├── working-copy/ 分析用。書き込み可 ├── reports/ 報告書 └── audit/ 操作履歴(追記のみ) エージェントに渡すのは `working-copy/` `reports/` `audit/` のみ。 ### 3. 「安全です」と断定しない 全スキル共通で、報告に3項目を併記する。 | スキル | 併記する3項目 | |---|---| | incident-response | 確認した証拠 / 存在しない証拠 / 確認不能な証拠 | | incident-containment | 実施した封じ込め / 残存する経路 / 未失効の権限 | | incident-cleanup | 削除した対象 / 残した対象 / 原証拠の保全場所 | ❌ バックドアはありませんでした ⭕ 今回確認した永続化ポイントの範囲では、追加のバックドアを示す所見は 確認できませんでした。カーネル・メモリ・クラウド管理プレーンは 別途確認が必要です。 ## 使い方 ### 平時 1. スキルを配置する # Claude Code cp -r incident-response incident-containment incident-cleanup ~/.claude/skills/ # Antigravity / その他ディレクトリ型スキル対応環境 # 各環境のスキルディレクトリへ配置 2. `hardening.md` の設定を入れる(**これが本体。SKILL.md だけでは守れない**) 3. 収集キットの正本を手元に置く 4. **使い捨て環境で演習する**(`scripts/rehearse_containment.sh`) ※ 本番が初回実行になってはいけない。実際、このスキルの iptables コードは 査読3周・構文チェック済みで、初回実行時に実行者を締め出した 5. sshd の `LogLevel VERBOSE` を設定する ※ 侵害後に設定しても、過去の接続については何も分からない 6. `/var/log/journal` が存在するか確認する ※ 無ければ journald は揮発設定。再起動でログが消える ### 有事 Phase 0 封じ込め判断 containment_matrix.md ↓ ※ 事業者のコントロールパネルを先に開く Phase 1 証拠収集 collect_evidence.sh ↓ ※ 揮発性データ(ss/ps/who)は封じ込めの前に取る Phase 2 分析 読むだけ。実行しない。削除しない ↓ Phase 3 報告・失効 クリーン端末から ↓ Phase 4 再構築・移行 侵害環境を直して再利用しない ↓ Phase 5 クリーンアップ incident-cleanup を明示的に呼び出す # 収集(手元の正本を送り込む方式を推奨) scp collect_evidence.sh root@target:/var/tmp/ ssh root@target 'bash /var/tmp/collect_evidence.sh quick' # 秘密鍵・shadow・認証トークンの「本文」は収集されない(指紋のみ inventory/ に記録) # 回収して照合 scp root@target:/var/tmp/ir-evidence.*.tar.gz* ./evidence/original/ cd evidence/original && sha256sum -c ir-evidence.*.tar.gz.sha256 ## このスキルが保証しないもの 以下は**対象外**。できないことを先に明示する。 | 領域 | なぜ保証できないか | |---|---| | **カーネルルートキット** | 収集は侵害ホスト自身の `ps` `ss` `find` `lsmod` を使う。これらが差し替えられていれば、結果は攻撃者の見せたいものになる | | **ファームウェア / ブートキット改ざん** | OS より下の層。OS 上からは検出できない | | **クラウド管理プレーンの侵害** | IAM・startup-script・スナップショット共有はホスト内から見えない。`persistence_hunting.md` Tier 3 を**人間が手で**確認する必要がある | | **完全ディスクフォレンジック** | 本スキルはライブ・トリアージ。削除ファイルの復元、スラック領域、未割当領域は扱わない | | **メモリフォレンジック** | メモリイメージの取得・解析は範囲外。ファイルレスマルウェアは検出できない | | **法執行・訴訟レベルの証拠保全** | chain of custody の法的要件、第三者立会い、書き込み禁止装置などを満たさない | | **秘密情報の本文回収** | 秘密鍵・shadow・認証トークンは指紋のみ記録する(侵害ホスト上に平文の詰め合わせを作らないため) | | **「侵害されていないこと」の証明** | 本スキルが出せるのは「確認した範囲で所見がなかった」まで。不在証明はできない | ### 保証できないものに手が届く方法 | やりたいこと | 方法 | |---|---| | ルートキットの影響を受けない収集 | **ホストを停止**し、ディスクイメージを外部から取得して解析する | | クラウド側の確実な取得 | 管理プレーンからのスナップショット | | メモリ証拠 | ホストを停止せずネットワーク隔離し、外部からメモリ取得 | | 法執行レベルの保全 | 専門のフォレンジック業者・機関へ | ## 限界(技術的な注意点) NIST SP 800-61 Rev.3 および RFC 3227 を**参照した**設計だが、 これらへの適合を認定するものではない。 ## 既知の未着手 `TODO.md` を参照。主なもの: - chain_of_custody テンプレート(法執行レベルの保全は本スキルの対象外のため優先度低) - `find / -xdev` が別マウント(`/home` `/var` が別FS)を見落とす件 - atime 汚染: タイムラインを収集の先頭で採取する(現在はメタデータに注記のみ) スキル本体・収集スクリプト・テンプレートは実装完了。 収集スクリプトと演習スクリプトは実機テスト済み。 封じ込めコードは実機で2回適用・2回ロールバック検証済み。 ## 設計原則の出どころ このスキルのルールは、**すべて実際に起きた事故から抽出されている。** | スキルのルール | 元になった事故 | |---|---| | 「Continue」は承認ではない | 「Continue」の一言で AIエージェントが8ファイルを削除した | | 証拠保全は衛生管理より先 | 平文パスワードを含む `.bash_history` を分析前に削除した | | 削除は別スキル・自動起動禁止 | 分析スキルがそのまま削除権限へ到達できる構造だった | | `authorized_keys` はホーム外も探索 | バックドアが `/usr/.system/.ssh/` に置かれていた | | AIセッションはエージェント別に分ける | 証拠を取るつもりで、証拠を上書きしていた | | 秘密情報の本文は収集しない | 「詰め合わせを作るな」と書きながら詰め合わせを作っていた | | IN / OUT でチェーンを分ける | 送信の例外が、受信の開放に化けていた | | デッドマンスイッチを先に仕掛ける | 締め出されたとき、これが唯一の復旧手段だった | | 平時に使い捨て環境で演習する | 査読3周したコードが、初回実行で実行者を締め出した | **全32項目の対応表は [`ORIGINS.md`](ORIGINS.md) にある。** ルールを削る前に、対応する事故を読んでほしい。 **要らないように見えるルールほど、実際に踏んだ結果として残っている。** ## 開発中の失敗 このスキル自体が、開発中に8件の失敗を踏んでいる。 そのうち7件は「対象としている失敗と同じ形」だった。 `FAILURES.md` に全部残してある。設計判断の背景として読める。 ## 由来 2026年4月、`python3 -m http.server` をホームディレクトリで起動したまま放置し、 SSH秘密鍵とAI CLIツールの認証情報を含む24ファイルが持ち出された。 `usermod -u 0 -o -g 0 system` により UID 0 のアカウントが作られ、 `/usr/.system/.ssh/authorized_keys` に未知の公開鍵が追記された。 (外部侵入者による操作が最も整合的だが、`auth.log` の原本は残っていない) 4ヶ月後、その調査中に、AIエージェントが `.bash_history` `.mysql_history` `.ssh/known_hosts` を含む8ファイルを削除した。 現存する記録上、対象を特定した明示的な削除指示は確認できない。 削除という判断自体は、局所的には合理的だった(平文パスワードが含まれていた)。 間違っていたのは順番だった。 このスキルは、その順番を構造として固定するために書かれている。 - **`.ssh/` だけを収集する設計では、`/usr/.system/.ssh/` のバックドアは見つからない** → `find / -xdev -name 'authorized_keys*'` を必須にした - **「Continue」は削除の承認ではない** → 削除を別スキルに分離し、`disable-model-invocation: true` を付けた - **消す前に取っておくものを聞かないと、証拠は消える** → 収集フェーズを分析フェーズより前に固定した ## ライセンス MIT
标签:AI编程代理, Cutter, 子域名变形, 库, 应急响应, 数字取证, 自动化脚本, 自动化运维