OpenAM を活用し 学認のサービスを Entra ID で利用する


# 0. はじめに
　OpenAM14.5 では学認との連携機能を強化し、学認の IdP として運用しやすくなりました。特に、送信属性同意機能や、SP の自動登録、属性値のスクリプトによる生成など、Shibboleth IdP が持つ機能と同等の機能を強化しています。

　OpenAM は一つのバージョンを長期にサポートすることにより、バージョンアップを気にせずに長期間運用いただけます。また、ソフトウェアを RPM パッケージで提供しており、同梱の Tomcat を含めシステム全体を RPM コマンドなど O.S.と同等の Linux スキルで運用とサポートが可能な製品となっています。

![EntraID-OpenAM_html_fbb86b46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/8227956a-dd54-3ce7-0cbc-d472af7c1a87.png)


　以上のように 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 / 代理認証機能の対応により、広くクラウドサービス、オンプレミスアプリケーションの認証基盤となります。

![EntraID-OpenAM_html_d582d220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/a282f929-cc2b-0d8c-29f7-3457db1e2b5f.png)



## 0.2. Entra ID と OpenAM を連携した認証基盤の構成例

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

![EntraID-OpenAM_html_980ff28f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/12368665-3ca0-c552-efb2-9018c3d8e0d6.png)


　本ドキュメントでは、Entra ID と OpenAM を SAML 連携し、OpenAM の認証に Entra ID ユーザー認証を利用するための設定手順を解説しています。

　OpenAM を 学認IdP として構築する手順は、以下のドキュメントを公開しておりますので参考にして下さい。

