Claude Code 運用 / 2026-10-06 / 筆者環境(医療系ソフトウェア企業)での計画

「個人情報を Claude に送らない」ために、やろうとしていること

投げて待つだけの Auto モードは、そのまま。
変えるのは一点だけ——生の個人情報が置いてある場所に Claude Code が届かないようにして、個人情報が要る処理は手元のプログラムが代わりに実行し、個人が出てこない結果だけを Claude に返す。 「送ってから消す」のではなく「届く場所に置かない」。

今とこれからの、データの流れ 今は、個人情報を含むデータを Claude Code が直接読み、そのまま Anthropic API に届く。これからは、手元の実行口が実データを処理し、集計・スキーマ・札に置き換えた本文だけが Claude Code に渡る。直接の読み取りは deny と sandbox で遮断し、最後の網として pii-guard が出力を検査する。 今 手元(あなたの Mac ・ 社内) Anthropic DB・CSV・Slack Gmail・Sentry Read / Bash / コネクタで読む Claude Code 文脈 = 送られるもの そのまま API Fable 5.1 読んだものは全部そのまま届く。Fable 5.1 は 30 日以上保持され ZDR も不可。日本語の氏名検出は 8 割なので「送る直前に消す」も頼れない。 これから 手元(あなたの Mac ・ 社内) Anthropic 直接は読めない:deny と sandbox で遮断 DB・CSV・Slack Gmail・Sentry 手元の実行口 safe-data ・ support-intake slack-safe 実データで実行し、結果だけ返す 札と実名の対応表(vault)はここ 集計・スキーマ 札に置換した本文 pii-guard 最後の網 Claude Code 文脈には札と集計だけ API Opus 5.5(ZDR 可) Claude に届くのは「個人が出てこない結果」だけ。止めるときは無言で止めるので、確認ダイアログは増えない。

方針は三つ

順番に意味がある。1 と 2 で「送るものがない」状態を作り、3 はそれでも混ざったときの保険。

  1. 1. 置かない

    Claude Code が読める場所に、生の個人情報を置かない。個人情報のある場所(~/PII、本番 DB、Downloads など)は設定で読めなくし、画面・クリップボード・コネクタなど「ファイルでもコマンドでもない経路」は外す。

  2. 2. 手元で実行する

    個人情報が要る処理は、Claude が書いた SQL やスクリプトを手元のプログラムが実データに対して実行し、結果(件数・分布・スキーマ・札に置き換えた本文)だけを Claude に返す。Claude は中身を見ずに仕事ができる。

  3. 3. 検出は最後の網

    日本語の氏名を自動で見つける精度は、良くて 8 割。だから検出を主役にはしない。それでも何かの出力に混ざったとき、Claude に渡る直前で札に置き換える「保険」として置く。

Auto モードを守るルール:確認ダイアログを足さない。止めるときは無言で止め(deny)、変換するときは形を保って変換する。hook は「聞く(ask)」を返さない。そして塞ぐのは個人情報の実在パスだけ——~/Library 全体や *.amazonaws.com を丸ごと塞ぐと開発環境が静かに壊れ、それは確認ダイアログより体験を壊す。

なぜ「送る直前に消す」ではだめなのか

最初に思いつく 3 つの近道が、いずれも使えないことが調査で確定した。

Claude Code が「送っているもの」の全リスト

ユーザーが打ったプロンプト、@ で指定したファイル、貼り付けた画像、Read / Bash / Grep の出力、MCP コネクタ(Gmail・Slack・Sentry…)の戻り値、CLAUDE.md とメモリ、過去の会話を圧縮した要約、サブエージェントの報告。さらに Auto モードの分類器は、コマンドの引数(SQL の WHERE 句に書いた実名など)と CLAUDE.md を審査対象にする。つまり「ツールが読んだもの」だけでなく「Claude が書こうとしたコマンド」も送信対象。

全体像:7 つの層

P0 は設定だけで今日できる。P1 で構造化データ(DB・CSV・ログ)由来の個人情報が止まる。P2 で自由記述(メール・Slack)の経路を閉じる。P3 は組織判断。

P0

1. 届く経路を限定する

設定のみ・1 日
やること
画面キャプチャ、クリップボード、ターミナル読取、他セッションの履歴検索、クラウド実行など「ファイルでもコマンドでもない経路」のツールを deny で外す。Gmail / Drive / Calendar / Docs コネクタは claude.ai 側で切断(Desktop 内蔵のコネクタは MCP 設定では止められない)。Artifact と /feedback(会話全文を送る)も無効化。
防ぐもの
画面やクリップボードに映った個人情報が文脈に入ること。Anthropic 側ホストへの書込み(Artifact / Docs)。
体験
確認 ±0使わないツールが消えるだけ。
P0

