開いた書類の隣で、保管された本をガラスの仕切りが隔てている。

プロダクトノート

個人情報の置き場所

この設計は、規制対応から生まれたものではありません。「ログインできない」の調査をしていて、見なくていいものを見てしまうという、運用の現場で毎回起きていた居心地の悪さが出発点です。

調査に入ると、否応なく見えてしまう

IDの基盤を提供していると、「特定のユーザーがログインできない」という連絡が来ます。 原因を調べるには、お客様の環境に入り、該当するアカウントを探すことになります。

知りたいのは、アカウントがロックされているか、最後の認証がいつ、どこで失敗したか。 どの経路でログインしようとしたか。パスキーの登録はまだ使えるか。

どれも、その人が誰であるかとは無関係です。 それなのに、アカウントを開いた瞬間に氏名が出ます。メールアドレスが出ます。 電話番号も、連携先のアカウント名も、同じ画面に並んでいます。 調査に必要なのは状態だけなのに、人格が一緒についてきます。

「見ないでください」という運用ルールは、
画面に表示されている限り機能しません。

担当者に落ち度があるわけではありません。お客様に頼まれ、正規の手続きで入り、必要な調査をしている。 それでも個人情報が見えてしまう。そういう構造だからです。

規則や研修だけに頼ると、担当者の記憶力と良心に任せることになります。 それだけでは、いつか事故として表面化します。 Authrimが個人情報を別のデータベースに置くのは、まずこの問題を設計で解けないかと考えたからです。

普通は、全部ひとつのDBに入る

IDの仕組みを作ると、扱うデータは自然に混ざります。 氏名やメールアドレス、アプリを使う権限、ログイン中の端末、パスキーの登録情報、外部IDとの連携先。

どれも「ユーザーに関するデータ」です。素直に作れば、ひとつのデータベースに入ります。 それでも動きます。困るのは、あとで説明を求められたときです。

「個人情報の所在を図示してください」「漏洩した場合の影響範囲は」「削除依頼への対応手順は」。 全部が同じ場所にあると、答えは毎回「ユーザーテーブル一式」です。 どこまで影響するのか、範囲を絞って説明できません。

Authrim は最初から二つに分けている

Authrimは、個人を特定できる情報だけを物理的に別のデータベースに置きます。 あとから分けたのではありません。リポジトリ層から別の系統にしています。

Core DB 個人を特定しない、仕組みの側のデータ クライアント(アプリ)の設定 セッション ロールと権限 パスキー資格情報・TOTP 端末の登録情報 ── アクセス境界 PII DB 個人を特定できるデータだけ 氏名・メールアドレスなど 外部IdPとの連携情報 削除の記録(Tombstone) PIIを誰が読んだかの監査ログ ──
右下には、削除の記録とPIIを読んだ記録があります。どちらもPII側に専用で置いています。 個人情報を扱った事実も、通常の監査ログとは分けて管理します。

保存先を分けると、冒頭の調査では左側の情報だけを見れば済みます。 ロック状態も、認証の失敗記録も、端末の情報もそこにあります。 右側に触れない権限で調査できるので、担当者が「見ないように気をつける」必要はありません。

同じ構造なら、審査や監査の質問にも答えやすくなります。 氏名やメールアドレスの置き場所をすぐに示せて、削除の手順も範囲を区切って説明できます。 先に運用上の問題を解こうとした結果、たまたま説明もしやすくなりました。

PII DB だけが個人データ、という意味ではありません

ここを取り違えると危険です。 この分離は「個人データ/非個人データ」の法的な線引きではありません。

Core DBにも、IPアドレス、端末情報、セッション履歴、認証イベント、資格情報のメタデータ、 内部で使う安定したユーザーIDなどが入ります。これらも、状況によっては個人データに該当します。 単独では個人を特定しなくても、他の情報と組み合わせれば特定に至ることがあるためです。

Authrimが分けているのは、個人を直接識別できるデータと、運用上のアイデンティティデータです。 前者を開かず、後者だけで障害調査ができるようにしています。 だからといって、後者を保護しなくてよいわけではありません。

「個人データはPII DBにしかない」という説明は正しくありません。 氏名やメールアドレスなど、直接識別できるデータをPII DBに隔離する。 障害調査の権限は、そこに触れずに渡せる。そういう設計です。

削除依頼で本当に難しいのは、消すことではない

「アカウントを削除してください」と依頼されたとき、消すこと自体は簡単です。 そのあとに、難しい要求が二つ残ります。

ひとつは消したことの証明。いつ、誰が、なぜ消したのかを後から示せる必要があります。 もうひとつは消した人が再登録してこないこと。 退会直後の再登録を一定期間止めたい、という業務要件はよくあります。

どちらも、消したはずの人をあとから識別するよう求めています。 けれど識別できる情報を残していたら、そもそも消したことになりません。

削除依頼 [email protected] 鍵つきで 指紋化 残る記録 指紋のみ(元に戻せない) いつ・誰が・なぜ消したか 保持期限 「削除済みか?」 判定できる 「元の値は何か?」 復元できない ── 狙い通り 保持期限を過ぎると、この記録自体が自動的に消える 個人情報を残さずに、削除した事実だけを残す
HMAC-SHA256 によるブラインドインデックスです。秘密鍵を用いて指紋化するため、照合はできても復元はできません。 「このメールアドレスは削除済みですか」には答えられるのに、記録を全部見ても誰のものだったかは分かりません。

実装のコメントにも、この設計判断が書かれています。 個人情報は保存しない。重複防止のための指紋だけを持つ。保持期限を過ぎたら自動的に消える。 誰が・いつ・なぜ削除したかは記録する。

「復元できない」が成り立つ条件

ただし、メールアドレスはエントロピーが低い情報です。 単純なハッシュで指紋にしただけでは、辞書攻撃で元の値を突き止められます。 「復元できない」と無条件には言えません。

Authrimでは、秘密鍵を使うHMAC-SHA256のブラインドインデックスを採用しています。 鍵世代の番号を持たせ、鍵の更新にも対応しています。 鍵を知らなければ、指紋の総当たりはできません。

だからこそ、鍵を指紋から隔離することが、この保証の前提です。 同じ場所に置けば、保証は失われます。

調査に必要なものだけを、見られるようにする

最初の「ログインできない」という問い合わせに戻ります。担当者が知りたいのは、認証がどこで止まったかです。氏名や電話番号まで開く必要はありません。

Authrimでは、直接識別できる情報の保存先を分けています。担当者には、その保存先を開かずに調査できる権限を渡せます。個人情報が必要な調査は、別途その権限を持つ担当者が扱います。

暗号化とアクセス制御で守り、監査ログで扱った事実を確かめます。そのうえで、普段の調査は必要のない個人情報を開かずに終えられる。それを日々の運用の出発点にしたくて、保存先を分けています。

実装 完了(保存とアクセス境界の分離が動作)

検証 自動テストで継続的に確認

運用成熟度 本番向けの追い込み中。Authrim 全体が pre-1.0 です。

この設計は削除依頼への対応をしやすくしますが、それだけで法令順守になるわけではありません。 実際に適合するかは、運用手順や契約も含めて組織が判断します。