　[OpenAM 学認設定ガイド](https://www.osstech.co.jp/download/updates/docs/openam/OSTD-OpenAM-GakuNinGuide.pdf)

# 1. OpenAM の認証を Entra ID で行う設定

　OpenAM では認証連鎖とよばれる機能で多要素認証を構築できますが、これを SAML を利用して Entra ID の認証が通れば認証完了とする構成を想定します。

![EntraID-OpenAM_html_64b3d692.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/3899c5d5-baa3-3680-e75c-190bf2e28085.png)


設定の流れは以下の通りです。
1. OpenAM に SAML サービスプロバイダーを作成
1. Entra ID に OpenAM をエンタープライズアプリケーションとして登録
1. 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 プロバイダの作成」を選びます。
![EntraID-OpenAM_html_e5904645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/4acfcb4e-146f-005f-efe5-8555519bee19.png)


「ホストサービスプロバイダの作成」を選びます。
![EntraID-OpenAM_html_df39a9b1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/684bca6c-185f-08d7-82c4-f3fce32fd9e9.png)


「名前」の値は現在アクセスしているURLから生成されていますが、必要であれば変更します。
トラストサークルは既存のものがあれば選択し、無い場合は、任意の文字列を指定し新規作成します。
トラストサークルは Entra ID(IdP) と OpenAM(SP) が所属できれば、名称には特に制限はありません。
※ロードバランサー経由のアクセス等で、ユーザーがアクセスするURLが、現在設定中の URL と異なる場合はベースURLを変更して設定すると、エンドポイントの URL 生成に使われるので便利です。右上の「設定」ボタンで作成されます。
![EntraID-OpenAM_html_945c97fd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/a20e800e-c7ca-cdd1-d933-9d435ac00c92.png)


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


作成が終わりましたら、上メニューの「連携」を開き、「エンティティープロバイダ」リストから作成した SP を開きます。
![EntraID-OpenAM_html_19bf2f8d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/60fe5320-9435-1dfd-bb37-d6380bec97e8.png)


「表明コンテンツ」タブの「NameID の書式」を選択します。
![EntraID-OpenAM_html_4e2472fe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/b7676351-e766-d139-3fc6-2e37916ef4f6.png)


「NameID の書式リスト」内の、```urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress``` を残して他を削除し、ページ右上又は右下の「保存」を選び設定保存します。
![EntraID-OpenAM_html_eb56bd3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/ca761b69-f526-41c5-e793-45b20688058c.png)


 次に「表明処理」タブを開き、「属性マッパー」の設定をします。
「現在の値」の「＊=＊」を削除します。
「新しい値」に　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 値はユーザーの紐づけには利用していません。

![EntraID-OpenAM_html_12a92003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/599afeac-6499-19cd-8bf4-765fb8c23fe5.png)


 次に下へスクロールし、「自動連携」の設定を以下のように設定します。
<div class="tg-wrap"><table class="tg">
<tbody>
  <tr>
    <td class="tg-hmp3">有効</td>
    <td class="tg-hmp3">チェック</td>
  </tr>
  <tr>
    <td class="tg-0lax">属性</td>
    <td class="tg-0lax">http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name</td>
  </tr>
</tbody>
</table>
</div>

ページ右上又は右下の「保存」を選び設定保存します。
![EntraID-OpenAM_html_6c77452f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/a5043264-f355-53d7-943c-e9387d83edf5.png)


　
次に「サービス」タブの一番下までスクロールし「表明コンシューマサービス」の設定をします。
![EntraID-OpenAM_html_e68b2e62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/5901c1b7-96b7-533b-0b4d-13792a32c89f.png)


表明コンシューマーサービスのデフォルト値を「HTTP-Artifact」ではなく、「HTTP-POST」にチェック入れます。


既定で入っているURLに赤字のように「<font color=red>Auth</font>」を追加して「AuthConsumer」と変更して保存します。

<div class="tg-wrap"><table class="tg">
<tbody>
  <tr>
    <td class="tg-hmp3">HTTP-POST</td>
    <td class="tg-hmp3">https://openam.example.co.jp:443/openam/Consumer/metaAlias/sp</td>
  </tr>
</tbody>
</table>


↓下のように変更

<div class="tg-wrap"><table class="tg">
<tbody>
  <tr>
    <td class="tg-hmp3">HTTP-POST</td>
    <td class="tg-hmp3">https://openam.example.co.jp:443/openam/<font color=red>Auth</font>Consumer/metaAlias/sp
 </tr>
</tbody>
</table>

※これはSAML2認証モジュールを動作させる際にのみ必要な追加設定です。
![EntraID-OpenAM_html_a9e54f4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/585179f5-a647-9280-ed97-14142764a144.png)


## 1.2. Entra ID(IdP) への OpenAM エンタープライズアプリケーションの登録

Entra ID側にSAML連携するOpenAMに作成したSAML SPをエンタープライズアプリケーションとして登録します。

「Microsoft Entra 管理センター」にログインし、「エンタープライズアプリケーション」の画面より「＋新しいアプリケーション」から追加します。
![EntraID-OpenAM_html_c28e810e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/81a8b9a4-66f2-38de-c22e-4a953f4ac0a6.png)


「Microsoft Entra ギャラリーを参照する」のリストには適用できる雛形が無いので、「独自アプリケーションの作成」をえらび、以下の値で作成します。

- アプリケーション名　　OpenAM
- ギャラリーに見つからないその他のアプリケーションを統合します（ギャラリー以外）
![EntraID-OpenAM_html_b9edfaa7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/e1049d5e-09bc-ded7-3175-5edffe4e5352.png)


アプリケーションのシングルサインオン設定を選びます。
![EntraID-OpenAM_html_1d451ab4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/6b00607a-3423-ebbe-18bc-964203529196.png)


「シングルサインオン方式の選択」では「SAML」を選びます。
![EntraID-OpenAM_html_94a91262.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/b4fe5535-506c-1a23-0a92-b3ba1b192e6d.png)

「SAMLによるシングルサインオンのセットアップ」画面が開きます。


### ①基本的な SAML 構成画面

「基本的な SAML 構成」の右の「✐ 編集」を押し、前の章で作成した OpenAM SP の情報を元に登録します。
![EntraID-OpenAM_html_620e9c9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/5533dcd6-64dd-a4b6-167e-686699ef79dc.png)


ここで OpenAM(SP)の作成で利用した以下の値をそれぞれ設定します。
<div class="tg-wrap"><table class="tg">
<tbody>
  <tr>
        <td class="tg-hmp3">識別子（エンティティID)</td>
        <td class="tg-hmp3">https://openam.example.co.jp:443/openam</td>
  </tr>
  <tr>
    <td class="tg-0lax">応答 URL(Assertion Consumer Service URL)</td>
    <td class="tg-0lax">https://openam.example.co.jp:443/openam/AuthConsumer/metaAlias/sp</td>
  </tr>
