Claude Code に個人情報を見せない:ログや .env を自動でマスクする piip スキルを作った

AI に個人情報を見せない ログ・CSV・.env を自動でマスク

約 4,180 字 · 読むのに 7 分ほど

Claude Code に「このエラーの原因を調べて」と頼むと、AI はログファイルを読みます。そのログに問い合わせの名前や電話番号が入っていれば、それも一緒に AI に送られます。piip は、AI が読む前に個人情報と秘密情報をマスクする Claude Code のスキルです。

AI に調べてもらうと、個人情報も読まれる

Claude Code のようなコーディング AI は、必要だと判断すれば自分でファイルを開きます。原因を調べるためにログを tail し、データの形を見るために CSV を読み、設定を確かめるために .env を開きます。どれも作業としては正しい動きです。

ただ、読んだ内容はすべて AI のモデルに送られます。

  • 問い合わせフォームのログに、お客さまの名前・メールアドレス・電話番号・住所
  • 決済エラーのログに、カード番号
  • .env に、データベースのパスワードや API キー

エラーの原因を調べるのに、お客さまの本名は要りません。要るのは「どの処理で、どんな形の値が来て、何が起きたか」です。それなら、AI に渡す前に個人情報だけを伏せればいい。これを自動でやるのが piip です。

piip とは

piip-skills は、個人情報(PII)と秘密情報を検出してマスクする Rust 製のコマンド piip と、それを使う Claude Code のスキルです。フックも付いていて、プラグインとしてまとめて入ります。MIT ライセンスで公開しています。

  • 処理はすべて手元のパソコンの中。外部のサービスには送らない
  • 日本語に強い:住所、電話番号、マイナンバー、「お名前:」のようなラベル付きの項目、全角の数字や記号
  • Claude Code の「フック」で動くので、入れたあとは何もしなくても働く
  • Linux、macOS、Windows(Git Bash)の実行ファイルを用意

piip は Claude Code の作業のうち、読む・書く・頼むの 3 か所で働きます。

場面piip がすること
読むRead・Grep・Bash の結果を、AI に渡る前にマスクする
書く・送るマスク済みの値での上書きを止める。外部に送るコマンドに個人情報があれば確認する
頼む自分が打ったプロンプトに個人情報があれば、送る前に止める

特徴 1:AI が読む前にマスクする

Claude Code がファイルを読むと、piip が結果を受け取り、個人情報を伏せてから AI に渡します。試しに、問い合わせフォームのログ(例のために作った架空のデータ)を Claude Code に読ませました。

ファイルの中身AI が受け取った内容
name=”山田 太郎”name=”山* 太*”
email=taro.yamada@example.jpemail=t***@example.jp
tel=090-1234-5678tel=***-***-5678
card 4532-1234-5678-9014card ****-****-****-9014
address=”東京都新宿区西新宿2-8-1″address=”東京都***”
ip=203.0.113.24ip=203.***.***.24
msg=”注文した商品が届きません”msg=”注文した商品が届きません”(そのまま)
Claude Code が cat で読んだログ。名前やメール、電話番号が piip でマスクされている
Claude Code がログを cat した結果。AI が受け取るのはマスク済みの内容だけ

ポイントは、形と一部は残すことです。メールのドメイン、電話番号の末尾、都道府県、本文のメッセージは残るので、AI は「同じ人から 2 件来ている」「東京からの注文で決済が失敗している」といった調査を続けられます。消えるのは、人を特定できる部分だけです。