2. 読ませない

設定のみ・1 日
やること
個人情報が置いてある場所(~/PII、Downloads、Mail / Messages、本番 DB のホスト名、PII のある S3 バケットなど)を permissions.deny と Bash サンドボックスの両方で読めなくする。DB や AWS の資格情報は Claude Code の子プロセスの環境変数から剥がす。
防ぐもの
Read / cat / grep -r / 自前の Python スクリプト / psql 直結、どの手段でも生データに届かない。
体験
確認 ±0deny は無言。サンドボックス内のコマンドは確認なしで実行される。注意塞ぐのは実在パスだけ。開発に要る場所(~/Library/Caches、dev サーバ、AWS CLI)は塞がない。
P1

3. 見せずに処理する ── safe-data

自作 MCP・3〜5 日
やること
自作の MCP サーバー(手元で動く小さなプログラム)。Claude はこれに「スキーマを見せて」「この SQL を実行して」「このスクリプトを走らせて」と頼む。サーバーが実データに対して実行し、個人が出てこない結果だけを返す。
  • schema_describe ── ビューの定義と、Faker で作ったダミー 5 行。実データは一切返さない
  • sql_run ── 個人情報列を抜いたビューにだけ SELECT。少数の集計セル(n<11)は伏せる
  • py_run ── ネットワークなしのコンテナで実行。出力に実値が混ざっていたら拒否して理由だけ返す
  • fixture_from ── テスト用のダミーデータを生成(型と形だけ本物に合わせる)
防ぐもの
「分析のために生レコードを読む必要」そのもの。
体験
確認 0読み取り系は自動承認。Claude は中身を見ずにスクリプトを書き、結果を受け取る。いちばん体験が良い層。
P1

4. ソース側で構造的に断つ

DB・ETL・3〜5 日
やること
DB に個人情報列を除いたビュー(users_safe など)と専用の読取ロールを作り、safe-data はそのロールでしか繋げない。氏名の代わりに HMAC で作った擬似 ID を持たせ、DB・Sentry・問い合わせで同じ人が同じ ID になるようにする(突合はできる)。CSV / スプレッドシートは ETL で個人情報列を除いた安全化コピーを ./data/safe/ に出す。Sentry は組織設定でデータスクラブを ON。
防ぐもの
検出精度に関係なく「存在しない」状態にする。構造化データについては 100%。
体験
確認 ±0変化なし。
P2

5. 問い合わせの取り込み口 ── support-intake / slack-safe

自作 MCP・2〜3 週
やること
support@ のメールと Slack の問い合わせを、手元のプログラムが先に受け取る。送信者・署名・本文の氏名・連絡先・ID・住所・生年月日を [P12_NAME] のような札に置き換えてから Claude に渡す。札と実名の対応表(vault)は手元の暗号化 DB だけに置く。返信は Claude がテンプレートと札で下書き → 手元で札を実名に戻して Gmail の下書きに保存。送信は人。
本文の扱い
決定:個人を特定できなければ本文は見せてよい。識別子はすべて札に。年齢は年代、地域は地方ブロックに丸め、「まれな病名 × 地域 × 年代」のように個人に迫る組合せだけ伏せる。症状・服薬などの内容そのものは残す。
防ぐもの
メール / Slack の本文にある実名・連絡先が文脈に入ること。
体験
確認 0Gmail コネクタの代わりに tickets_list → tickets_get → reply_draft の 3 呼び出しで完結。Claude は「[P12_NAME] 様」までしか知らないが、分類・集計・返信下書きには困らない。
P2

6. 最後の網 ── pii-guard

常駐 + hook・2〜3 週
やること
手元に常駐するプログラムと Claude Code の hook。ツールの出力が Claude に渡る直前に、①自社の顧客 DB から毎晩生成する辞書(氏名・メール・電話・患者 ID)、②電話・〒・マイナンバー・患者 ID などの規則、③小型の日本語 NER、の順で検査して札に置き換える。プロンプトに辞書一致の実名や患者 ID が入っていたら、送る前に止めて「safe-data 経由で参照して」と案内する。
防ぐもの
それでも自由記述に残った取りこぼし。
体験
確認 0+ 数十 ms。「聞く」は返さない。設計上の注意リポジトリ内のコードには NER を掛けない(誤検出で Edit の一致が壊れると Claude が再読ループに入る)。hook はタイムアウトすると素通しなので、これを主役にしない。
P3

7. 推論先(万一のための保険)

組織判断
やること
既定モデルを Opus 5.5 に(Fable は 30 日保持・ZDR 不可のため常用しない)。そのうえで、組織として ZDR を有効化するか、Bedrock 東京(jp. プロファイル + 保持なし設定)に寄せる。
防ぐもの
万一漏れたときの「残り方」。これは「送らない」の代わりではない。
体験
第一者 API なら ±0Bedrock に寄せると WebSearch・claude.ai コネクタ・Desktop の通常モードを失う → 判断が要る。

