OpenAM を活用し Entra ID 認証で学認のサービスを利用する
2024-08-07 - 唐木 大介
0. はじめに
OpenAM14.5 では学術認証フェデレーション「学認 (GakuNin)」との連携機能を強化し、学認IdP として運用しやすくなりました。特に、送信属性同意機能や、SP の自動登録、属性値のスクリプトによる生成など、Shibboleth IdP が持つ機能と同等の機能を強化しています。
OpenAM は一つのバージョンを長期にサポートすることにより、バージョンアップを気にせずに長期間運用いただけます。また、ソフトウェアを RPM パッケージで提供しており、同梱の Tomcat を含めシステム全体を RPM コマンドなど O.S.と同等の Linux スキルで運用とサポートが可能な製品となっています。

以上のように OpenAM 単体で 学認IdP として構築可能ですが、Microsoft Entra ID(以降 Entra ID) を利用している組織では、学認IdP として構築した OpenAM と Entra ID を連携することで Entra ID へサインインで GakuNin RDM などの学認サービス の利用が可能となります。
0.1. OpenAM 単体で 学認IdP 機能を持つ認証基盤を構築した構成例
OpenAM のアダプティブリスクや OTP/FIDO2 などの多様な認証機能を組み合わせ、OpenAM 単独で 学認IdP 機能に加えてSAML / OpenID Connect / WS-Federation / 代理認証機能の対応により、広くクラウドサービス、オンプレミスアプリケーションの認証基盤となります。

0.2. Entra ID と OpenAM を連携した認証基盤の構成例
OpenAM は Entra ID のユーザー認証を利用し、学認サービス、クラウドサービス、オンプレミスアプリケーションの認証基盤となります。

本ドキュメントでは、Entra ID と OpenAM を SAML 連携し、OpenAM の認証に Entra ID ユーザー認証を利用するための設定手順を解説しています。
OpenAM を 学認IdP として構築する手順は、以下のドキュメントを公開しておりますので参考にして下さい。
1. OpenAM の認証を Entra ID で行う設定
OpenAM では認証連鎖とよばれる機能で多要素認証を構築できますが、これを SAML を利用して Entra ID の認証が通れば認証完了とする構成を想定します。

設定の流れは以下の通りです。
- OpenAM に SAML サービスプロバイダーを作成
- Entra ID に OpenAM をエンタープライズアプリケーションとして登録
- OpenAM に Entra ID を 外部アイデンティプロバイダーとして登録
SAML連携の仕様
Entra ID と OpenAM の間でアカウントを紐付ける値(共通の値)をUPNとメールアドレスを用いる想定です。 ※別の値を用いて連携することも可能ですが、ここでは設定手順が少ない例を選択しています。
- Entra ID アカウントの
user.userprincipalname
値 = testuser01@sampledomain000.onmicrosoft.com - OpenAM アカウントの
mail
値 = testuser01@sampledomain000.onmicrosoft.com
1.1. OpenAM SAML サービスプロバイダー(SP)の作成
ここでは OpenAM を SAML のホスト SP として構成します。
ユーザー認証をするレルム(ここでは最上位のレルム)を開き、共通タスクから「SAMLv2 プロバイダの作成」を選びます。

「ホストサービスプロバイダの作成」を選びます。

「名前」の値は現在アクセスしているURLから生成されていますが、必要であれば変更します。 トラストサークルは既存のものがあれば選択し、無い場合は、任意の文字列を指定し新規作成します。 トラストサークルは Entra ID(IdP) と OpenAM(SP) が所属できれば、名称には特に制限はありません。 ※ロードバランサー経由のアクセス等で、ユーザーがアクセスするURLが、現在設定中の URL と異なる場合はベースURLを変更して設定すると、エンドポイントの URL 生成に使われるので便利です。右上の「設定」ボタンで作成されます。

作成が完了すると下のダイアログがでます。 リモートアイデンティティープロバイダの作成は、Entra ID 側の SAML 設定が終わっていないので、「いいえ」を選択し、Entra ID の設定時にメタデータを取得してから作成(設定)します。

