本文へ移動
ハック!でAI

機密情報とAI 第3回

それでも機密を AI で扱いたいときの方法 手間の小さい順に 6 つ

佐々木 航@w_sasakiwith Claude Code読了 約20分
Claude Code のターミナルの画面。送る前に止めるフックが働き、「機密の形が見つかったので、送るのを止めました」と表示されている

この記事でわかること

  • 機密を扱う 6 つの方法と、費用の目安
  • 止めるフックの抜け道と、編集部で確かめた塞ぎ方
  • 国内のリージョンと手元の AI を使うときの条件

確認した環境: Claude Code 2.1.296(ターミナルと VS Code の拡張・API キーで利用)で 2026年10月12日に検証 / 料金と対応モデルは同じ日に公式のページで確認

個人情報や社外秘が混じる仕事でも、AI を使える形はあります。この記事では、その方法を費用と手間の小さい順に 6 つ並べ、どの情報にどこまでやればよいかの目安を示します。4 つめの「送る前に止める仕組み」は、編集部で作り、実際の通信を記録して確かめました。

連載「機密情報とAI」の第 3 回です。貼った情報がどこへ行くかは第 1 回、法律や契約の上で入れてよいかは第 2 回で説明しています。

1 情報を区分する(0 円)、2 学習に使わせない設定・法人向けの契約(Team は 1 席 月 20 ドルから)、3 形だけ見せる(0 円から)、4 送る前に止める仕組み(0 円・設定と試験の手間)、5 国内のリージョンで動かす(従量・全世界向けより約 1 割高い)、6 手元で動かす(GPU の費用)を、上から順に並べた表
機密を AI で扱う 6 つの方法。上ほど費用と手間が小さい(料金は 2026年10月12日に確認)撮影・作図: 編集部

6 つは、どれか 1 つを選ぶものではありません。1 から順に重ねます。考え方は 4 つです。見せる量を減らす、届く先を選ぶ、残る場所を減らす、使える人を絞る、です。

1. 情報を区分する

最初に、扱う情報を種類に分け、どこまでの方法を使うかを決めます。費用はかかりません。

認証情報はどの方法でも入れない。特に注意する個人情報は入れないか 6。個人情報は 2 と 3 と 4。機密は 2 と 3、国内で処理したいなら 5。社内の情報は 2。公開されている情報は特別な方法が要らない(著作権などは別に確かめる)、という表
情報の種類ごとの目安。数字は 6 つの方法の番号撮影・作図: 編集部

会社の場面ごとの組み合わせの目安は、次のとおりです。

場面 組み合わせ
社内の手順書を AI で直す 方法 2
顧客の名簿を使うアプリを作る 方法 2 に加えて、3 と 4。会話の記録を残す日数も短くする
取引先の設計書をもとに直す 上に加えて、契約の確認と、方法 5
健康の情報やマイナンバーを扱う 方法 6 か、AI に見せない作り(方法 3)

これは編集部の目安です。法律と契約の考え方は第 2 回にまとめています。最終の判断は、弁護士などの専門家に確かめてください。

2. 学習に使わせない設定と、法人向けの契約

個人向けのプラン(Free・Pro・Max)では、入力した内容を学習に使うかを本人が選びます。設定の場所はAI コーディングの道具を安全に使うで説明しています。会社からは、社員一人ひとりの設定を確かめられません。会社で使うなら、既定で学習に使われない法人向けのプランか API に集めます。

Claude の法人向けのプランの料金は、次のとおりです(2026年10月12日に確認・米ドル・税別)。

  • Team: 2〜150 人向けです。スタンダード席は 1 席 月 20 ドル(年払い)か 25 ドル(月払い)、プレミアム席は 100 ドルか 125 ドルです。
  • Enterprise: 1 席 月 20 ドル(年払いのみ)に、使った分の API の料金が加わります。監査ログ・保存期間の設定・Compliance API・Inference hooks(送る中身を自社の検査にかける機能)は、Enterprise だけにあります。

入力と出力を保存しない契約(ZDR)は、Enterprise の標準には含まれません。Anthropic の確認を通った組織だけが、個別に有効にしてもらえます。

あわせて、フィードバックを送らない設定にします。Claude Code の /feedback で送った会話は、5 年保存されます。設定の env に DISABLE_FEEDBACK_COMMAND を書くと、このコマンドが使えなくなります(書き方は 4 章の設定の例)。

この方法で変わるのは、学習と保存の扱いです。AI の会社に届くことは変わりません。

3. 形だけ見せる

