OSSTech株式会社

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 とは連携が出来ている状態とします。

設定手順

設定手順は下記の流れになります。

  1. 複数の IdP のメタデータファイルの準備
  2. ディスカバリーサービスの準備
  3. 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 を自動的に判定するなど 要件によってカスタマイズすることが考えれます。


  1. 当初は一つのファイルにメタデータをまとめる手順で記載していましたが、個々のメタデータファイルを登録する方が管理しやすいため記載を変更しました。 ↩︎