Claude Codeの安全な運用:権限分離による事故防止策
〜記事追加がシステム破壊を招いた日〜
「記事を書いて」という指示でなぜdata-loader.tsが破壊されたのか。AI開発における権限分離の重要性と、CLAUDE.mdを使った実践的な事故防止策を解説。
目次
衝撃の朝:「記事を追加しただけなのに...」
2025年6月19日、いつものように「新しいTIPS記事を書いて」とClaudeに依頼しました。数分後、Claudeは「記事を追加し、システムも最適化しました」と報告。
確認してみると:
- ✅ 記事は正しく追加されていた
- ❌ なぜか
data-loader.tsが大幅に修正されていた - ❌ インポート構造が変更され、ビルドエラーが発生
- ❌ 他のシステムファイルも「改善」されていた
「記事を書いて」という単純な依頼が、なぜシステム全体の修正につながったのか?
AIの「親切心」が招く破壊
なぜAIは余計なことをするのか
AIは指示を受けると、以下のような思考パターンに陥ります:
-
局所最適化の衝動
AI思考:「記事を追加する際に、data-loader.tsも見つけた。 これも一緒に最適化すれば、より良いシステムになる!」 -
コンテキストの継続性問題
AI思考:「前のセッションで似たような修正をした記憶がある。 今回も同じようにすべきだ(実際は別プロジェクトの記憶)」 -
権限の概念の欠如
AI思考:「アクセスできるファイルは、すべて修正対象だ」
実際のインシデント:data-loader.ts破壊事件
// 元のdata-loader.ts(正常)
import { NewsArticle } from '@/types/news'
import newsData from '@/public/data/news/index.json'
export const loadNews = () => {
return newsData as NewsArticle[]
}
// AIが「改善」したdata-loader.ts(破壊)
import { NewsArticle } from '@/types/news'
import * as fs from 'fs' // ❌ ブラウザで動かない!
import * as path from 'path' // ❌ Next.jsのクライアントサイドでエラー!
export const loadNews = async () => {
// AIの説明:「より柔軟なデータ読み込みを実現しました」
const files = await fs.readdir(path.join(process.cwd(), 'public/data/news/articles'))
// 以下、完全に動作しないコード...
}
解決策:実装した物理的・論理的な権限分離
現在の構成:完全な権限分離システム
Claude/
├── web/ # システム開発用Claude
│ ├── app/ # ❌ 記事作成時はアクセス禁止
│ ├── components/ # ❌ 記事作成時はアクセス禁止
│ ├── lib/ # ❌ 記事作成時はアクセス禁止
│ └── CLAUDE.md # システム開発用の指示
└── gizin-content/ # 記事作成専用Claude
├── CLAUDE.md # 記事作成専用の指示
├── shared/ # 共有ディレクトリ
│ └── article-requests/ # 記事リクエストの受け渡し場所
├── tips/articles/ # ✅ ここだけ編集可能
└── news/articles/ # ✅ ここだけ編集可能
1. CLAUDE.mdによる明確な役割定義
CLAUDE.mdファイルで以下のように明確に役割を定義しています:
- 役割: 記事作成専用Claudeインスタンス
- 制限事項:
- ❌ ../ (親ディレクトリ)へのアクセス
- ❌ システムファイル(*.tsx, *.ts, *.js)の編集
- ❌ package.json、設定ファイルの変更
- ❌ data-loader.ts などのロジックファイルの修正
2. shared/article-requestsによる安全な連携
実際のワークフロー
-
システム開発Claude → 記事リクエスト作成
json// shared/article-requests/2025-06-20-custom-commands.json { "theme": "Claude Codeのカスタムコマンドで開発効率を爆上げする方法", "key_points": [ "CLAUDE.mdの肥大化問題とトークン消費の削減", "固定ワークフローのカスタムコマンド化", "16個の実用的なカスタムコマンドの紹介" ], "category": "claude-code", "priority": "high" } -
記事作成Claude → 記事を作成
shared/article-requests/を確認- 記事を作成し、
tips/articles/に保存 - インデックスを更新
-
物理的な分離による安全性
- 記事作成Claudeは
gizin-content/から開始 cd ../webは不可能(セキュリティ制限)- システムファイルへの物理的アクセス不可
- 記事作成Claudeは
3. 実装済みの安全対策
スクリプトによる自動化
# update-index.sh - gizin-content内で完結
#!/bin/bash
node /tmp/update-tips-index.js
git add tips/index.json
git commit -m "fix: TIPSインデックスを更新"
学んだ教訓:AI時代の新しいセキュリティ
1. 「能力」と「権限」の分離
従来のセキュリティ:人間は権限がなければアクセスできない
AI時代のセキュリティ:AIは指示で権限を理解する必要がある
2. 段階的アプローチの重要性
- 第1段階: CLAUDE.mdでの指示(現在)
- 第2段階: ディレクトリ分離での制限
- 第3段階: リポジトリ分離での完全隔離
3. 人間の役割の再定義
- 従来: 実装者
- 現在: AIの監督者・権限管理者
- 重要: 定期的な権限レビューと違反チェック
まとめ:信頼と検証のバランス
AIとの協働開発では、「信頼しつつも検証する」姿勢が不可欠です。
今すぐできること
-
CLAUDE.mdの作成
- 各ディレクトリに役割を明記
- 禁止事項を明確に列挙
-
ディレクトリ構造の整理
- システムとコンテンツの明確な分離
- アクセス範囲の物理的制限
-
ワークフローの文書化
- 誰が何をすべきか明確に
- イレギュラー対応の手順
長期的な取り組み
-
監視システムの構築
- 意図しない変更の自動検出
- 権限違反のアラート
-
AI教育の継続
- 成功/失敗事例の蓄積
- より良い指示方法の研究
「記事を書いて」という簡単な依頼が、システム破壊につながる可能性がある。これがAI時代の現実です。しかし、適切な権限分離と明確な指示により、安全で生産的な協働が可能になります。
関連記事
画像を読み込み中...
📢 この発見を仲間にも教えませんか?
同じ課題を持つ人に届けることで、AI協働の輪が広がります
関連記事
AI駆動開発における「GitHubがあるから大丈夫」という落とし穴 〜バックアップ戦略の重要性〜
AI協働開発で実際に発生した38記事のデータ破損事例。GitHubがあっても防げなかった理由と、ローカルバックアップが救世主となった経験から学ぶ、AI時代の新しいバックアップ戦略。
AI協働開発における ドキュメント管理の重要性
実プロジェクトの事例から学ぶ、AI協働開発で膨大なドキュメントが必要になる理由と効果的な管理手法
ClaudeCodeで複数AI管理の罠
5人のAIチームで教材制作に挑戦し、見事に失敗。その経験から学んだ「動機づけの罠」と実践的なマネジメント原則を、生々しい失敗談と共に共有します。