</tbody>
</table>
</div>

![EntraID-OpenAM_html_4e79c9b3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/c93b524e-a251-39ed-aaae-b9076e41b649.png)



### ②属性とクレーム

「属性とクレーム」の Entra ID から送られる「一意のユーザー識別子（名前ID）」は既定で「user.userprincipalname」となっており変更の必要はありません。

※NameID 値はユーザーの紐づけには利用しておりません。

Entra ID と OpenAM のユーザーの紐づけは、「追加の要求」部分「http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name」として user.userprincipalname を送信する部分で行っています。
![Entra-SAML-NameID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/b9c6b5bf-23da-1549-a3e0-0f0691b075c0.png)


#### 要求の管理の内容
名前識別子の形式とソース属性の設定は、既定で以下内容であり変更の必要はありません。

- 名前識別子の形式　電子メールアドレス（既定）
- ソース属性 user.userprincipalname（既定）
![Entra-SAML-Request.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/9ee00144-b68c-b14c-3aa7-62f323070fbf.png)


### ③SAML証明書
Entra ID(IdP) メタデータを「フェデレーション メタデータ XML」のダウンロードリンクよりダウンロードします。
※このメタデータは加工してから OpenAM へ読み込みますので、加工内容は読み込み工程に記載しています。
![EntraID-OpenAM_html_38aeb56e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/63288490-db5f-d953-62df-39a470d62d41.png)


### Entra ID(IdP) エンタープライズアプリケーションへのユーザーとグループの割り当て
SAML 連携した OpenAM を利用できる Entra ID （ユーザー）を指定するため「ユーザーとグループの割り当て」をします。
この「割り当て」により利用の認可と、利用者の「マイアプリ」内への表示が行われます。
※この割り当てが無い Entra ID （ユーザー）は OpenAM および連携している学認へ SSO できません。
![EntraID-OpenAM_html_4972544e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/e7e5274a-8f03-f6a4-4e88-1bd8fae666ec.png)


割り当ての追加
![EntraID-OpenAM_html_f5765902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/c1d2472d-671c-08a7-7f7e-fbb4694c8980.png)


「+ユーザーまたはグループの追加」からユーザーを追加します。
![EntraID-OpenAM_html_792e05fe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/0882b9f7-690c-07c4-f41e-39ea5b52b2ba.png)


OpenAM に割り当てるユーザーにチェックし、「選択」を押します。
![EntraID-OpenAM_html_de3c500b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/691ec9f5-3dcd-5a8b-8420-a2cbcbe7e56d.png)


割り当てられたリスト
OpenAM にユーザーの割り当てが行われた結果画面
![EntraID-OpenAM_html_769f7b9d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/800eefb4-c395-d678-f6b7-217f3951ddee.png)


これで Entra ID 管理画面側の設定は完了です。
※まだ OpenAM への Entra ID (SAML IdP) の追加が終わっていないので「サインインのテスト」はエラーになります。
![EntraID-OpenAM_html_c906fc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/001eedcf-88f5-e9c4-094b-c7b7cd4c2e09.png)


## 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>``` タグは削除します。

```xml
<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>
```

画像の黄色い網掛け部分が削除部分となります。
![EntraID-OpenAM_html_eeda4428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/0673a705-2217-ecf2-c220-bd5f5c8b2b6d.png)


### Entra IDをリモートアイデンティプロバイダ（IdP）として登録

OpenAM管理コンソールへログインし、該当のレルムにて「SAMLv2 プロバイダを作成」を選びます。
![EntraID-OpenAM_html_88b95971.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/34bf5573-44a1-b307-459f-7dd34c9a0a04.png)


「リモートアイデンティティープロバイダを登録」を選びます。
![EntraID-OpenAM_html_c02a7c96.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/09a997c4-b07a-24f7-60a1-b621ceba8e7d.png)


加工したフェデレーションメタデータ XML をアップロードします。
![EntraID-OpenAM_html_5ca0c208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/8115433e-d5d1-1778-5801-ebcdf75a928d.png)


