セキュリティ

タスクは自分だけのもの

DoneはAIエージェントとタスクリストを共有する時代のために作られています。だから、分離、スコープを絞ったアクセス、人による承認は「機能」ではなく「土台」です。

アカウントの分離

  • すべてのタスク、プロジェクト、タグは、ワークスペースのメンバーシップでスコープされています。クエリが返せるのはアカウントに閲覧が許された行だけで、アカウントをまたいで読み取る経路は存在しません。
  • 内部用の作成者・帰属カラムは、行がデータ層を出る前に取り除かれるため、APIに現れることはありません。
  • 共有ワークスペースとプロジェクト単位の共有はオプトインです。メンバーに見えるのは招待した範囲だけで、それ以外は見えません。

認証

  • パスワードはargon2idでハッシュ化され、平文で保存されることはありません。認証はアカウント単位で、共有の環境シークレットではありません。
  • 2要素認証(TOTP)をオンにすれば、パスワードが盗まれてもそれだけではログインできません。パスワードの再設定時にも適用されるため、メールの受信トレイにアクセスされただけではアカウントを乗っ取れません。デバイスを紛失したときのために、1回限り使えるリカバリーコードが10個発行されます。
  • セッションはアカウント単位のCookieベースです。各セッションは必ず1人のユーザーに対応し、すべてのリクエストはそのユーザーにスコープされます。
  • サイト全体が同一オリジンで、厳格なContent-Security-PolicyのもとHTTPSで配信されます。インラインスクリプトはリクエストごとに発行される新しいnonceがある場合にのみ実行されるため、注入されたスクリプトは実行されません。

エージェントのアクセスとトークン

  • すべてのアカウントに専用のMCPエンドポイントと専用のトークンがあります。共有トークンやグローバルトークンは存在せず、トークンが見られるのは自分のアカウントのデータだけです。
  • ProとTeamsでは、トークンのスコープを読み取り専用や単一プロジェクトに絞れます。エージェントには必要なアクセスだけを渡せます。
  • 接続はOAuth 2.1(DoneはMCPエンドポイント用の完全な認可サーバーです)またはベアラートークンで行います。トークンを再生成または失効させると、即座に無効になります。
  • パスワードを変更または再設定すると、MCPトークンや連携アプリを含むすべてのAPI認証情報も失効します。不正アクセスが疑われる場合の復旧後に、エージェントのアクセスがひそかに残ることはありません。

すべての結果を自分で承認

  • ゲート付きのタスクは、自動では完了になりません。エージェントは本格的な作業の前に計画を、完了の前にサマリーを提案します。「要対応」で承認するまで、完了になることはありません。
  • タスクを自動承認可能にできるのは人間だけです。エージェントが自分でゲートを外すことはできません。
  • エージェントのセッションはすべて、ツール呼び出しと時間の予算とともに実行として記録されます。何が実行されたかを正確に確認でき、どこまで進めるかに上限を設けられます。

データについて

  • データはCloudflare D1(エッジSQLite)に、タスクに添付したファイルはCloudflare R2に保存され、どちらも1つのWorkerから配信されます。データをやり取りする別のバックエンドはありません。
  • タスクを削除するとゴミ箱に移動し、30日間は復元できます。即座に完全削除されることはありません。
  • タスクはいつでもCSVまたはMarkdownでエクスポートでき、アカウント(とそのすべてのデータ)もアプリから自分で削除できます。

Slackと外部サービスの連携

  • Slackアプリはユーザー単位で連携され、Doneにログインした本人が確認してはじめて有効になります。オーナーの同意なしにSlackのIDがアカウントにひも付くことはありません。
  • Slackからのすべての受信リクエストはSlackのsigning secretによる署名で検証され、再送された(古い)リクエストは拒否されます。
  • Google Calendarと購読したICSカレンダーフィードは、どちらも予定あり・なしの時間帯だけを読み取り専用で同期します。予定のタイトルや詳細は取得しません。いずれも完全に任意で、自分で接続しない限り何も接続されません。

問題を見つけたら

セキュリティ上の問題はsecurity [at] trydone.appまで非公開でご報告ください。折り返しご連絡します。悪用可能な問題については、公開のissueを立てないようお願いします。