安定版 v3.3.3 で再構築したら SSO が壊れた

本日3.3.3(数日前にリリースされた最新の安定版)で再構築した後、SSOが機能しなくなりました。現在ログイン中のユーザーは問題ありませんが、新しいセッションではSSOフローがエラーで終了します。

アカウントのログインがタイムアウトしました。再度ログインしてください。

verbose discourse connect logging を有効にすると、以下が表示されます。

Verbose SSO log: Nonce is incorrect, was generated in a different browser session, or has expired

しかし、SSOフローに関して過去数年間何も変更していません。サーバー間の時計は同期しています。

一方で、最近3.3.2から3.3.3にアップデートしました。これには、Discourse Connectに関連するセキュリティ修正が含まれており、関連がある可能性があります。

関連性は低いかもしれませんが、再構築はCDNを有効にするためでした。しかし、すでにそれらの変更はすべて元に戻しましたが、SSOの問題は残っています。

さらにデバッグする方法について、何かヒントはありますか?

「いいね!」 1

数回の再構築を経て、SSOをv3.3.2にピン留めすることで再び機能させることができました。そのため、v3.3.3でSSOサポートを壊す何かが導入されたようです。

git diff v3.3.2 v3.3.3 をざっと確認しましたが、明白なものは見つかりませんでした。しかし、Discourse Connectに関連する変更が含まれています。

しかし、これは3.3.3に移行する人が増え、ユーザーセッションが期限切れになり更新に失敗し始めると、より多くの人に影響が出始めるだろうと推測しています。コード、特にSSOフローを知っている人が詳しく調べる価値があるかもしれません。/cc @sam

追伸:関連があるかわかりませんが、1日以上前に3.3.3にアップデートしましたが、問題は数時間前にコンソール経由で再構築した直後に発生したようです(CDNを有効にするためでしたが、それを元に戻してもSSOは修正されませんでした)。

「いいね!」 1

3.3.3は少し古いと思いませんか?

はい、ほとんどの人が tests-passed ブランチを実行しているという意味ではそうですが、今週リリースされた安定版の最新リリースという意味ではそうではありません。3.3.3: Security and maintenance release

「いいね!」 2

可能性は低いですが、SSO リクエストをブラウザのリダイレクトを使用して SSO プロセスを経るのではなく、アプリケーションのバックエンドから行うなど、別のブラウザセッションで nonce を生成していませんか?

デフォルトで有効になっている discourse_connect_csrf_protection という非表示のサイト設定があります。ユーザーのセッション外から SSO リクエストを行えるようにするには、これを無効にする必要があります。

この設定はバージョン 3.3.2 に存在したと仮定していますが、後から追加された可能性もあります。

「いいね!」 1

そうではありません。リダイレクトに従って、Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso) で説明されていることを非常に標準的な方法で実装しています。数年間問題なく動作しており、変更も加えていません。

通常とは異なるSSO処理は行っていませんが、念のためRailsコンソールで無効にしてみました。その結果、エラーメッセージは削除されました。つまり、SSOプロバイダーがDiscourseにリダイレクトバックした際に、「アカウントのログインがタイムアウトしました。再度ログインしてください。」というエラーではなく、エラーメッセージ(またはその他のメッセージ)は表示されなくなりました。しかし、残念ながら、ログアウトしたままの状態は解消されませんでした。

私も藁にもすがる思いです。これは非常に奇妙な状況です。問題が最初に3.3.3にアップデートした際には発生せず、コンソールからの再構築後(約36時間後)にのみ発生したという事実は、手がかりになるかもしれませんが、両者の違いについては十分な知識がありません。

3.3.3に再度アップデートしてみましたが、問題はすぐに再発しました。3.3.2に戻すと、SSOは再び機能するようになりました。

「いいね!」 2

問題は DiscourseConnect のセキュリティ修正ではなく、nginx の変更にあると疑っています。tests-passed では、一部の環境で問題が発生したため木曜日にフォローアップを行う必要があり、Github の別のユーザーは CSRF の問題に言及していました。

それに対するバックポートを用意しました: https://github.com/discourse/discourse/pull/30410。チームの誰かが承認すればすぐにマージされるはずですが、ほとんどの人は日曜日です。SSO を設定している @mentalstring さんは、そのブランチを試すことができます。

「いいね!」 4

これでうまくいったことを報告できて嬉しいです!:tada:

特に週末にもかかわらず、そして stable と SSO が少しニッチであることを考慮して、この件を調べてくださったことに感謝します。他の人にも役立つことを願っています。ありがとうございます!

PR がマージされるのを楽しみにしています。

「いいね!」 4