ドキュメント · プライバシーマスキング
プライバシーマスキング
magpie は、エージェントが送る内容をこのコンピュータから出る前にマスクできます。API キー、パスワード、トークン、そして選べばメールアドレス、電話番号、自分で決めた語が、{{API_KEY_es6eu6jk}} のようなプレースホルダーとしてベンダーに送られます。応答の中のプレースホルダーは元の値に戻るので、エージェントとファイルには本物の値が残り、ベンダーには見えません。処理はこのコンピュータの magpie のゲートウェイで行われ、既定ではオフです。
オンにする
- ページを開く設定 → プライバシー を開きます。
- シークレットをマスクマスクするもの の シークレットをマスク を オン にします。API キー、秘密鍵、トークン、パスワードが対象です。
- 必要なら個人情報も個人情報をマスク を オン にすると、メールアドレス、電話番号、ID 番号、銀行カード番号もマスクされます。オンにすると、その下に個人情報の種類ごとのスイッチが並びます。
- 自分の語マスクする語 に、ベンダーに見せたくない名前、コードネーム、ホスト名をカンマ区切りで入れます。マスクする語の大文字・小文字を区別しない をオンにすると、Nightjar で NIGHTJAR もマスクされます。magpie が知らないシークレット(自分のゲートウェイのキーなど)は マスクルール に、先頭の文字列か正規表現で追加します。
- 試す試す にテキストを貼ると、ベンダーが実際に受け取る内容が表示されます。貼った内容は保存されません。
変更は次のリクエストから効き、再起動もエージェント側の変更もいりません。実際にマスクするのは組み込みプラグイン プライバシーマスキング(redact、設定 → プラグイン)で、何かのマスクが求められている間は常にオンです。
専用の CLI コマンドはありません。ウィンドウがないとき(magpie serve、Docker)は magpie web で同じページを開くか、~/.config/magpie/settings.json(Docker では /config/magpie/settings.json)に書きます。ファイルはリクエストごとに読み直されます。
{
"redact": true,
"redactPersonal": true,
"redactWords": ["Nightjar", "db.acme-corp.cn"]
}
マスクされるもの
| スイッチ | 見つけるもの |
|---|---|
| シークレットをマスク | 秘密鍵のブロック(-----BEGIN … PRIVATE KEY-----)。形で見分ける API キー:sk-…(OpenAI、Anthropic、OpenRouter)、ghp_/github_pat_、glpat-、AIza…、xox…-、sk_live_、AKIA/ASIA、hf_、gsk_、xai-、npm_、pypi-、dop_v1_、SG.、それに oc_sk_… のような中継サービスのキー。JWT。user:password@host のパスワード。.env や設定ファイルでシークレットの名前が付いたフィールドの値:DB_PASSWORD=…、api_key: …、client_secret、token、credential。それと自分の マスクルール。 |
| 個人情報をマスク | メールアドレス、中国本土の携帯番号、チェックサムの合う中国の身分証番号と銀行カード番号。既定でオンのもの:米国の社会保障番号、パスポート番号(passport、护照、パスポートの後)、IBAN、誕生日(birthday、DOB、生日の近く)、MAC アドレス、シリアル番号(S/N の後)。エージェントがほぼ毎回送るので、自分でオンにするまでオフのもの:ホームフォルダのユーザー名、ユーザー名とコンピュータ名(user@host)、パブリック IP アドレス、クラウドストレージのバケット。 |
| マスクする語 | 入れた語そのままを {{TERM_…}} に。 |
| ローカルモデルで検出 | 検出方法 の中にあります。このコンピュータで動くモデル(OpenAI の Privacy Filter、1.6 GB のダウンロード)が、ルールでは見つからない自由文中の名前や住所を見つけます。シークレットをマスク か 個人情報をマスク がオンのときに使え、見つけたものは同じスイッチに従います。 |
プレースホルダーは「種類 + 鍵付きハッシュの 8 文字」です。同じ値はいつも同じプレースホルダーになるので、会話は毎ターン同じに読め、ベンダーのプロンプトキャッシュも有効なままです。値はメモリにだけ置かれます。
例
シークレットをマスク と 個人情報をマスク をオンにし、マスクする語 に Nightjar を入れた状態で、エージェントがこう送ったとします。
Deploy Nightjar with OPENAI_API_KEY=sk-proj-8fK2mQx7Lp4Rt9Vw3Yz6Ab1Cd, then mail li.wei@acme-corp.cn or call 13800138000.
Deploy {{TERM_5hmsrhdc}} with OPENAI_API_KEY={{API_KEY_srhjgvja}}, then mail {{EMAIL_eh5um6mb}} or call {{PHONE_uf7iy2qq}}.
モデルが 「.env の OPENAI_API_KEY を {{API_KEY_srhjgvja}} にしました」 と答えると、エージェントにはストリームのテキストでもツール呼び出しの引数でも本物のキーが届き、書き込むファイルにも本物のキーが入ります。モデルが少し書き換えたプレースホルダー(波括弧の中の空白、大文字・小文字の違い)も元に戻ります。
効いているか確かめる
- 事前に:設定 → プライバシー の 試す が、ベンダーが受け取るテキストと各値の種類を表示します。
- リクエストごとに:ゲートウェイ ページの最近の呼び出しと ルーティング のログで、マスクされたリクエストに盾のバッジと件数が付きます。ポインタを合わせると種類が、クリックするとそのリクエストの記録が開きます。
- 期間で:観測 → マスク(プライバシーページの マスクの記録 からも開けます)が、7 日間または 30 日間にマスクした値を種類、エージェント、プロバイダ別に示し、各リクエストがベンダーにどう見えたかをプレースホルダーに印を付けて表示します。
記録は ~/.config/magpie/masking に 30 日間残ります。エージェント、プロバイダ、モデル、各プレースホルダーの種類、長さ、先頭の数文字だけで、値そのものは残りません。
値が見つかったとき
値が見つかったとき で、種類ごとに選べます。
- マスク(既定):プレースホルダーにして送ります。
- 警告:そのまま送り、バッジが琥珀色で数えます。
- ブロック:リクエストを止め、400 を返します:“magpie held this request back: Settings › Privacy blocks API_KEY, and it has one (sk-…, 33 characters). Nothing was sent.” メッセージに値は含まれません。
タスクでそのまま使う必要のある値(チームのアドレス、テスト用のキー)は マスクしない に入れます。値全体が一致すれば、そのまま送られます。
対象外のものと制限
- 思考はベンダーが書いたまま。署名付きの thinking ブロック、Gemini の thoughts、Responses の暗号化された推論はベンダーが署名したものなので、署名が合うよう変えずに送り返します。中で置き換えるのは、リクエストの他の場所ですでにマスクした値だけです。
- ID とツール定義はそのまま:モデル ID、メッセージや呼び出しの ID、UUID、ツール名、MCP サーバー名、ツールのスキーマ(説明文はマスクされます)。ベンダーやツールが検証できるようにするためです。
- 画像とファイルのデータはそのまま送られます。スクリーンショット内の文字はマスクされません。
- 動かなければ送りません。マスクがオンなのに動かないとき(プライバシーマスキング プラグインを手で止めた、ローカルモデルがオンなのに応答しない)、リクエストは何も送らなかったことを示す 503 になります。マスクなしで送ることはありません。
- ローカルモデルは外せます。すべてのアドレスがこのコンピュータかローカルネットワーク上にあるプロバイダ(Ollama、LM Studio)は、リクエストをマスクしない でそのまま送れます。CLI では
magpie provider set ollama unmasked=yes。ログにはマスク後の内容が残ります。 - モデルにはプレースホルダーしか見えません。マスクされた値を読んだり推論したりはできず、受け渡すだけです。モデルが読む必要のある値は マスクしない へ。
- ルールは形で見つけます。他の国の形式の電話番号や自由文中の名前には、ローカルモデルで検出、または自分の マスクする語 と マスクルール が必要です。まず自分のテキストを 試す で確かめてください。
magpie が自分で送るものは プライバシー を参照してください。コードは internal/redact と internal/masking です。