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"
    }
    
  2. 記事作成Claude → 記事を作成

    • shared/article-requests/を確認
    • 記事を作成し、tips/articles/に保存
    • インデックスを更新
  3. 物理的な分離による安全性

    • 記事作成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. ディレクトリ構造の整理

    • システムとコンテンツの明確な分離
    • アクセス範囲の物理的制限
  3. ワークフローの文書化

    • 誰が何をすべきか明確に
    • イレギュラー対応の手順

長期的な取り組み

  1. 監視システムの構築

    • 意図しない変更の自動検出
    • 権限違反のアラート
  2. AI教育の継続

    • 成功/失敗事例の蓄積
    • より良い指示方法の研究

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

関連記事

画像を読み込み中...

📢 この発見を仲間にも教えませんか?

同じ課題を持つ人に届けることで、AI協働の輪が広がります

関連記事