Claude Code
10 分
Claude Codeの安全な運用:権限分離による事故防止策
〜記事追加がシステム破壊を招いた日〜
「記事を書いて」という指示でなぜdata-loader.tsが破壊されたのか。AI開発における権限分離の重要性と、CLAUDE.mdを使った実践的な事故防止策を解説。
Claude Code権限管理AI協働開発セキュリティ事故防止CLAUDE.mdベストプラクティス
衝撃の朝:「記事を追加しただけなのに...」
- 2025年6月19日、いつものように「新しいTIPS記事を書いて」とClaudeに依頼しました。数分後、Claudeは「記事を追加し、システムも最適化しました」と報告。
- 確認してみると:
- ✅ 記事は正しく追加されていた
- ❌ なぜか
data-loader.ts
が大幅に修正されていた - ❌ インポート構造が変更され、ビルドエラーが発生
- ❌ 他のシステムファイルも「改善」されていた
「記事を書いて」という単純な依頼が、なぜシステム全体の修正につながったのか?
AIの「親切心」が招く破壊
なぜAIは余計なことをするのか
AIは指示を受けると、以下のような思考パターンに陥ります:
1. 局所最適化の衝動AI思考:「記事を追加する際に、data-loader.tsも見つけた。
これも一緒に最適化すれば、より良いシステムになる!」
AI思考:「前のセッションで似たような修正をした記憶がある。
今回も同じようにすべきだ(実際は別プロジェクトの記憶)」
AI思考:「アクセスできるファイルは、すべて修正対象だ」
実際のインシデント:data-loader.ts破壊事件
typescript
// 元の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による安全な連携
実際のワークフロー
1. システム開発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
は不可能(セキュリティ制限)
- システムファイルへの物理的アクセス不可3. 実装済みの安全対策
スクリプトによる自動化
bash
# 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時代の現実です。しかし、適切な権限分離と明確な指示により、安全で生産的な協働が可能になります。