ドキュメント · プライバシーマスキング

プライバシーマスキング

magpie は、エージェントが送る内容をこのコンピュータから出る前にマスクできます。API キー、パスワード、トークン、そして選べばメールアドレス、電話番号、自分で決めた語が、{{API_KEY_es6eu6jk}} のようなプレースホルダーとしてベンダーに送られます。応答の中のプレースホルダーは元の値に戻るので、エージェントとファイルには本物の値が残り、ベンダーには見えません。処理はこのコンピュータの magpie のゲートウェイで行われ、既定ではオフです。

magpie を通る内容だけが対象です。magpie に接続したエージェントはゲートウェイ経由でリクエストを送り、どのプロバイダやアカウントが答えてもマスクされます。magpie を通さずベンダーに直接送るエージェントは対象外です。

オンにする

  1. ページを開く設定 → プライバシー を開きます。
  2. シークレットをマスクマスクするもの の シークレットをマスク を オン にします。API キー、秘密鍵、トークン、パスワードが対象です。
  3. 必要なら個人情報も個人情報をマスク を オン にすると、メールアドレス、電話番号、ID 番号、銀行カード番号もマスクされます。オンにすると、その下に個人情報の種類ごとのスイッチが並びます。
  4. 自分の語マスクする語 に、ベンダーに見せたくない名前、コードネーム、ホスト名をカンマ区切りで入れます。マスクする語の大文字・小文字を区別しない をオンにすると、Nightjar で NIGHTJAR もマスクされます。magpie が知らないシークレット(自分のゲートウェイのキーなど)は マスクルール に、先頭の文字列か正規表現で追加します。
  5. 試す試す にテキストを貼ると、ベンダーが実際に受け取る内容が表示されます。貼った内容は保存されません。

変更は次のリクエストから効き、再起動もエージェント側の変更もいりません。実際にマスクするのは組み込みプラグイン プライバシーマスキング(redact、設定 → プラグイン)で、何かのマスクが求められている間は常にオンです。

専用の CLI コマンドはありません。ウィンドウがないとき(magpie serve、Docker)は magpie web で同じページを開くか、~/.config/magpie/settings.json(Docker では /config/magpie/settings.json)に書きます。ファイルはリクエストごとに読み直されます。

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}} にしました」 と答えると、エージェントにはストリームのテキストでもツール呼び出しの引数でも本物のキーが届き、書き込むファイルにも本物のキーが入ります。モデルが少し書き換えたプレースホルダー(波括弧の中の空白、大文字・小文字の違い)も元に戻ります。

効いているか確かめる

記録は ~/.config/magpie/masking に 30 日間残ります。エージェント、プロバイダ、モデル、各プレースホルダーの種類、長さ、先頭の数文字だけで、値そのものは残りません。

値が見つかったとき

値が見つかったとき で、種類ごとに選べます。

タスクでそのまま使う必要のある値(チームのアドレス、テスト用のキー)は マスクしない に入れます。値全体が一致すれば、そのまま送られます。

対象外のものと制限

magpie が自分で送るものは プライバシー を参照してください。コードは internal/redact と internal/masking です。