あなたのデータの置き場所
インスタンスが一人について何を持っているか、アカウントを削除すると実際に何が消えるか
アカウントを削除しても、そのアカウントが触れたものすべてが消えるわけではありません。何をどこに持っていて、それぞれがいつ消えるかをまとめます。
削除は消去ではない
アカウントは消されるのではなく、中身を塗りつぶされます。記録は内部 ID と一緒に残ります。共有がまだそれを指していて、「誰もアップロードしていない」と「アップロードした人はもういない」は別の事実だからです。
アカウントそのもの
記録は消えず、その場で書き換えられます。
| 削除後 | |
|---|---|
| ユーザー名 | 誰も登録できない仮の値に置き換え |
| メールアドレス | 同じように置き換え |
| アドレスを確認済みだったか | 忘れる |
| アカウント自体 | 削除済みの印と、日時と実行者を記録。誰もサインインできない |
| 内部 ID | 残す。共有がまだ指しているため |
| パスワード | 削除 |
| 連携した外部サイトのアカウント | 削除 |
| 外観の設定 | 削除 |
以前のバージョンで削除したアカウント
この修正の前は、アカウントを削除してもパスワードのハッシュ、連携したログイン、設定が残っていました。当時削除したアカウントには今も残っていて、あとから片付けられることはありません。
名前もアドレスも解放されるので、ほかの人が登録できます。
塗りつぶしに使う値は登録できない
名前の接頭辞 gone- と deleted.invalid ドメインは通常の入力では受け付けないので、削除したアカウントになりすます名前やアドレスは登録できません。
ログイン履歴
インスタンスが持っているもので、人をいちばん特定しやすいのは、どこからサインインしたかです。サインインのたびに、アドレス、ブラウザ、最後に見えた日時、終わった理由を記録します。
削除したアカウントのセッションは、すべてすぐに消えます。 本人が削除しても、管理者が削除しても同じです。
普通に終わったセッションは残ります。この表は、本人が「ほかの誰かが入っていないか」を確かめるログイン履歴を兼ねているからです。auth.login_history_days(デフォルト 90 日)より古くなると、掃除で消えます。
自分のサインインは、アドレス、ブラウザ、最後に見えた日時、終わった理由と一緒に見られます。一つずつ終わらせることも、今使っているもの以外をすべて終わらせることもできます。
セッションを終わらせても、忘れるわけではない
行は履歴の期間が終わるまで残ります。残さないと、一覧が「ほかの誰かが入っていないか」に答えられません。
誰が共有を開いたか
デフォルトはオフです。share.access_log.enabled を有効にすると、中身を渡すたびに日時、アドレス、ユーザーエージェント文字列を一行記録します。
| 読める人 | 管理者。アップロードした人は読めない |
| 期間 | share.access_log.retention_days、デフォルト 30 日。0 は「永久」と読まずに断る |
| 数えないもの | HEAD。リンクチェッカー、プリフェッチ、チャットの展開は何も残さない |
正直に答えられないときはアドレスを null にします。信頼していないプロキシの後ろではそうなります。ユーザーエージェント文字列は 512 バイトで切ります。
オフにしても、古い行は残らない
掃除は切り替えに関係なく保持期間どおりに動きます。
GET /api/v1/capabilities は access_log を返すので、共有のページは何かを開く前に訪問者へ伝えられます。
カウンターは別物
閲覧数とコピー数はクライアントが数えます。画面でメモを読んだりコピーを押したりしても、サーバーには何も届かないからです。誰でも水増しできるので、何もこれに頼っていません。誰がしたかもわかりません。
受け取りはこの方法では数えません。サーバー自身が数えるので、クライアントは飛ばせません。
認証情報
どれも渡した値そのものは残さず、照合用の指紋だけを持ちます。
| 消えるとき | |
|---|---|
| API トークン | アカウントと一緒に削除 |
| リカバリーコード | アカウントと一緒に削除 |
| パスワード再設定リンク | アカウントと一緒に削除、または期限切れで |
| アドレス確認リンク | アカウントと一緒に削除、または期限切れで |
| 招待コード | 期限切れで |
招待は使われた回数だけを記録し、誰が使ったかは記録しません。コードからアカウント同士を結びつけることはできません。
サインインに使うもののうち二つは、保存の仕方が違います。認証アプリのシークレットは、すべてのコードの元になるので、インスタンスの鍵で封印して保存します。パスキーは公開鍵だけを保存し、秘密鍵は端末から出ません。どちらもアカウントと一緒に削除されます。
アップロードしたもの
ここが残る部分です。
アカウントが消えても、どれにも手は付きません。
終わらせる方法は二つあります。
- 自分のアカウントを削除するときは、先に生きている共有をすべて期限切れにします。リンクを生かしておくことを選んだ場合は別です。中身は次の掃除で消え、記録は
share.retain_after_death_hoursのあとで消えます。 - 管理者は、一つのアカウントの共有をすべて終わらせる操作を別に実行できます。アカウントを削除するだけでは、共有は動き続けます。
保存したファイルは年、月、ランダムな ID の下に置かれるので、パスに名前やアドレスは出ません。
外部サイトのアカウント
GitHub、Discord、ID プロバイダーでサインインすると、どのプロバイダーか、そしてプロバイダーがあなたに付けた ID を保存します。ID は数字か意味のない文字列で、名前ではありません。名前は変わったり乗っ取られたりするからです。プロバイダーの連携を解除すると消えます。
暗号化した共有
エンドツーエンド暗号化した共有は、インスタンスが鍵を持たないバイト列として保存されます。中身、ファイル名、種類、タイトルはここでは読めません。インスタンスが知っているのは、各ファイルの大きさ、ファイルの数、作った日時と期限、取得された回数です。
終わらなかった登録
メールを設定していると、入力された名前、アドレス、パスワードは、アカウントができる前から保存されます。これは意図的です。アカウントをまだ書いていないので、「このアドレスはここに登録しているか」を問い合わせることができません。
行は期限が切れると掃除されます。
データベースの外
- レート制限のカウンターはメモリ上にあり、送信元アドレスをキーにしています。再起動で消え、ディスクには何も残りません。
- リクエストログにはメソッド、パス、リクエスト ID を記録します。アドレスもアカウントも記録しません。受け取りコードはパスに入っているので、ログにも出ます。サーバーエラーの応答には同じリクエスト ID が入るので、報告とログの行を突き合わせられます。
- メール中継には、確認メールと再設定メールのたびに宛先アドレスが見えます。何を残すかは、このインスタンスではなく中継の運営者の問題です。
- ストレージ事業者は、ファイルをバケットに置いている場合、ファイルを持っています。暗号化した共有は届く前に封をしてあります。
- ウイルススキャナーは、スキャンが有効なら、エンドツーエンド暗号化していないすべてのファイルの中身を受け取ります。
- Have I Been Pwned は、パスワードの照合が有効なら、新しいパスワードの SHA-1 の先頭 5 文字を受け取ります。人を特定するものは受け取りません。
- ログインのプロバイダーは、誰かがそれを使ってここにサインインしたことを知っています。
受け取りコードはログに残る
/s/0ZPQ4M7K はそのままリクエストログに入り、そのコードで共有を受け取れます。ログは同じ基準で守られている場所に送ってください。
本当に消す
消去の機能も、データをエクスポートする方法もありません。データベースにアクセスできる運営者なら、残ったものを消せます。
共有を終わらせる
管理画面から終わらせるか、自分のアカウントを削除するときに期限切れにします。中身が解放されるのは、共有が終わってからです。
掃除を一回待つ
掃除は 1 時間ごとに動き、保存したファイルを解放します。先に記録を消すと、そのファイルは取り残されます。どのファイルを消すかを知っているのは記録だけだからです。
それから行を消す
塗りつぶしたアカウントと終わった共有は、何からも指されなくなれば消せます。ストレージからすでに消したものは戻りません。
バックアップはどれも対象外です。先週のダンプには、古い行がすべてそのまま残っています。