【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でテストしてみても良いかもね?!