日常の作業は、こう変わる

いつもの頼み方のまま。Claude の中で起きることだけが変わる。色は上の図と同じ意味。

「先月の問い合わせをカテゴリ別に集計して、#support-weekly に投稿して」

今
  1. Gmail コネクタメール全文を読む
  2. API氏名・連絡先・本文がそのまま届く
これから
  1. support-intake.tickets_list先月分のカテゴリ・製品・日付・擬似 ID だけ(名前も本文もなし)
  2. Claude集計して文章にする
  3. slack-safe.post投稿先は許可リスト。送る前に実値が混ざっていないか検査

差:Gmail を直接読まなくなるだけ。結果は同じ。確認ダイアログは 0。

「チケット T-881 のユーザーがログインできない原因を調べて直して」

今
  1. Bash: psqlusers テーブルを SELECT → 氏名・メールが文脈へ
  2. Sentry コネクタイベントに user.email
これから
  1. support-intake.tickets_get擬似 ID と、札に置き換えた本文
  2. safe-data.sql_runusers_safe ビュー:擬似 ID・アプリ版・プラン・最終ログイン日
  3. safe-data.sentry_events手元で擬似化したエラー要約
  4. Claude原因特定 → コード修正・PR はいつも通り

差:Claude は実名ではなく擬似 ID で人を指す。実名をコマンド引数に書こうとしたら、実行前に止めて擬似 ID を使うよう案内する。

「この利用ログ CSV から継続率を出してグラフにして」

今
  1. ReadCSV の全行が文脈へ
  2. APIユーザー ID・メール・行動ログが届く
これから
  1. あなたCSV を ~/PII/inbox/ に置く(Claude は読めない場所)
  2. safe-data.files_describeスキーマとダミー 5 行(実データは返さない)
  3. Claude分析スクリプトを書く
  4. safe-data.py_run手元のネットワークなしコンテナで実行。集計 JSON だけ返す(実値が混ざれば拒否)
  5. Claudeグラフとレポート

差:Claude は中身を見ずにスクリプトを書く。「見てから書く」より 1 往復増えることはあるが、確認ダイアログは 0。

「T-881 に返信の下書きを作って」

これから
  1. support-intake.tickets_getClaude が知るのは「[P12_NAME] 様」まで
  2. Claude → reply_draftテンプレートと札で下書き
  3. support-intake(手元)札を実名に戻して Gmail の下書きに保存
  4. あなた確認して送信

差:実名は手元で戻る。Claude の文脈には一度も入らない。

コードの修正・レビュー・PR

変わらない。条件は「リポジトリに個人情報を置かない」だけ(pre-commit で同じ検出器が走る)。dev サーバのプレビュー、テスト、AWS CLI もそのまま使える。

コネクタとツールの置き換え

「切る」ものには必ず代わりがある。代わりがないものは、もともと個人情報の経路ではない。

今これからなぜ
Gmail コネクタ置換 切断し、support-intake に。support@ だけを OAuth で読み、取込時に擬似化。返信は下書きまで本文に氏名・連絡先・健康情報が直接入る
Google Drive置換 切断。必要なファイルは ETL で安全化コピーを ./data/safe/ にスプレッドシートの顧客名列
Google Calendar切断 業務上の必要がなければ予定タイトルに顧客名
Claude Docs切断 または deny社内文書の読取と、Anthropic ホストへの書込みの双方向
Slack コネクタ置換 切断し、slack-safe に。Bot トークン、読むチャンネルと投稿先を許可リスト、擬似化問い合わせチャンネルに実名。Slack を読む既存 Skillは slack-safe に差し替え
Sentry置換 組織設定でスクラブ ON。有効化後 90 日はコネクタを deny し、safe-data.sentry_events で代替イベントに user.email 等。スクラブは既存イベントに遡及しない
Figmaそのまま個人情報の経路ではない
AWS MCP絞る run_script / get_presigned_url は deny。残りは S3 / DynamoDB / ログの読取を Deny した専用 IAM ロールで生データのバケットやテーブルに届く
GitKraken / gh の Issue・PR 本文絞る 本文取得だけ deny。git 操作・PR 作成・CI 確認は残すIssue に顧客のログが貼られることがある
画面・クリップボード・ターミナル読取・セッション検索・computer use・Chrome 拡張denyファイルでもコマンドでもない経路。Desktop 内蔵ツールへの deny が効くかは Day 0 で実測
内蔵ブラウザ絞る ページ内容を読む系だけ deny。dev サーバのプレビューとログは残す社内画面に個人情報。ダミーデータの環境でだけ使う
Artifact・クラウド実行・Routines・/feedback無効化Anthropic 側で動く・置かれる・会話全文を送る