XML ファイルからアイデンティティープロバイダの登録が成功すると以下の画面となりますので、「了解」を押します。
![EntraID-OpenAM_html_f41f7b6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/7554ddac-92ba-39d6-5cda-d0894e3ae2c6.png)


次に「連携」タブを開き登録済みの Entra ID（https://sts.windows.net/056ca7bd-xxxxx） を開きます。
![EntraID-OpenAM_html_f6b3c9d6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/25c59189-92df-e6ff-cfd0-b3c4ad98c84b.png)


「表明コンテンツ」タブの「NameID の書式」を選びます。
![EntraID-OpenAM_html_796b070b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/6534d971-4088-5205-0484-6305c4a6ea92.png)


NameID の書式リストに ```urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress``` を追加します。
![EntraID-OpenAM_html_cd33a0cf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/0cbd6bee-32cb-bc77-7e5a-471cdd8bd9a2.png)


### 外部SAML IdPによる認証をするモジュール設定
登録した外部アイデンティープロバイダへ認証を移管するための認証モジュールを設定します。

該当のレルムの認証ーモジュールを開き「＋モジュールの追加」をします。
![EntraID-OpenAM_html_38472fed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/d467dcc9-e871-23a0-13d9-0a0c9a0851b2.png)


名前は任意で「EntraID」とします。種類は「SAML2」を選択し、作成を押します。
![EntraID-OpenAM_html_73778f86.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/2e1f3344-b0b9-85a1-d7bc-71dcbd8abeae.png)


SAML2認証モジュールの詳細画面が開きますので、必要な項目を記載します。

特に以下の項目は初期値から変更が必要となります。
<div class="tg-wrap"><table class="tg">
<tbody>
  <tr>
    <td class="tg-hmp3">IdP エンティティー ID</td>
    <td class="tg-hmp3">https://sts.windows.net/056ca7bd-xxxxxx/</td>
  </tr>
  <tr>
    <td class="tg-0lax">レスポンスバインディング</td>
    <td class="tg-0lax">HTTP-POST</td>
  </tr>
  <tr>
    <td class="tg-0lax">NameIDフォーマット</td>
    <td class="tg-0lax">urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</td>
  </tr>
</tbody>
</table>
</div>



![EntraID-OpenAM_html_6651596f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/af61228b-36ea-d1ae-69bb-4f41c6da0995.png)



### 認証連鎖の作成
次に作成した認証モジュールを利用する認証連鎖を作成します。
左メニューの「認証連鎖」を開き、「＋認証連鎖の追加」を選び、任意の名前をつけて作成します。ここでは名前は「saml」認証連鎖とします。
![EntraID-OpenAM_html_c4964a8d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/43d51c73-9244-5f68-7243-9dc071bf4e52.png)


saml認証連鎖の内容を編集する画面が開きますので、利用する認証モジュールを追加し条件は「Required」として「OK」を押します。
![EntraID-OpenAM_html_6195a7a4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/f8d597d5-67ab-181f-f1c8-dc73d71563fc.png)


認証連鎖の内容は「entraid」認証モジュールとなり「変更の保存」を押します。
![EntraID-OpenAM_html_66d61792.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/7e697e45-921d-3f44-cf29-1d9a50ed7a12.png)


ユーザーの認証に作成した「saml 認証連鎖」を利用するために左メニューより認証ー設定メニューの「コア」タブを開き、組織認証設定を「saml」へ変更し、「変更の保存」を押します。
![EntraID-OpenAM_html_9f0f24c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/6aacb1f6-b3b5-6386-81da-c46517c625e6.png)


以上で、OpenAM の認証に Entra ID を利用する設定は完了です。


# 2. 動作確認
ブラウザで OpenAM のログイン URL を開くとそのまま SAML 連携した Entra ID のサインイン画面へ遷移します。
![EntraID-OpenAM_html_96ac3e63.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/ee42c719-b0af-5805-2a90-fff4b217758f.png)


Entra ID にサインインが完了すると OpenAM のユーザープロファイル画面になります。
これで OpenAM への SAML 連携による Entra ID を利用したログインは完了です。![EntraID-OpenAM_html_ccd4e302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/24b0439a-be84-59ce-d202-4cc2c77afb29.png)