【SAML認証】SimpleSAMLphpを試す(Microsoft Entra編)

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【SAML認証】SimpleSAMLphpを試す(Microsoft Entra編)

2023-12-13 | , ,

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

手順書

  1. SimpleSAMLphpのインストールする手順は下記の記事のような感じで済ませておく。
  2. Microsoftのアカウントにログインしてる状態で[https://entra.microsoft.com](https://entra.microsoft.com)/にアクセスする。
  3. 左のメニューの「アプリケーション」->「エンタープライズ アプリケーション」を開いて、「新しいアプリケーション」をクリックする。
  4. 「独自のアプリケーションの作成」をクリックする。
  5. 「お使いのアプリの名前は何ですか?」に「アプリの名前」を入力する。この記事ではsimplesamlphpとした。
    「アプリケーションでどのような操作を行いたいですか?」は「ギャラリーに見つからないその他のアプリケーションを統合します(ギャラリー以外)」を選択する。
    「作成」をクリックする。
  6. 「2。シングル サインオンの設定」をクリックする。
  7. 「SAML」をクリックする。
  8. 「SAML証明書」の中の「トークン署名証明書」の「編集」をクリックする。
  9. 「署名オプション」は「SAMLアサーションへの著名」を選択する。
    「署名アルゴリズム」は「SHA-256」を選択する。
    通知の電子メールアドレスにはログインしてるメールアドレスを入力する。(メアドなら何でも良い)
    「保存」をクリックする。
  10. 「SAML証明書」の中の「フェデレーション メタデータ XML」の「ダウンロード」をクリックして、simplesamlphp.xmlをダウンロードする。このxmlファイルは後ほどSimpleSAMLphpで使う。後ほど、また戻ってこちらでも設定をするのでページは閉じないでおく。
  11. SimpleSAMLphpの管理画面にアクセスする。「連携」を開き、「ツール」の中にある「XMLをSimpleSAMLphpメタデータに変換」をクリックする。
  12. 「~ or select a file」をクリックして、先ほどダウンロードしたsimplesamlphp.xmlを選択する。「パース」をクリックする。
  13. 下に「変換されたメタデータ」が表示されるので、内容を全てコピーする。右上のアイコンをクリックしてもコピーできる。
  14. /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',
        ],
    ],
    ...
    ];

    entityidhttps://sts.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/という感じの値は次の手順で使うのでコピーしておく。

  15. /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.phpentityidの値を入力する。

  16. 再びSimpleSAMLphpの管理画面の「連携」を開くと「Hosted entities」の中に先ほど入力したentityidの値の項目が増えてるので折りたたみを開く。

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

    「基本的なSAML構成」の中の「編集」をクリックする。
  18. 「識別子(エンティティID)」には/var/www/simplesamlphp/config/authsources.phpentityIDの値を入力する。この記事の例ではhttps://example.com/simplesamlphp/となる。
    「応答URL(Assertion Consumer Service URL)」にmd:AssertionConsumerServiceLocationの値を入力する。https://example.com/simplesamlphp/public/module.php/saml/sp/saml2-acs.php/microsoft-entraのような感じ。
    「保存」をクリックする。
  19. 「ユーザーとグループ」->「ユーザーまたはグループの追加」をクリックする。
  20. 「User」をクリックする。
  21. 自分のメールアドレスが表示されてるのでチェックを入れて「選択」をクリックする。
  22. 「ユーザー」に「1人のユーザーが選択されました。」と表示されてるのを確認する。「割り当て」をクリックする。
  23. 「シングル サインオン」の中の「simplesamlphpでシングルサインオンをTest」の「Test」をクリックする。
  24. 「サインインのテスト」をクリックしてSimpleSAMLphpをインストールしてるサーバー(何も設定をしなければexample.comのトップページ)が表示されればSAML認証に成功してる。
  25. SimpleSAMLphpからもテストする。管理画面にログインして「連携」を開き、「Test Authentication Sources」の中にある「microsoft-entra(/var/www/simplesamlphp/config/authsources.php`に入力した名前が表示される)」をクリックする。
  26. 下図のようにアカウントのメールアドレスや名前が表示されてれば、正常にSAML認証できてる。

お疲れさまでした。

まとめ(感想文)

こちらはもっと手順が長い!

テストが上手くいかない場合は、下記をチェックしてみる。Google Workspaceと確認するところは同じ感じ。

  • Microsoft Entra側の設定で「応答URL(Assertion Consumer Service URL)」が正しいか?(simpleSAMLphpの「連携」の「Hosted entities」のmd:AssertionConsumerServiceLocationの値)
  • Microsoft Entra側の「識別子(エンティティID)」とsimpleSAMLphpの/var/www/simplesamlphp/config/authsources.phpentityIDに同じ値が入力されてるか?

「Google Workspace」と「Microsoft Entra」の両方でSAML認証を試してみるとSAML認証の一連の流れを理解しやすくなると思われ。

SAML認証に触れる必要があるのであれば、simpleSAMLphpでテストしてみても良いかもね?!