作成が終わりましたら、上メニューの「連携」を開き、「エンティティープロバイダ」リストから作成した SP を開きます。

「表明コンテンツ」タブの「NameID の書式」を選択します。

「NameID の書式リスト」内の、urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress を残して他を削除し、ページ右上又は右下の「保存」を選び設定保存します。

次に「表明処理」タブを開き、「属性マッパー」の設定をします。
「現在の値」の「*=*」を削除します。
「新しい値」に http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name=mail
を追加します。
Entra ID と OpenAM のユーザーの紐づけは、http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name
として user.userprincipalname
が送信されてきて、それを OpenAM ユーザーの mail
と突き合わせることで実現しています。
※NameID 値はユーザーの紐づけには利用していません。

次に下へスクロールし、「自動連携」の設定を以下のように設定します。
有効 | チェック |
属性 | http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name |
ページ右上又は右下の「保存」を選び設定保存します。

次に「サービス」タブの一番下までスクロールし「表明コンシューマサービス」の設定をします。

表明コンシューマーサービスのデフォルト値を「HTTP-Artifact」ではなく、「HTTP-POST」にチェック入れます。
既定で入っているURLに赤字のように「Auth」を追加して「AuthConsumer」と変更して保存します。
HTTP-POST | https://openam.example.co.jp:443/openam/Consumer/metaAlias/sp |
↓下のように変更
HTTP-POST | https://openam.example.co.jp:443/openam/AuthConsumer/metaAlias/sp |
※これはSAML2認証モジュールを動作させる際にのみ必要な追加設定です。

1.2. Entra ID(IdP) への OpenAM エンタープライズアプリケーションの登録
Entra ID側にSAML連携するOpenAMに作成したSAML SPをエンタープライズアプリケーションとして登録します。
「Microsoft Entra 管理センター」にログインし、「エンタープライズアプリケーション」の画面より「+新しいアプリケーション」から追加します。

「Microsoft Entra ギャラリーを参照する」のリストには適用できる雛形が無いので、「独自アプリケーションの作成」をえらび、以下の値で作成します。
- アプリケーション名 OpenAM
- ギャラリーに見つからないその他のアプリケーションを統合します(ギャラリー以外)

アプリケーションのシングルサインオン設定を選びます。

「シングルサインオン方式の選択」では「SAML」を選びます。

①基本的な SAML 構成画面
「基本的な SAML 構成」の右の「✐ 編集」を押し、前の章で作成した OpenAM SP の情報を元に登録します。

ここで OpenAM(SP)の作成で利用した以下の値をそれぞれ設定します。
識別子(エンティティID) | https://openam.example.co.jp:443/openam |
応答 URL(Assertion Consumer Service URL) | https://openam.example.co.jp:443/openam/AuthConsumer/metaAlias/sp |

②属性とクレーム
「属性とクレーム」の Entra ID から送られる「一意のユーザー識別子(名前ID)」は既定で user.userprincipalname
となっており変更の必要はありません。
※NameID 値はユーザーの紐づけには利用しておりません。
Entra ID と OpenAM のユーザーの紐づけは、「追加の要求」部分 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name
として user.userprincipalname
を送信する部分で行っています。

要求の管理の内容
名前識別子の形式とソース属性の設定は、既定で以下内容であり変更の必要はありません。
- 名前識別子の形式 電子メールアドレス(既定)
- ソース属性
user.userprincipalname
(既定)

③SAML証明書
Entra ID(IdP) メタデータを「フェデレーション メタデータ XML」のダウンロードリンクよりダウンロードします。 ※このメタデータは加工してから OpenAM へ読み込みますので、加工内容は読み込み工程に記載しています。

Entra ID(IdP) エンタープライズアプリケーションへのユーザーとグループの割り当て
SAML 連携した OpenAM を利用できる Entra ID (ユーザー)を指定するため「ユーザーとグループの割り当て」をします。 この「割り当て」により利用の認可と、利用者の「マイアプリ」内への表示が行われます。 ※この割り当てが無い Entra ID (ユーザー)は OpenAM および連携している学認へ SSO できません。