AI に本物のデータを渡さない進め方です。AI に見せるのは、表の列の名前と型、件数、作り物の数行だけにします。AI にはダミーで動くプログラムを書いてもらい、本物のデータでの実行は、人か自動の仕組みが手元で行います。

AI に見せるのは列の名前・件数・作り物の数行。AI が書くのは、プランごとの人数を数えるなどのプログラム。本物のデータでの実行は手元で行い、AI に返すのは集計だけ、という流れの図
形だけ見せる進め方。本物のデータは AI に渡らない撮影・作図: 編集部

中身を見せる必要があるときは、名前や連絡先を仮の名前に置きかえてから渡します(伏せ字)。置きかえの表は手元に残し、返ってきた答えを手元で元に戻します。伏せ字にする道具には、次のようなものがあります(各社の発表による)。

  • ソースネクスト「いきなりAI 情報マスキング」: オフラインで動きます。4,950 円(税込・ダウンロード版)
  • NTTテクノクロス「tasokarenaマスキングツール ローカルLLM版」: 1 ライセンス(端末 1 台)あたり、初期費用 5 万円・月額 7 万円(税別・2025年5月の発表時)
  • 白金数理「pii-ja-ner-onnx」: 18 種類の個人情報を見つけるモデルです。Apache License 2.0 で公開されています

名前を消しても、住所・生年月日・勤め先の組み合わせで、人を特定できることがあります。一度 AI に送った情報は、取り消せません。

4. 送る前に止める仕組み(編集部の検証)

Claude Code には、決まった場面で自分のプログラムを動かす「フック」という仕組みがあります。編集部では、次の 2 つを作りました。

  • 送る前に止めるフック(UserPromptSubmit): 入力した文に、API キー・秘密鍵・パスワード・マイナンバー・カード番号の形が 1 つでもあれば止めます。メールアドレスと電話番号は、合わせて 3 件以上で止めます(名簿らしいため)。
  • 伏せ字にするフック(PostToolUse): AI が実行したコマンドの結果にあるメールアドレスや電話番号を、[メール1] のような伏せ字に置きかえてから AI に渡します。
入力した文はフック 1 で検査され、機密の形があれば止まる。コマンドの結果はフック 2 で伏せ字になってから AI の会社に届く。VS Code の拡張のチャット画面では、会話の題を付ける通信に、フック 1 が止めた文も入っていた、という図
2 つのフックが働く場所と、検証で見つかった抜け道撮影・作図: 編集部

検証は 2026年10月12日に、編集部の検証環境で行いました。Claude Code は 2.1.296(VS Code の拡張も同じ版)を、従量課金の API キーで使いました。入力に使ったのは、目印の文字を入れた作り物の API キーと、架空の顧客 3 人の一覧だけです。Claude Code の通信先を手元に立てた中継に向け、AI の会社へ送られる中身に目印の文字が入っているかを記録しました。

下の結果は、この環境とこの条件で試したものです。版や使い方が違うと、動きが変わることがあります。

ターミナルでは止まった

作り物のキーを含む文を送ると、フックが止めました。中継の記録に残ったのは接続の確認だけで、文は送られていませんでした。VS Code の中のターミナルで動かしたときも同じです。

UserPromptSubmit operation blocked by hook: 機密の形が見つかったので、送るのを止めました。AI の API キー 1件、と表示され、入力欄に元の文が戻っている
ターミナルの画面。① フックが止めたという表示 ② 止めた文は入力欄に戻る(キーの部分は画像で伏せた)撮影・作図: 編集部

VS Code の拡張では、止めた文が届いていた

同じ文を、VS Code の拡張のチャット画面で送りました。画面には「止めました」と出ます。ところが、会話に「OpenAI APIキー接続テスト」という題が付きました。AI が入力の文から作った題です。中継の記録には、題を付けるための通信が残っていて、止めたはずの文がキーごと入っていました。

会話の題が OpenAI APIキー接続テスト になっている。その下に、UserPromptSubmit operation blocked by hook: 機密の形が見つかったので、送るのを止めました(AI の会社には送っていません)という表示がある
VS Code の拡張のチャット画面。① 止めた文から作られた題 ② フックの表示は「AI の会社には送っていません」だが、実際は届いていた(キーは作り物)撮影・作図: 編集部

公式のドキュメントの環境変数の一覧には、CLAUDE_CODE_DISABLE_TERMINAL_TITLE を 1 にすると、ターミナルの題の更新を止め、題を作る通信も行わないと書かれています。編集部の環境では、プロジェクトの設定、ユーザーの設定、VS Code を起動する環境の 3 通りで入れても、このチャット画面では 3 通りとも題を作る通信が出て、止めた文が届きました。この変数が拡張のチャット画面にも効くかどうかは、公式の VS Code のページには書かれていませんでした(2026年10月12日に確認)。効かなかった理由は、確かめられていません。