決まったこと、まだ決めること

決まった(あなたの回答から)

  • モデル:Fable 5.1 は常用しない。既定は Opus 5.5(Covered Model ではなく、ZDR が可能)。
  • 利用面:Desktop でも CLI でもよい。Day 0 の実測で Desktop 内蔵ツールへの deny が効かなければ、個人情報に近い作業だけ CLI に寄せる。
  • コネクタ:置き換えてよい(上の表のとおり)。
  • 要配慮の内容:個人を特定できなければ、症状・服薬などを含む本文を Claude に見せてよい。識別子は札に、年齢・地域は丸める。
  • 設計:送信プロキシでのマスキングは採らない。「置かない + 手元で実行」を骨格に、検出は保険。

まだ決める(主に組織・環境)

  • 契約:/status の結果は Team / Enterprise か、API キーか。ZDR を有効化できるか。
  • 推論先:第一者 API + ZDR か、Bedrock 東京 jp.(WebSearch・コネクタ・Desktop 通常モードを失う)か。
  • 法務に 1 点:札に置き換えた本文 + 社内の対応表は「仮名加工情報」として扱われ得る。送信を「委託」として整理するかの確認。
  • 環境:DB は PostgreSQL か(違えば ETL で安全化レプリカを作る方式に)。sudo / 別ユーザー作成、Docker Desktop の可否。リポジトリが ~/Documents 等にあるか。
  • 権限:Sentry の組織管理者、Google Workspace 管理者(support@ の OAuth 承認)。
  • スコープ:従業員の情報(git author・メールアドレス)も対象にするか。構造的に毎回送られるので、ここは線引きが要る。

進め方

各フェーズの終わりに「何が止まったか」を偽の個人情報(カナリア)で確認してから次へ進む。

  1. Day 0半日

    棚卸しと実測

    /status /model /mcp でプラン・モデル・接続中コネクタを記録。偽の個人情報で、Desktop 内蔵ツールへの deny、ドラッグ&ドロップや画像貼付の挙動を実測。導入前の会話履歴を削除。

    完了:チェックリスト全項目 Yes。

  2. Phase 01〜2 日

    設定だけで「届く経路の限定」と「読ませない」

    settings.json(deny / sandbox / 環境変数)、コネクタ切断、モデルを Opus 5.5 に。

    完了:Auto で確認 0 回のまま、Desktop のワークスペース読み書き・dev サーバ・AWS CLI が動き、~/PII と本番 DB には届かない。

  3. Phase 13〜5 日

    構造的に断つ

    DB ビュー + 専用ロール、safe-data(schema / sql / fixture)、CSV の ETL、Sentry スクラブ、カナリア常駐。

    完了:構造化データ由来の個人情報が、会話の記録にも送信記録にも 0 件。

  4. Phase 24〜5 週

    自由記述の経路を閉じる

    support-intake + vault、slack-safe、pii-guard と日本語検出(辞書 → 規則 → NER)、py_run、Claude Code 更新ごとの契約テスト、夜間の送信記録スキャン。

    完了:契約テスト全緑。取りこぼし率を実測し記録。

  5. Phase 3組織判断

    保険と統制

    ZDR 契約 または Bedrock 東京、管理者が配布する設定(ユーザーが外せない deny)、監査ログ。

    完了:「何を送ったか」を後から示せる。

それでも残るもの(正直に)

閉じられない経路は、運用と周知で扱う。どれも「構造で防げない」ことが分かっている。

用語

札(擬似化)
実値を [P12_NAME] のような札に置き換えること。同じ人は同じ札。対応表は手元にだけ置く。
vault
札と実値の対応表。暗号化した SQLite。Claude Code からは読めない。
compute-to-data
データを AI に持っていくのではなく、AI が書いたコードをデータの所で実行して、結果だけ持ち帰る考え方。safe-data はこれ。
deny ルール
Claude Code の設定で、ツールの使用を無言で拒否する仕組み。Auto を含む全モードで効く。
sandbox
Bash を OS レベルで隔離する仕組み。読めるパスと繋げるホストを制限する。中で動くコマンドは確認なしで実行される。
hook
ツール実行の前後に走る自前のプログラム。実行前なら止められ、実行後なら出力を置き換えられる(全ツール)。
Auto モードの分類器
人の代わりに第 2 のモデルが操作を審査する仕組み。判定はモデルの応答に同梱されて返る。
Covered Model
Fable / Mythos 系。入力と出力が 30 日以上保持され、ZDR 不可。Bedrock / Google 経由でも同じ。
ZDR
Zero Data Retention。Anthropic 側で入力と出力を保持しない契約。Opus 5.5 などで可能。