割り当ての追加

「+ユーザーまたはグループの追加」からユーザーを追加します。

OpenAM に割り当てるユーザーにチェックし、「選択」を押します。

割り当てられたリスト OpenAM にユーザーの割り当てが行われた結果画面

これで Entra ID 管理画面側の設定は完了です。 ※まだ OpenAM への Entra ID (SAML IdP) の追加が終わっていないので「サインインのテスト」はエラーになります。

1.3. OpenAM への Entra ID(IdP) の登録
Entra ID のフェデレーションメタデータXMLの加工
Entra ID からダウンロードしたフェデレーションメタデータ XML には SAML 以外に WS-Federation のメタデータもあるため、WS-Federation 部分を削除して、OpenAM へのインポートの準備をします。
<EntityDescriptor ID="XX...>
タグの中は <IDPSSODescriptor protoco....攻略>
タグのみを残し、以下の <Signature>, <RoleDescriptor>
タグは削除します。
<Signature>
</Signature>
<RoleDescriptor xsi:type="fed:SecurityTokenServiceType" protocolSupportEnumeration="http://docs.oasis-open.org/wsfed/federation/200706">
</RoleDescriptor>
<RoleDescriptor xsi:type="fed:ApplicationServiceType" protocolSupportEnumeration="http://docs.oasis-open.org/wsfed/federation/200706">
</RoleDescriptor>
画像の黄色い網掛け部分が削除部分となります。

Entra IDをリモートアイデンティプロバイダ(IdP)として登録
OpenAM管理コンソールへログインし、該当のレルムにて「SAMLv2 プロバイダを作成」を選びます。

「リモートアイデンティティープロバイダを登録」を選びます。

加工したフェデレーションメタデータ XML をアップロードします。

XML ファイルからアイデンティティープロバイダの登録が成功すると以下の画面となりますので、「了解」を押します。

次に「連携」タブを開き登録済みの Entra ID(https://sts.windows.net/056ca7bd-xxxxx) を開きます。

「表明コンテンツ」タブの「NameID の書式」を選びます。

NameID の書式リストに urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress を追加します。

外部SAML IdPによる認証をするモジュール設定
登録した外部アイデンティープロバイダへ認証を移管するための認証モジュールを設定します。
該当のレルムの認証ーモジュールを開き「+モジュールの追加」をします。

名前は任意で「EntraID」とします。種類は「SAML2」を選択し、作成を押します。

SAML2認証モジュールの詳細画面が開きますので、必要な項目を記載します。
特に以下の項目は初期値から変更が必要となります。
IdP エンティティー ID | https://sts.windows.net/056ca7bd-xxxxxx/ |
レスポンスバインディング | HTTP-POST |
NameIDフォーマット | urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress |

認証連鎖の作成
次に作成した認証モジュールを利用する認証連鎖を作成します。 左メニューの「認証連鎖」を開き、「+認証連鎖の追加」を選び、任意の名前をつけて作成します。ここでは名前は「saml」認証連鎖とします。

saml認証連鎖の内容を編集する画面が開きますので、利用する認証モジュールを追加し条件は「Required」として「OK」を押します。

認証連鎖の内容は「entraid」認証モジュールとなり「変更の保存」を押します。

ユーザーの認証に作成した「saml 認証連鎖」を利用するために左メニューより認証ー設定メニューの「コア」タブを開き、組織認証設定を「saml」へ変更し、「変更の保存」を押します。

以上で、OpenAM の認証に Entra ID を利用する設定は完了です。
2. 動作確認
ブラウザで OpenAM のログイン URL を開くとそのまま SAML 連携した Entra ID のサインイン画面へ遷移します。

Entra ID にサインインが完了すると OpenAM のユーザープロファイル画面になります。 これで OpenAM への SAML 連携による Entra ID を利用したログインは完了です。