届かなくなったのは、会話に先に名前を付けたときです。会話の始まりで動くフック(SessionStart)から sessionTitle を返すと、題を作る通信は出ませんでした(3 回試して 3 回とも)。

会話の題が 作業 10/12 16:53 になっている。その下に、UserPromptSubmit operation blocked by hook: 機密の形が見つかったので、送るのを止めました、という表示がある
名前を付けるフックを足したあとの画面。① フックが付けた名前 ② 止めた文は、AI の会社に送られなかった撮影・作図: 編集部
ターミナルで対話、ターミナルで 1 回だけ実行、VS Code の中のターミナルでは届かなかった。VS Code の拡張のチャット画面では届いた。題の生成を止める環境変数を 3 通りで入れても届いた。会話に先に名前を付けるフックを足すと届かなかった(3 回)、という表
検証の結果のまとめ(編集部の検証環境・Claude Code 2.1.296・API キーで利用・2026年10月12日)撮影・作図: 編集部

伏せ字のフックの結果

架空の顧客 3 人の一覧を、コマンド(cat)で AI に読ませました。

cat customers.csv を実行して、プランごとの人数と、メールアドレスのドメインごとの人数を教えて、という依頼に、AI が、メール列は [メール1]、[メール2]、[メール3] と伏せ字になっておりドメイン部分が読めません、と答えている
伏せ字のフックを入れたターミナル。① コマンドで一覧を読ませる依頼 ② AI には伏せ字しか見えていない撮影・作図: 編集部
AI の会社に届かなかったのはメールアドレスと電話番号。3 回の通信に本物の値は 0 件。届いたのは名前とプランの列。限界は、ファイルを読む道具には効かないこと、名前は形で見分けられないこと、利用状況の記録には元の結果が残ること
伏せ字のフックで、届いたものと届かなかったもの撮影・作図: 編集部

メールアドレスと電話番号は、AI の会社への通信にも、手元の会話の記録にも残りませんでした。名前は届きました。また、同じファイルを「ファイルを読む道具」で開かせると、伏せ字にならずに全部届きました。読ませたくないファイルは、設定の permissions.deny に Read(./customers.csv) のように書いて止めます。入れると、道具でも cat でも読めなくなりました。

公式のドキュメントによると、この設定は、ファイルの名前を書かないコマンドや、プログラムが自分で開くファイルには効きません。OS の仕組みで止めるサンドボックスは既定でオフで、オンにしても、読み取りは既定で PC のほとんどに及びます。読ませない場所は自分で書きます。

時間切れになると、止めずに通る

送る前のフックには制限時間があります(既定は 30 秒)。わざと 5 秒かかるフックを制限 2 秒で動かすと、文は止まらずに AI の会社へ送られました。フックに "onFailure": "block" を付けると、時間切れのときも、フックのファイルが見つからないときも止まりました。この指定は Claude Code 2.1.295 以降で使えます。

設定の例

プロジェクトのフォルダの .claude/settings.json に書きます。編集部では、この内容で「止まること」「伏せ字になること」を確かめました。

JSON
{
  "env": {
    "CLAUDE_CODE_DISABLE_TERMINAL_TITLE": "1",
    "DISABLE_FEEDBACK_COMMAND": "1"
  },
  "permissions": {
    "deny": ["Read(./.env)", "Read(./.env.*)", "Read(./secrets/**)"]
  },
  "hooks": {
    "SessionStart": [
      { "hooks": [{ "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/name-session.mjs" }] }
    ],
    "UserPromptSubmit": [
      { "hooks": [{ "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/prompt-guard.mjs", "timeout": 10, "onFailure": "block" }] }
    ],
    "PostToolUse": [
      { "matcher": "Bash", "hooks": [{ "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/output-mask.mjs" }] }
    ]
  }
}
  • CLAUDE_CODE_DISABLE_TERMINAL_TITLE は、編集部の検証では、拡張のチャット画面には効きませんでした。Claude Code をほかのアプリから呼び出す形を模した試験では、この変数で題の通信が止まったので、入れてあります。
  • 止めた文は、手元の会話の記録に残ることがあります。公式のドキュメントも、止めるフックは秘密をディスクに残さない方法ではない、と書いています。記録を残す日数は、同じファイルに "cleanupPeriodDays": 7 のように書くと短くできます(既定は 30 日。それより古い記録は消えます)。
  • 会社で全員に同じ設定を配るときは、組織の設定ファイル(managed-settings.json)に書きます。利用者は変えられません。
