【SAML認証】SimpleSAMLphpを試す(Microsoft Entra編)
SimpleSAMLphpをSP、Microsoft EntraをIDPとしてSAML認証したい!
概要
今回の記事では、SimpleSAMLphpをSP、Microsoft EntraをIDPとしてSAML認証する手順を掲載する。
SimpleSAMLphpのインストールする手順は下記の記事に載せてる。
Google Workspaceに続いて、今回はMicrosoft EntraでもSAML認証してみる。
Google Workspaceの場合は、無料のGmailアカウントではSAML認証できなかったんだけども、Microsoft Entraでは無料の「live」や「hotmail」などの個人アカウントでもSAML認証できる。その場合は組織のアカウントではないので自分1人用のSAML認証ってことになる。無料で試せるのはめちゃくちゃありがたい。
仕様書
環境
- Ubuntu 20.04.4 LTS
- Apache 2.4.41
- PHP 8.0.30
- SimpleSAMLphp 2.1.1
手順書
- SimpleSAMLphpのインストールする手順は下記の記事のような感じで済ませておく。
- Microsoftのアカウントにログインしてる状態で
[https://entra.microsoft.com](https://entra.microsoft.com)/にアクセスする。 - 左のメニューの「アプリケーション」->「エンタープライズ アプリケーション」を開いて、「新しいアプリケーション」をクリックする。

- 「独自のアプリケーションの作成」をクリックする。

- 「お使いのアプリの名前は何ですか?」に「アプリの名前」を入力する。この記事では
simplesamlphpとした。
「アプリケーションでどのような操作を行いたいですか?」は「ギャラリーに見つからないその他のアプリケーションを統合します(ギャラリー以外)」を選択する。
「作成」をクリックする。

- 「2。シングル サインオンの設定」をクリックする。

- 「SAML」をクリックする。

- 「SAML証明書」の中の「トークン署名証明書」の「編集」をクリックする。

- 「署名オプション」は「SAMLアサーションへの著名」を選択する。
「署名アルゴリズム」は「SHA-256」を選択する。
通知の電子メールアドレスにはログインしてるメールアドレスを入力する。(メアドなら何でも良い)
「保存」をクリックする。

- 「SAML証明書」の中の「フェデレーション メタデータ XML」の「ダウンロード」をクリックして、
simplesamlphp.xmlをダウンロードする。このxmlファイルは後ほどSimpleSAMLphpで使う。後ほど、また戻ってこちらでも設定をするのでページは閉じないでおく。

- SimpleSAMLphpの管理画面にアクセスする。「連携」を開き、「ツール」の中にある「XMLをSimpleSAMLphpメタデータに変換」をクリックする。

- 「~ or select a file」をクリックして、先ほどダウンロードした
simplesamlphp.xmlを選択する。「パース」をクリックする。

- 下に「変換されたメタデータ」が表示されるので、内容を全てコピーする。右上のアイコンをクリックしてもコピーできる。

/var/www/simplesamlphp/metadata/saml20-idp-remote.phpに先ほどコピーした内容を丸ごとペーストする。<?php // 以下にコピペする(一部抜粋 $metadata['https://sts.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/'] = [ 'entityid' => 'https://sts.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/', 'contacts' => [], 'metadata-set' => 'saml20-idp-remote', 'SingleSignOnService' => [ [ 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 'Location' => 'https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/saml2', ], [ 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', 'Location' => 'https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/saml2', ], ], 'SingleLogoutService' => [ [ 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 'Location' => 'https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/saml2', ], ], ... ];entityidのhttps://sts.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/という感じの値は次の手順で使うのでコピーしておく。/var/www/simplesamlphp/config/authsources.phpを開き、Microsoft Entra用の設定を追加する。'microsoft-entra' => [ 'saml:SP', 'entityID' => 'https://example.com/simplesamlphp/', 'idp' => 'https://sts.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/', 'discoURL' => null, 'name' => [ 'en' => 'A service microsoft-entra', 'no' => 'En tjeneste microsoft-entra', ], 'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent', 'simplesaml.nameidattribute' => 'eduPersonTargetedID', ],entityIDの値は、Microsoft Entra側の設定でも使う共通のユニークIDになるので覚えておく。記事中ではURL形式にしてるが、URL形式でなくても良い。
'idp'の値は、先程コピーしたsaml20-idp-remote.phpのentityidの値を入力する。- 再びSimpleSAMLphpの管理画面の「連携」を開くと「Hosted entities」の中に先ほど入力した
entityidの値の項目が増えてるので折りたたみを開く。

この中にmd:AssertionConsumerServiceというタグがあるので、その中にある属性Locationの値をMicrosoft Entraで使うのでこちらも覚えておく。 - Microsoft Entraの設定画面に戻る。

「基本的なSAML構成」の中の「編集」をクリックする。 - 「識別子(エンティティID)」には
/var/www/simplesamlphp/config/authsources.phpのentityIDの値を入力する。この記事の例ではhttps://example.com/simplesamlphp/となる。
「応答URL(Assertion Consumer Service URL)」にmd:AssertionConsumerServiceのLocationの値を入力する。https://example.com/simplesamlphp/public/module.php/saml/sp/saml2-acs.php/microsoft-entraのような感じ。
「保存」をクリックする。

- 「ユーザーとグループ」->「ユーザーまたはグループの追加」をクリックする。

- 「User」をクリックする。

- 自分のメールアドレスが表示されてるのでチェックを入れて「選択」をクリックする。

- 「ユーザー」に「1人のユーザーが選択されました。」と表示されてるのを確認する。「割り当て」をクリックする。

- 「シングル サインオン」の中の「simplesamlphpでシングルサインオンをTest」の「Test」をクリックする。

- 「サインインのテスト」をクリックしてSimpleSAMLphpをインストールしてるサーバー(何も設定をしなければ
example.comのトップページ)が表示されればSAML認証に成功してる。

- SimpleSAMLphpからもテストする。管理画面にログインして「連携」を開き、「Test Authentication Sources」の中にある「microsoft-entra(/var/www/simplesamlphp/config/authsources.php`に入力した名前が表示される)」をクリックする。

- 下図のようにアカウントのメールアドレスや名前が表示されてれば、正常にSAML認証できてる。

お疲れさまでした。
まとめ(感想文)
こちらはもっと手順が長い!
テストが上手くいかない場合は、下記をチェックしてみる。Google Workspaceと確認するところは同じ感じ。
- Microsoft Entra側の設定で「応答URL(Assertion Consumer Service URL)」が正しいか?(simpleSAMLphpの「連携」の「Hosted entities」の
md:AssertionConsumerServiceのLocationの値) - Microsoft Entra側の「識別子(エンティティID)」とsimpleSAMLphpの
/var/www/simplesamlphp/config/authsources.phpのentityIDに同じ値が入力されてるか?
「Google Workspace」と「Microsoft Entra」の両方でSAML認証を試してみるとSAML認証の一連の流れを理解しやすくなると思われ。
SAML認証に触れる必要があるのであれば、simpleSAMLphpでテストしてみても良いかもね?!