マスクされたログから、Claude Code が問い合わせの傾向と対応が必要なものをまとめたところ
マスクされたログのままで、傾向と優先順位をまとめてくれた
  • ファイルそのものは書き換えない。マスクするのは AI に渡る内容だけ
  • 対象は既定でログ、CSV、JSON、SQL、メール、.env など。ソースコードは対象外
  • cat app.log や tail -f logs/*.log のような Bash コマンドの出力、Grep の検索結果もマスクする
  • マスクに失敗したときは、内容を渡さない(安全な側に倒す)
  • 1 回の処理は数ミリ秒。使っていて待たされることはない

特徴 2:マスクした値で上書きさせない

マスクには一つ落とし穴があります。AI が見ているのは t***@example.jp や [REDACTED] なので、AI がファイルを書き直すと、その伏せ字で本物の値を上書きしてしまうかもしれません。.env のパスワードが [REDACTED] になれば、アプリは動かなくなります。

piip は、そのセッションで AI に見せた伏せ字を覚えておき、Edit・Write・Bash がそれを新しく書き込もうとしたら止めます。覚えておくのはマスク後の形だけで、元の値はどこにも保存しません。マスクしていない部分の編集は、これまでどおりできます。

特徴 3:外に送る前に確認する

AI は curl で API を呼んだり、gh で GitHub に Issue を書いたり、MCP で外部のサービスを操作したりもします。piip は、こうした外部に送るコマンドや MCP ツール、WebFetch の入力に個人情報が入っていたら、実行する前に確認を求めます。たとえば、ログの一部をそのまま Issue に貼ろうとしたときに気づけます。

確認の画面には、マスクした値だけを表示します。設定で「確認」ではなく「拒否」にもできます。

特徴 4:自分が貼ったものも止める

案外多いのが、人間のほうがプロンプトに貼ってしまうことです。「このお客さまからの問い合わせに返信を書いて」と、メールを丸ごと貼ってしまう。piip は、プロンプトに個人情報があると送信を止め、マスクした版を手元にだけ表示します。

個人情報を含むプロンプトの送信を piip が止め、マスクした版を表示したところ
送信は止まり、マスクした版が表示される。この画面の内容は AI には送られていない
  • 表示されたマスク済みの文をコピーして送り直せば、そのまま作業を続けられる
  • わかったうえで送りたいときは、プロンプトに #piip-ok を付ける
  • 止めずに警告だけにすることもできる

どれくらい見つけるか

日英の問い合わせ、アクセスログ、アプリのログ、CSV、メール、チャット、.env などを模した評価用のデータ(740 文書、正解 3,398 件)で測りました。

種類標準(builtin)Presidio 併用(hybrid)
メール、電話、住所、カード、秘密情報、マイナンバーなど100%100%
ラベル付きの名前(お名前:…)100%100%
文中の名前(担当の佐藤より…)0%74.9%
全体の再現率83.8%97.3%
全体の適合率99.2%98.3%

標準のエンジンは規則(正規表現と検査)で探すので、形の決まった情報は確実に見つけ、誤検出もほとんどありません。一方、文章の中に紛れた名前は苦手です。そこまで必要な場合は、Microsoft の Presidio を手元で動かして併用できます(こちらも外部には送りません)。

なお、評価用のデータは自分で作ったもので、規則の改善にも使いました。実際のデータでは数字はもっと下がると考えてください。

使い方

Claude Code で、次の 2 行を実行します。

/plugin marketplace add benridane/piip-skills
/plugin install piip@piip

Claude Code を再起動すれば、フックが働き始めます。実行ファイルは初回に GitHub Releases から取得し、チェックサムを確かめてから使います。

自動で働くフックのほかに、「このログの個人情報をマスクして」「リポジトリに秘密情報が残っていないか調べて」と頼めば、Claude がスキルとして piip コマンドを使ってくれます。コマンドを直接使うこともできます。

$ piip mask inquiry.log        # マスクした内容を表示
$ piip scan . --fail           # ディレクトリを調べ、見つかったら失敗で終わる(CI 向け)

対象にするファイルや、確認・拒否の動きは .piip.toml で変えられます。詳しくは README をご覧ください。

気をつけること

  • 自動の検出なので、見逃しもマスクしすぎもあります。大事なデータでは、マスクの結果を一度確かめてください
  • ソースコードは既定で対象外です。コードの中に書かれた秘密情報は、piip scan で別に調べてください
  • AI がフックを通らない方法で読んだ内容(ほかのツールや、画像として読んだものなど)はマスクできません
  • 外部への送信の確認は、コマンドに書かれた内容だけを見ます。curl --data @memo.md のようにファイルを指定して送る場合、ファイルの中身は調べません。実際に試したときも、AI がこの形で送ろうとしたため確認は出ませんでした
  • Windows での動作は、まだ確かめていません

まとめ

  • コーディング AI は、作業のためにログや CSV や .env を読む。読んだ個人情報はモデルに送られる
  • piip は、AI が読む前に個人情報をマスクする。形と一部は残るので、調査はそのまま続けられる
  • マスクした値での上書き、外部への送信、プロンプトへの貼り付けも止める
  • 処理はすべて手元。Claude Code で 2 行実行すれば入る