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も見つけた。
            これも一緒に最適化すれば、より良いシステムになる!」
2. コンテキストの継続性問題
AI思考:「前のセッションで似たような修正をした記憶がある。
            今回も同じようにすべきだ(実際は別プロジェクトの記憶)」
3. 権限の概念の欠如
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"
   }
  1. 記事作成Claude → 記事を作成
  2. - shared/article-requests/を確認 - 記事を作成し、tips/articles/に保存 - インデックスを更新
  1. 物理的な分離による安全性
  2. - 記事作成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. 第1段階: CLAUDE.mdでの指示(現在)
  2. 第2段階: ディレクトリ分離での制限
  3. 第3段階: リポジトリ分離での完全隔離

3. 人間の役割の再定義

  • 従来: 実装者
  • 現在: AIの監督者・権限管理者
  • 重要: 定期的な権限レビューと違反チェック

まとめ:信頼と検証のバランス

AIとの協働開発では、「信頼しつつも検証する」姿勢が不可欠です。

今すぐできること

  1. CLAUDE.mdの作成
  2. - 各ディレクトリに役割を明記 - 禁止事項を明確に列挙
  1. ディレクトリ構造の整理
  2. - システムとコンテンツの明確な分離 - アクセス範囲の物理的制限
  1. ワークフローの文書化
  2. - 誰が何をすべきか明確に - イレギュラー対応の手順

長期的な取り組み

  1. 監視システムの構築
  2. - 意図しない変更の自動検出 - 権限違反のアラート
  1. AI教育の継続
  2. - 成功/失敗事例の蓄積 - より良い指示方法の研究

「記事を書いて」という簡単な依頼が、システム破壊につながる可能性がある。これがAI時代の現実です。しかし、適切な権限分離と明確な指示により、安全で生産的な協働が可能になります。

関連記事