↓の続きというか並行して起きてた問題です。
Redashのv8からv26へのアップデート後、SSOでのログインができなくなるという問題が発生しました。
そもそもQiitaのRedashは現状Oktaを利用したSSOでのログイン以外認めていないので、セッションが切れたりログアウトしたりすると再び入れなくなるという状況でした。
ログを見る
redashコンテナのログにこのエラーが出ていました。
Exception: AudienceRestrictions conditions not satisfied!
(Local entity_id=https://<your-org>.okta.com/app/.../sso/saml)
AudienceRestrictions conditions not satisfied がほぼ答えで、SAMLのAudience検証に失敗しています。
SAML認証のおさらい
ここで、簡単にSAMLの仕組みに触れておきます。
- ログイン時、IdP(Okta)が SAMLResponse を返します
- その中に
AudienceRestrictionという要素があり、このアサーションは誰宛か(どのSP向けか)を示します - SP(Redash)は、自分の identifier(
entity_id)がそのAudienceと一致するかを検証します - 一致しなければ、なりすまし防止のため拒否します
エラーの Local entity_id=... は、Redashが自分のものとして突き合わせた値です。こことIdPが送ってきたAudienceがズレていた、ということになります。
原因: entity_id と Audience のズレ
突き合わせる2つの値がこうなっていました。
- Oktaが Audience として送っていた値: ACS URL の
https://(redashのドメイン)/saml/callback?org_slug=default - Redash側の
auth_saml_entity_idに入っていた値: OktaのSSO URL
本来この2つは一致している必要がありますが、Redash側にIdPのSSO URLが入っていて、Audience(ACS URL)と食い違っていました。これでAudience検証に落ちていたわけです。
なぜ古いバージョンでは平気だったのか
設定は元からズレていました。にもかかわらずv8では動いていました。
- v8系の古い pysaml2 では Audience の検証が緩く、ズレていても素通りしていた
- v26系で pysaml2 が新しくなり検証が厳格化され、元々あったズレが顕在化した
「アップグレードで壊れた」ように見えますが、正確には「ずっと間違っていた設定が、検証強化で露呈した」というパターンです。
修正
Redashの管理画面に入れる場合はそちらから変えればいいですが、できない場合はDBを直接触る必要があります。
auth_saml_entity_id を、Audience として送られてくる ACS URL に揃えましょう。
Redashで利用しているDBに何らかの方法で以下のSQLを実行すると良いです。
UPDATE organizations
SET settings = jsonb_set(
settings,
'{settings,auth_saml_entity_id}',
'"https://(redashのドメイン)/saml/callback?org_slug=default"'::jsonb,
true
)
WHERE slug = 'default';
-
get_saml_clientは毎リクエストでDBを読むので、基本は即反映されます - 反映されなければ redash-server のタスクを再起動しましょう
これでSAMLログインが復旧しました。
Audience の実値はどう確認したか
合わせ先の値(IdPが送るAudience)は、Okta管理者権限がなくても確認できます。
- ブラウザ拡張の SAML-tracer などで、ログイン時の SAMLResponse をキャプチャする
- Base64デコードして
<AudienceRestriction><Audience>の中身を見る - そこに入っている値に、Redash側の
auth_saml_entity_idを合わせる
管理コンソールを触れなくても、ブラウザを通る本物のレスポンスから正解の値が取れる、というのが現場では役立ちました。
最後に
Redashのアップグレードをこれまでサボっていた分、複数問題が出て大変でしたがこれでひとまずは落ち着いたと信じています。
こまめに上げて、アップグレードのコストが高くならないように注意していきましょう。