mod_auth_mellon で複数のIdPと連携する
2022-12-28 - 相本 智仁
はじめに
mod_auth_mellon は複数のIdPと連携することが出来ます。今回は複数IdPと連携する手順を解説します。
私は以前mod_auth_mellonを使ってみたという 記事を書きましたが、このときは IdP は一つでした。 IdP が一つの環境では未認証の状態で mod_auth_mellon にアクセスすると IdP にSAMLリクエストを送ります。
mod_auth_mellon が複数のIdPと繋ぐ場合
複数のIdPと繋ぐ場合、mod_auth_mellon はユーザーがアクセスしてきた際にどの IdP に SAMLリクエストを送れば良いかわかりません。 そのため一度ディスカバリーサービスに遷移させ、ディスカバリーサービスでどの IdP を利用するか決めてもらい、 mod_auth_mellonはディスカバリーサービスで決まった IdP へSAMLリクエストを送るというシーケンスになります。
このようにmod_auth_mellonで複数の IdP と連携する場合はどの IdP にSAMLリクエストを送るかを決めてもらうディスカバリーサービスが必要です。 ディスカバリーサービスは何らかの手段で利用する IdP を決め、 mod_auth_mellon に戻す機能が必要となります。
ディスカバリーサービスを提供するプロダクトとして Shibboleth Discovery Service がありますが、 必ずしもアプリケーション環境を準備しなくても利用可能です。 本記事では単純な HTML の Form タグで IdP のリスト画面を表示し、ユーザーにIdPを決めてもらう構成で構築します。
構成
複数IdPと連携する構成を示します。
- mod_auth_mellon(SAML SP)
- OpenAM(IdP1)
- Shibboleth IdP(IdP2)
- ディスカバリーサービス(ただのHTMLファイル)
一つの mod_auth_mellon で OpenAM と Shibboleth IdP の2つの IdP と連携するシステムを構築します。 事前準備として mod_auth_mellon は構築済みで、個別に一つの IdP としてOpenAM と Shibboleth IdP とは連携が出来ている状態とします。
設定手順
設定手順は下記の流れになります。
- 複数の IdP のメタデータファイルの準備
- ディスカバリーサービスの準備
- mod_auth_mellon でディスカバリーサービスの URL を設定
複数の IdP のメタデータファイルの準備
連携するそれぞれ IdP のメタデータファイルを準備し、 mod_auth_mellon に設定します。1
MellonIdPMetadataFile /opt/osstech/etc/mod_auth_mellon/metadata/idp1.xml
MellonIdPMetadataFile /opt/osstech/etc/mod_auth_mellon/metadata/idp2.xml
ディスカバリーサービスの準備
今回は単純な HTML ファイルを準備します。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h1>IdPの選択</h1>
<form method="GET" action="【mod_auth_mellonサーバーのURL】">
<select name="IdP">
<option value="【OpenAMのEntityID】">OpenAM</option>
<option value="【Shibboleth IdP のEntityID】">Shibboleth IdP</option>
</select>
<input type="hidden" name="ReturnTo" value="/cgi-bin/env.cgi"><!-- 【IdP認証後に遷移させるURL】 -->
<input type="submit" value="選択">
</body>
</html>
これは「OpenAM」と「Shibboleth IdP」の2つの選択肢があるリストと、「選択」ボタンが表示される単純なHTMLです。 選択ボタンを押すと、【mod_auth_mellonサーバーのURL】に「選択したIdPのEntityID」と「IdP認証後に遷移させるURL」が Queryパラメーターで送信されます。
【mod_auth_mellonサーバーのURL】は、“mellon動作用URLパス” + “/login” を入れます。この記事の
例の設定であれば、https://sp.example.com/mellon/login
が 【mod_auth_mellonサーバーのURL】となります。
HTML ファイルの配置場所は任意です。ユーザーがアクセス出来る場所に配置してください。
本記事では https://osstech.example.co.jp/select.html
にアクセスすると上記の HTML ファイルが応答される場所に配置します。
mod_auth_mellon でディスカバリーサービスの URL を設定
未認証で mod_auth_mellon にアクセスされた際に ディスカバリーサービスの URLへリダイレクトするよう設定します。 下記のとおり設定します。
<Location />
〜
MellonDiscoveryURL https://osstech.example.co.jp/select.html
〜
</Location>
動作確認
設定が完了したら mod_auth_mellon にアクセスして動作を確認してみます。
ブラウザを起動してhttps://sp.example.com/cgi-bin/test.cgi
へアクセスするとディスカバリーサービスへ遷移します。
先程準備した選択画面の HTML が表示されます。
ここでは OpenAM を選択して「選択」ボタンを押します。
OpenAM のログイン画面が表示されますので、正しいID/パスワードを入力しログインします。
SP(mod_auth_mellon)の画面が表示されます。(env.cgi は環境変数一覧を表示するCGIを配置しています。)
ブラウザを再起動し、もう一度アクセスして今度は Shibboleth IdP を選択してみましょう。
https://sp.example.com/cgi-bin/test.cgi
へアクセスします。
先程と同じように選択画面が表示されますので今度は Shibboleth IdP を選択して「選択」ボタンを押します。
Shibboleth IdP のログイン画面が表示されます。正しいID/パスワードを入力しログインします。
SP(mod_auth_mellon)の画面が表示されます。
ユーザーの選択によって、「OpenAM」と「Shibboleth IdP」と 2つの IdP を利用できることが確認出来ました。
ここでブラウザ起動後はhttps://sp.example.com/cgi-bin/test.cgi
へアクセスしているのに
IdP 認証後にhttps://sp.example.com/cgi-bin/env.cgi
へアクセスしていることにお気づきになられたでしょうか。
これは IdPの選択画面で「選択」を押して mod_auth_mellon にリダイレクトする際の Queryパラメーターの
ReturnTo の値が/cgi-bin/env.cgi
となっているためです。IdP ログイン完了後に https://sp.example.com/cgi-bin/env.cgi
へアクセスします。
補足事項
mod_auth_mellon の設定について
複数の IdP と繋ぎましたが、IdP 毎に異なる設定は出来ません。 例えば Apache が認識するユーザー名の設定である MELLON_USER を NameID と設定すると、「OpenAM」も「Shibboleth IdP」のどちらも SAMLアサーションに含まれる NameID の値をユーザー名として認識します。 「OpenAM」は NameID 、「Shibboleth IdP」は属性から取得するといったことは出来ません。
ディスカバリーサービスから mod_auth_mellon へ渡すパラメーター
ディスカバリーサービスから mod_auth_mellon へ戻る際は「IdP」と「ReturnTo」パラメーターが必要です。 今回準備したHTMLファイルで「選択ボタン」押すことで mod_auth_mellon に渡されるリクエストは下記のようになります。
- OpenAM を選択した場合
/mellon/login?IdP=https%3A%2F%2Fam.osstech.co.jp%2fopenam&ReturnTo=%2Fcgi-bin%2Fenv.cgi
- Shibboleth IdP を選択した場合
/mellon/login?IdP=https%3A%2F%2Fdocker-idp4-jetty.example.com%2Fshibboleth-idp&ReturnTo=%2Fcgi-bin%2Fenv.cgi
QueryパラメーターIdPに連携するIdPのEntityID
、ReturnTo が認証完了後に遷移するURL
が入ります。
IdP をもっと増やす
今回の構成ではIdPは「OpenAM」と「Shibboleth IdP」の2つでした。これをもっと増やすことが可能です。 新しい IdP のメタデータを追加します。
MellonIdPMetadataFile /opt/osstech/etc/mod_auth_mellon/metadata/idp1.xml
MellonIdPMetadataFile /opt/osstech/etc/mod_auth_mellon/metadata/idp2.xml
MellonIdPMetadataFile /opt/osstech/etc/mod_auth_mellon/metadata/idp3.xml <-- 追加
選択画面のHTMLのリストに IdP を追加します。
<select name="IdP">
<option value="【OpenAMのEntityID】">OpenAM</option>
<option value="【Shibboleth IdP のEntityID】">Shibboleth IdP</option>
<option value="【追加する IdP のEntityID】">NEW IdP</option> <-- 追加
</select>
まとめ
ディスカバリーサービスを準備し、mod_auth_mellon で複数の IdP と連携することが出来ました。 今回は静的な HTML ファイルをディスカバリーサービスにしたためにユーザーには毎回選択画面が表示されます。 これを JavaScript を用いたり Webアプリケーションにして機能を強化しても良いかと思います。 例えば、一度IdPを選択したら Cookie に保存し、次のアクセスからは選択画面を出さずに 自動的に以前の IdP に遷移させたり、アクセス元の IPアドレスから IdP を自動的に判定するなど 要件によってカスタマイズすることが考えれます。
当初は一つのファイルにメタデータをまとめる手順で記載していましたが、個々のメタデータファイルを登録する方が管理しやすいため記載を変更しました。 ↩︎