※この記事は、私が以前に投稿した「既存の独自アプリを変更せずSSOを実装する-1 SAML基本編」「既存の独自アプリを変更せずSSOを実装する-2 SAML×Linux編」の続きの記事となります。
今回は、Windows上で動作する独自Webアプリに対して、Entra IDを使ったSSO実装を行ってみます。
SAMLの実装は「Shibboleth SP for IIS」というものを使用します。
前提条件
事前に、以下の条件が満たされている前提とします。
- WebアプリはIISがホストしている
- SSH接続が構成済みである
なお、WebアプリはシンプルなHTMLページで代用します。SSOを経て以下の画面が表示される事をゴールとします。
実装
IIS側でのサイトバインド
1.事前に、IISのSSOを実装するWebサイトにて、ホスト名・IPアドレス・ポートの設定を明示的に行っておきます。
単一のWebアプリのみ稼働させている場合はあまり意識する必要はありませんが、複数のWebアプリやWebサイトが稼働している場合は、これらを明示的に設定する事をお勧めいたします。
Shibboleth SP for IISのインストール
1.下記サイトの「latest/」から、Shibboleth SP for IISのインストーラーをダウンロードします。
Index of /downloads/service-provider (shibboleth.net)*1
今回はWindows Serverのため、「Win64」ディレクトリの中にあるmsiファイルをダウンロードします。
2.取得したインストーラーを実行し、「Next」をクリックしてインストールを行います。以下の「Configure IIS Support」のみチェックを付与し、他は既定値で進めます。
インストールが完了したら「Finish」をクリックして終了です。この後、OSの再起動を促されますので再起動を行います。
3.インストールが終わりましたら、インストール先のディレクトリに対してアクセス権を付与します。今回は「C:\Opt\shibboleth-sp\」に「IIS_IUSRS」に対して、「フル コントロール」のアクセス権を付与します。
Entra IDにてアプリの登録~SSO設定
1.Entra IDに連携するメタデータを取得します。Shibbolethをインストールしたサーバーにて以下のアドレスを入力すると、ブラウザから「Metadata」というファイルを取得できます。
「https://(サーバー名(FQDN))\Shibboleth.sso/Metadata」(大文字小文字が区別されます)
このファイルは、後続のEntra IDにおけるアプリ登録にて使用します。
2.Entra IDの管理センターに接続し、「アプリケーション」>「エンタープライズアプリケーション」>「新しいアプリケーション」>「独自のアプリケーションの作成」に進み、アプリケーション名を設定して「作成」をクリックします。
3.作成されたアプリの「シングル サインオン」>「SAML」に進み、「メタデータ ファイルをアップロードする」から、先程ダウンロードしたxmlファイルを指定して「追加」をクリックします。
4.「識別子(エンティティ ID)」と「応答 URL (Assertion Consumer Service URL)」の値が入力された事を確認し、「保存」をクリックします。
保存後、「×」で画面を閉じると以下のように表示されますが、「いいえ、後でtestします」をクリックします。
5.戻った画面を下にスクロールすると「SAML証明書」の項目がありますので、そこから「フェデレーション メタデータ URL」の「ダウンロード」をクリックします。
※ 先程、Shibboleth側で取得してEntra IDにアップデートしたのはSPのメタデータとなり、こちらのファイルはIdPのメタデータとなります。これらのメタデータを互いに持ち合い情報連携を行う、と考えるとイメージしやすいです。
Shibboleth SP for IISの構成
1.Shibbolethサーバーの構成を行います。Shibbolethをインストールしたディレクトリの「etc」>「shibboleth」内に「shibboleth2.xml」というShibbolethの設定ファイルがありますので、こちらを編集します。
2.:先程IdPからダウンロードしたメタデータファイル内に「entityID=https://sts.windows.net/(EntityID値)/"という記載があるので、このEntityIDを控えておきます。
3.インストールした時点ではサンプル値が設定されているので、これらの値を編集します。
※以下に記載するのはあくまで一例となりますので、具体的な設定についてはSSOを実装させたいアプリや要件に合わせて設定内容をご検討ください。構成の詳細やその他のオプションについては参考情報をご参照ください。
※編集例の読み方について:文頭に[-]とされているのが構成ファイルの原文(サンプル値)となります。 [+]の内容で[-]の内容を置き換えます。 ================================================ <InProcess> -<Site id="1" name="sp.example.org"/> +<Site id="1" name="(サーバー名を入力)"/> ※IISのWebサイトのIDとホスト名を記入します。 <RequestMap> -<Host name="sp.example.org"> -<Path name="secure" authType="shibboleth" requireSession="true"/> -</Host> +<Host name="(サーバー名を入力)" authType="shibboleth" requireSession="true"/> ※ホスト名を入力し、複数行に跨った情報を一つに纏めます。Path name="secure"は削除します。 <Application Defaults> -<ApplicationDefaults entityID="https://sp.example.org/shibboleth" +<ApplicationDefaults entityID="https://(サーバー名を入力)/shibboleth" ※サーバーのFQDNを指定します。(インターネット的にユニークであればOKです) -REMOTE_USER="eppn subject-id pairwise-id persistent-id" +REMOTE_USER="persistent-id nameid-unspecified nameid-emailAddress nameid-WindowsDomainQualifiedName" cipherSuites="DEFAULT:!EXP:!LOW:!aNULL:!eNULL:!DES:!IDEA:!SEED:!RC4:!3DES:!kRSA:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1"> ※後述の追加属性をREMOTE_USERのソースとして指定できるようにします。また、接続時のサポートするTLS暗号を指定します。 <Sessions> -<SSO entityID="https://idp.example.org/idp/shibboleth" +<SSO entityID="https://sts.windows.net/(EntityID値)/" ※手順2で控えたEntraIDを記載します。 <MetadataProvider> +<MetadataProvider type="XML" validate="true" path="Test_Shibboleth_01.xml"/> ※EntraIDのフェデレーション メタデータ XMLからDLしたメタデータファイル名を指定します。 こちらの記載通り、後の手順にてメタデータファイルをShibboleth2.xmlと同じディレクトリにも配置します。
4.次に「attribute-map.xml」というファイルを編集します。こちらは、IdPからアプリケーションに連携できる属性を管理するファイルとなります。Entra IDをIdPとする際に連携出来た方が良い属性を追加しておきます。
<The SAML 2.0 NameID Format> +<Attribute name="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" id="nameid-unspecified"/> +<Attribute name="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" id="nameid-emailAddress"/> +<Attribute name="urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName" id="nameid-WindowsDomainQualifiedName"/>
5.「Entra IDにてアプリの登録~SSO設定」の項番5で取得したIdPのメタデータを、「Shibboleth2.xml」や「attribute-map.xml」が配置されているフォルダにコピーします。
※「Shibboleth2.xml」内の「<MetadataProvider>」で別の場所を指定している場合は、そちらに合わせて配置してください
6.設定が終わりましたので、最後にShibbolethとIISのサービスを再起動し、IISマネージャーからWebサイトの再起動を行います。
※ なお、環境的にIISのサービス再起動が難しい場合は、対象のWebサイトの再起動でも問題ありません。
動作確認
1.ブラウザからアプリに接続し、SSOが機能するかどうかを確認します。認証局を使用しない自己署名証明書を使用している場合は以下の様な警告が表示されますが、続行します。
2.認証画面が表示されますので、認証情報を入力します。
3.無事にWebページが表示されました。
4.EntraID側では、認証が行われたタイミングで「成功」と「中断」のログが2件表示されます。
Assertionの確認
1.SAMLのAssertionは、Webページ表示の際にブラウザのデバッグを行う事で確認できます。ChromeとEdgeにはF12で呼び出せるDevToolsがありますので、今回はこれを利用します。(本記事ではEdgeのDevToolsを使用します。)
2.右上の「ネットワーク」をクリックしてから、SSOを実行していきます。
ページを読み込んでいくとDevTools側でブラウザの処理内容が表示されていき、最終的に「POST」という項目が表示されますのでクリックします。
3.クリック後、「ペイロード」をクリックするとAssertionの中身が取得できます。値は右クリックでクリップボードにコピーできます。
この値はBase64形式でエンコードされていますので、値をデコードする必要があります。デコードにはMicrosoft Storeから取得できる「DevToys」を使用します。
ツールをインストール後、Base64(テキスト)を選択し、デコード状態で貼り付けをクリックすれば、瞬時に値をデコードしてくれます。Assertionは文の後半に記載されています。
まとめ
実施した内容の概要を整理して終わりにしたいと思います。
- IISのサイトバインド設定
- IIS用のSAML対応モジュール「Shibboleth SP for IIS」をダウンロードしインストール
- ShibbolethサーバーのIIS用アクセス権の設定
- SP用メタデータのダウンロード
- Entra IDにてアプリを登録しSPのメタデータをアップロード
- Entra IDにてIdPのメタデータをダウンロードし、Shibbolethサーバーに配置
- Shibbolethの設定ファイルにてIIS/SP/IdPの情報を設定
- 構成チェックとサービス再起動を行った後にSSO動作テストを実施
参考情報
- Service Provider 3 - Confluence (atlassian.net)
- SPConfig - Service Provider 3 - Confluence (atlassian.net)
*1:2024年7月時点での取得先です