ピロローグ

主に技術ネタについて書いてみる

Azure ADをIdPにしたSAMLのSPを構築してみた

SAMLを利用したSSO認証の検証をやってみたので残しておきます。
SAMLのSPを作るために、 one-login/php-saml のdemoサイトを利用しました。
PHPでは SimpleSAMLphp での構築方法がいくつかネットに載っておりますが、 php-saml での情報がほぼなかったのでチョイスしました。

前提条件

  • Azure ADを用意すること
    AzureADへのユーザ登録も忘れずに。
  • Webサーバを構築しておくこと
    今回は nginx & php-fpm環境としてます。
    Docker & ngrokで一時的に公開しやってみたのですが、うまくできなかったので、仮想サーバ上で立てました。
  • PHP実行環境 今回は7.4で試してます。
  • one-login/php-samlをダウンロードする

手順

php-samlをダウンロードする

Webサーバの公開ディレクトリ配下にダウンロードします。
今回はgit clone しました。

SPの設定を行う

demo1/settings_example.php をコピーしdemo1/settings.phpとして作成し以下の通り登録します。
idpの配下の要素は一旦空のままで。後程Azure ADで取得した値で埋めます。

<?php
$spBaseUrl = 'https://hoge.com/php-saml';  //任意のドメインに
$settingsInfo = array (
    'sp' => array (
        'entityId' => $spBaseUrl.'/demo1/metadata.php',
        'assertionConsumerService' => array (
            'url' => $spBaseUrl.'/demo1/index.php?acs',
        ),
        'singleLogoutService' => array (
            'url' => $spBaseUrl.'/demo1/index.php?sls',
        ),
        'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
    ),
    'idp' => array (
        'entityId' => '',
        'singleSignOnService' => array (
            'url' => '',
        ),
        'singleLogoutService' => array (
            'url' => '',
        ),
        'x509cert' => '', 
    ),
);

Azure ADにカスタムアプリケーションを登録する

  • Azure Portalから Azure Active Direcotry を検索し、エンタープライズアプリケーションの画面に遷移します。
    エンタープライズアプリケーション
    Portal画面
  • +独自のアプリケーションの作成 から任意のアプリケーションを登録します。
    独自のアプリケーションの作成
    独自のアプリケーションの作成

SAML構成を行う

  • 作成が完了するとエンタープライズアプリケーションのページに遷移するので、 シングルサインオン から SAML のペインをクリックします。

    demo
    demo

  • エンティティIDと応答URLをそれぞれ登録します。

    • エンティティID https://hoge.com/php-saml/demo1/metadata.php
    • 応答URL https://hoge.com/php-saml/demo1/index.php/?acs
      基本的なSAML構成
      基本的なSAML構成
  • 登録後、SAML名証明書から フェデレーション メタデータ XML をダウンロードします。 ダウンロード完了したら、エディタで開き、<X509Certificate> タグで囲まれた文字列をコピーし、前述の SPの設定を行う で作成した settings.phpx509cert の欄にペーストします。

  • 完了後、 Azure Potalに戻り demoのセットアップ に表示されている文字列を settings.php にコピペします。

    demoのセットアップ
    demoのセットアップ

    • ログイン URL singleLogoutServiceurl
    • Azure AD 識別子 entityIdurl
    • ログアウト URL singleLogoutServiceurl

ユーザ登録を行う

このままでは誰一人、デモサイトを利用できるユーザがいないので、ユーザ登録を行います。 エンタープライズ アプリケーションのページから ユーザとグループ ブレードを開き、 +ユーザまたははグループの追加 をクリックし、Azure ADに既に登録されいているユーザの中から利用させたいユーザを登録します。

ユーザ登録
ユーザ登録

動作確認

デモサイトにアクセスし、Loginをクリックします。

Demoサイト
Demoサイト

Microsoft Login画面が開くので、ここでメールアドレスとパスワード、必要に応じて二要素認証対応を行います。

認証画面

認証が無事に完了すると、以下の通り、SAMLレスポンスで受け取った値を一覧で確認できます。

認証後ページ

おわりに

構築するのに非常に苦労したのですが、いざ出来上がるとそんなに複雑ではなかったです。
これを利用すると例えば自社内で利用する独自のアプリケーション(wikiだったり、ポータルサイトなど)をAzure ADと連携させて認証させることで堅牢なシステムを作ることができそうですね。