フックの中身(短くした例)

3 つのファイルを、プロジェクトの .claude/hooks/ に置きます。動かすには Node.js が要ります。編集部の検証で使ったものは、これにマイナンバーとカード番号の検査を足しています。

prompt-guard.mjs(送る前に止める)

JavaScript
#!/usr/bin/env node
const RULES = [
  ['秘密鍵', /-----BEGIN [A-Z ]*PRIVATE KEY-----/],
  ['API キー', /\b(?:sk-(?:ant-|proj-)?[A-Za-z0-9_-]{20,}|AKIA[0-9A-Z]{16}|gh[pousr]_[A-Za-z0-9]{30,})/],
  ['パスワードの書き込み', /(?:password|passwd|パスワード)\s*[:=:]\s*\S{6,}/i],
];
const PII = [/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g, /(?<![\d-])0\d{1,4}-\d{1,4}-\d{3,4}(?![\d-])/g];

let raw = '';
for await (const c of process.stdin) raw += c;
const prompt = String(JSON.parse(raw).prompt || '');
const hits = RULES.filter(([, re]) => re.test(prompt)).map(([name]) => name);
const pii = PII.reduce((n, re) => n + (prompt.match(re) || []).length, 0);
if (pii >= 3) hits.push('メールアドレス・電話番号が 3 件以上');
if (!hits.length) process.exit(0);
process.stdout.write(JSON.stringify({
  decision: 'block',
  reason: `機密の形が見つかったので、送るのを止めました。\n・${hits.join('\n・')}`,
  hookSpecificOutput: { hookEventName: 'UserPromptSubmit', suppressOriginalPrompt: true },
}));

output-mask.mjs(コマンドの結果を伏せ字にする)

JavaScript
#!/usr/bin/env node
let raw = '';
for await (const c of process.stdin) raw += c;
const input = JSON.parse(raw);
const r = input.tool_response;
if (input.tool_name !== 'Bash' || typeof r?.stdout !== 'string') process.exit(0);

const seen = new Map();
const tag = (label) => (value) => {
  const key = label + value;
  if (!seen.has(key)) seen.set(key, `[${label}${[...seen.keys()].filter((k) => k.startsWith(label)).length + 1}]`);
  return seen.get(key);
};
const stdout = r.stdout
  .replace(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g, tag('メール'))
  .replace(/(?<![\d-])0\d{1,4}-\d{1,4}-\d{3,4}(?![\d-])/g, tag('電話'));
if (stdout === r.stdout) process.exit(0);
process.stdout.write(JSON.stringify({
  hookSpecificOutput: { hookEventName: 'PostToolUse', updatedToolOutput: { ...r, stdout } },
}));

name-session.mjs(会話に先に名前を付ける)

