セキュリティ方針
DIscheduler は Discord サーバー内の日程調整 Bot です。参加者の予定という個人に関わる情報を扱うため、セキュリティとプライバシーを最優先に設計しています。
仕組みを隠すことで守る設計はとらず、対策の内容はすべて公開しています。秘密にしているのは、鍵とトークンだけです。設計の詳細(脅威モデル・対策・残存リスク)は、セキュリティ設計書で公開しています。
要点
- 回答はその調整の参加者同士でだけ共有され、参加者以外からは見えません。
- パスワードやログインを求めず、本人にだけ見えるメッセージで入力リンクを渡します。
- 保存するのは日程調整に必要なデータだけで、締切・確定から 6 ヶ月後に自動で削除します。
- Bot には管理者権限を渡さず、必要な権限だけで動きます。
本アプリがしないこと
- Discord のパスワード入力や OAuth ログインを求めません
- 管理者(Administrator)権限を要求しません
- メッセージ本文を読みません(Message Content Intent 不使用)
- Bot を追加する前のメッセージ履歴も読みません(「メッセージ履歴を読む」権限を求めず、チャンネルのメッセージを取得する処理もありません)
- メールアドレス・IP アドレス・アバター画像を保存しません
@everyone/@here/ ロールへのメンションをしません- 外部の解析ツール・広告・CDN を読み込みません
- 寄付リンクは外部サービスへのただのリンクで、支援サービスのスクリプトや画像は読み込みません
回答の公開範囲
個人ごとの回答(○△× とひとことコメント)は、日程を合わせるためにその調整の参加者同士で共有され、参加者以外(外部の人・同じサーバーの参加者でない人)からは見えません。
| 見る人・見る場所 | 見える内容 |
|---|---|
| その調整の参加者・主催者 | 全員の回答とひとことコメント |
| チャンネルの募集メッセージ | 候補ごとの ○ の人数と回答率だけ |
| 確定のお知らせ・Discord イベント | 確定した日時と参加者へのメンションだけ。イベントはサーバー内限定 |
| 参加者以外・サーバーの外の人 | 何も見えません(調整の URL を知っていても見えません) |
公開用の閲覧リンクやエクスポート機能はありません。参加者から外された人は、その時点で画面を開けなくなります。運用者向けの閲覧画面も作らず、ログにも回答の内容は出しません。
保存するデータと期間
| データ | 保存期間 |
|---|---|
| Discord のサーバー ID・チャンネル ID・ユーザー ID・表示名(参加者のみ) | 調整の削除まで(最長:締切/確定の 6 ヶ月後) |
| 調整のタイトル・説明・候補日時 | 同上 |
| 各参加者の回答(○△×)とひとことコメント | 同上(同じ調整の参加者全員に表示されます) |
| 調整のタイムゾーン(主催者が設定) | 同上 |
| サーバーの既定値(参加者の決め方・ロール)と、最後に変更した管理者のユーザー ID | Bot がサーバーから外されるまで |
| サーバーで最近使った候補日時の時間帯(開始・終了の時刻だけ、直近 3 件。誰が入れたかは保存しません。作成画面で主催者にだけ表示されます) | 最後に使ってから 6 ヶ月、または Bot がサーバーから外されるまで |
| ログインと乱用防止のための短期間の記録(入力リンク・セッションのハッシュとユーザー ID、回数制限のカウンタに含まれるユーザー ID) | 入力リンクは 10 分、セッションは 12 時間で無効になり、回数制限のカウンタは期限(最長 1 日)を過ぎると、それぞれ毎日 1 時の自動処理で削除 |
表示用のタイムゾーンの設定はあなたのブラウザ内にのみ保存され、サーバーには送信されません。
主催者はいつでも /schedule の[作成した調整を管理]から開く「作成した調整の一覧」で、調整を即時削除できます。Bot をサーバーから削除すると、そのサーバーのデータも削除されます。
参加者を自動で設定するときの扱い
参加者を自動で設定する方式(標準)では、サーバーのメンバー一覧(ユーザー ID・表示名・ロール)を Discord から取得します。このうち保存するのは参加者になった人の情報だけで、それ以外の人の情報は保存しません。主催者は調整ごとに参加者を手動で選ぶ方式に切り替えることもできます。
主な対策
| 分類 | 対策 |
|---|---|
| Discord 連携 | すべてのリクエストを Ed25519 署名で検証し、リプレイ攻撃を防止 |
| 本人確認 | 本人にしか見えない Discord メッセージで、10 分有効・1 回限りの入力リンクを発行 |
| セッション | HttpOnly / Secure / SameSite=Strict Cookie、12 時間で失効、1 つの調整にのみ有効(主催者の「作成した調整の一覧」は、そのサーバーで自分が主催した調整だけを扱う別のセッション) |
| Web 攻撃対策 | 厳格な CSP、CSRF トークン、Origin 検証、プリペアドステートメント、XSS 対策 |
| アクセス制御 | 回答は参加者同士でのみ共有。確定・削除は主催者のみ |
| データ最小化 | 必要最小限のデータのみ保存し、締切・確定から 6 ヶ月後に自動で物理削除 |
| 可用性 | Cloudflare の DDoS 保護、レート制限(調整の作成数制限を含む)、入力サイズ制限 |
| 開発プロセス | 依存最小化、Dependabot、CodeQL、Secret scanning、ブランチ保護、SHA 固定の GitHub Actions |
このページを含む公開ページも、アプリと同じ厳格な CSP で配信しています。外部のスクリプト・フォント・画像は読み込みません。
コマンドの利用範囲
コマンドを使えるチャンネルはサーバー管理者が Discord 標準の「連携サービス」設定で指定し、そのチャンネルで打てる人はチャンネルの発言権限で決まります(どちらも Discord 側で強制されます)。許可されていないチャンネルや、発言権限のない人のコマンドは、Bot まで届きません。
乱用を防ぐため、調整の作成数に上限を設けています(1 人 1 時間に 10 件、サーバー全体で 1 日 100 件、1 チャンネルの進行中の調整は 20 件まで)。
残っているリスク
対策をしても防ぎきれない点や、利便性のために選んだ点を公開しています。
| 項目 | 内容と対応 |
|---|---|
| 入力リンクの転送 | 参加者が自分の入力リンクを他人に渡すと、10 分以内に 1 回だけ、本人として閲覧・回答できてしまいます。リンクは 1 回限り・10 分・1 つの調整だけに有効にして影響を限っています。入力リンクは他人に渡さないでください。 |
| 保存期間 | 締切・確定から 6 ヶ月間は予定のデータが残ります。振り返りや再調整に使えるようにするための判断です。主催者はいつでも削除できます。 |
| 導入直後のコマンド | Bot を追加した直後は、すべてのチャンネルで、発言できる人がコマンドを使えます。使う場所を限る場合は、管理者が連携サービス設定でチャンネルを指定してください。 |
| Cloudflare と Discord | データは Cloudflare に保存され、Discord を経由してやり取りします。両社のインフラや従業員がデータにアクセスできる可能性があり、この点は各社の方針に依拠しています。保存するデータを最小限にして影響を小さくしています。 |
| 無料プラン | 稼働率の保証(SLA)はありません。利用が多く Cloudflare の無料枠を超えた日は、日本時間の午前 9 時まで使えなくなります。この場合も料金はかからず、入力済みの回答は消えません。 |
| 保存時の暗号化 | 保存データは Cloudflare 側で暗号化されます。アプリ側での追加の暗号化はしていません。保存するのが予定と表示名だけで、鍵の管理を複雑にするほうが事故のリスクが大きいと判断しました。 |
脆弱性の報告
脆弱性を発見した場合は、公開の Issue には書かず、GitHub の Private vulnerability reporting(リポジトリの Security タブ →「Report a vulnerability」)から報告してください。
- 受領連絡: 3 営業日以内を目標
- 修正後、報告者の同意を得て、報告された脆弱性を GitHub Security Advisory として公開します
- 善意のセキュリティ調査は歓迎します。ただし他の利用者のデータへのアクセス、サービス妨害、ソーシャルエンジニアリングは行わないでください
サポート対象は main ブランチの最新版のみです。
改訂履歴
| 日付 | 内容 |
|---|---|
| 2026年11月14日 | サイトのアドレスを discheduler.etlits.dev に変更 |
| 2026年11月13日 | Bot を追加する前のメッセージ履歴を読まないことを追記 |
| 2026年11月10日 | 主催者の「作成した調整の一覧」と、そのためのセッションについて追記 |
| 2026年11月8日 | 保存するデータに「サーバーで最近使った時間帯」を追加 |
| 2026年11月5日 | 初版を公開 |