JavaScript
#!/usr/bin/env node
let raw = '';
for await (const c of process.stdin) raw += c;
let input = {};
try { input = JSON.parse(raw); } catch {}
if (input.session_title) process.exit(0);
const d = new Date();
const title = `作業 ${d.getMonth() + 1}/${d.getDate()} ${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;
process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: 'SessionStart', sessionTitle: title } }));

5. 国内のリージョンで動かす

Anthropic と直接契約して使う場合、処理の場所は「全世界」(既定)か「米国のみ」で、日本だけは選べません。Amazon Bedrock(AWS が各社の AI のモデルを提供するサービス)には、日本向けの経路があります。モデルの ID の頭に jp. が付く経路で、東京と大阪のリージョン(データセンターの地域)の中で処理されます。

Anthropic と直接契約は、処理の場所が全世界か米国のみで、米国のみは 1.1 倍。Amazon Bedrock の日本向けは、東京と大阪の中で処理し、Opus 5.5・Opus 4.8・Opus 4.7・Sonnet 4.6・Sonnet 4.5・Haiku 5.5・Haiku 4.5 が使え、全世界向けより約 1 割高い。手元で動かす場合は自分の機械の中で、Claude は使えず、GPU の費用がかかる、という表
AI が動く場所を選ぶ 3 つの経路(2026年10月12日に確認)撮影・作図: 編集部
  • データの扱い: AWS は、Bedrock は既定で入力と出力を保存せず、モデルの提供元は利用者のプロンプトと答えを見られない、と説明しています。Claude Fable 5 と Fable 5.1 は例外で、最長 30 日保存されます(どちらも日本向けの経路にはありません)。
  • 料金: 月額ではなく、使った分だけ払います。Anthropic の料金の説明では、地域を限った経路は全世界向けより 10% 高くなります。Opus 5.5 の Anthropic の単価は、100 万トークンあたり入力 4 ドル・出力 20 ドルです(米ドル)。Bedrock での単価は、AWS の料金ページで確かめてください。
  • Claude Code の既定は日本向けではない: 東京のリージョンを指定しても、Claude Code が既定で優先する経路は apac.(アジア太平洋)です。ANTHROPIC_BEDROCK_REGION_PREFIX に jp を入れると日本向けを優先しますが、公式の説明では、これは保証ではありません。確実にするには、モデルの ID を jp. 付きで指定します。
ターミナル
export CLAUDE_CODE_USE_BEDROCK=1
export AWS_REGION=ap-northeast-1
export ANTHROPIC_DEFAULT_OPUS_MODEL='jp.anthropic.claude-opus-5-5'
export ANTHROPIC_DEFAULT_SONNET_MODEL='jp.anthropic.claude-sonnet-4-6'

これは公式のドキュメントに沿った書き方です。編集部では、AWS での実行までは確かめていません。AWS の権限の設定で、使える経路を jp. のものだけに絞ることもできます。

6. 手元で動かす(ローカル LLM)

AI のモデルを、自分の PC やサーバーで動かす方法です。手元だけで動かせば、モデルに入力した内容は外の会社に送られません。ただし、下の「外で動くモデル」と「Claude Code 自身の通信」には気をつけます。

  • 道具: Ollama(v0.14.0 以降)・vLLM・llama.cpp は、Claude Code が使う形式の API に対応しています。Ollama では ollama launch claude で Claude Code を起動できます。
  • サポート: Anthropic は、Claude 以外のモデルに Claude Code をつなぐ使い方をサポートしていません。動くのは Claude ではなく、公開されている別のモデルです。
  • 外で動くモデル: Ollama で名前に :cloud が付くモデルは、手元ではなく Ollama のクラウドで動きます。
  • Claude Code 自身の通信: Claude Code は、自動更新の確認や利用状況の記録などの通信もします。CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC を 1 にすると、これらが止まります。自動更新も止まるので、更新は手で行います。
  • 費用: 大きなモデルには GPU が要ります。たとえば gpt-oss-120b は、開発元の説明では 80GB の GPU 1 枚に収まります。その大きさの GPU(NVIDIA H100)1 枚を国内のクラウドで借りると、さくらのクラウドの「高火力 VRT」で月額 385,000 円(税込)です。

特に注意する情報を扱う作業だけを手元の AI にし、ふだんは Claude を使う、という使い分けもできます。

貼ってしまったとき

  1. パスワードと API キーは、すぐに作り直し、古いものを使えなくします。
  2. 手元の会話の記録を消します(claude purge)。
  3. 個人情報は、何を・何件・どのプランに入れたかを控え、社内の窓口に知らせます。報告が要るかは、専門家に確かめます。
  4. /feedback で会話を送っていないかを確かめます。

使う前のチェックリスト

1 決める: 入れてよい情報と入れない情報を書き出す、パスワードと API キーは入れない、法人向けのプランか学習オフで使う。2 見せ方: 列の名前とダミーだけにできないか考える、見せるときは伏せ字、本物での実行は手元。3 仕組み: 読ませないファイルを設定に書く、止めるフックに失敗したら止めるを付ける、VS Code の拡張で使うなら名前を付けるフックも入れる。4 確かめる: 作り物のデータで試す、使う画面ごとに試す、更新したらもう一度試す
機密を AI で扱う前のチェックリスト撮影・作図: 編集部

参考にした公式の情報

XFacebookはてブLINE

執筆者

佐々木 航@w_sasaki

with Claude Code

プロフィール

株式会社Game 代表取締役。工学部出身で、21歳で起業してからシステム会社の経営一筋で8期目。アプリの受託開発から始め、いまはAIを使ったシステムソリューションを手がけています。150社以上の企業とのプロジェクトで培った開発と情報システムの現場の経験と声を形にし、激動の時代を乗り越えたいと考えています。

この記事は、Claude Code を使って執筆しました。画面の画像は、検証環境で実際に操作して撮影したものです(引用の画像は出典を記載しています)。内容の誤りはお問い合わせからお知らせください。

連載

機密情報とAI
全 3 回の目次
  1. 1AI に貼った機密は、どこへ行き、どこに残る? 経路と保存期間をたどる
  2. 2個人情報や機密を AI に貼るのは、本当にダメ? 法律・契約・技術に分けて考える
  3. 3それでも機密を AI で扱いたいときの方法 手間の小さい順に 6 つ(この記事)

あわせて読みたい