CONTACT
お問い合わせ

Keycloakを利用したTomcatアプリケーションのSAMLによるシングルサインオン実装

Keycloakを利用したTomcatアプリケーションのSAMLによるシングルサインオン実装方法を説明する。

目次

SAMLによるシングルサインオン実装方法

  1. 概要
  2. 前提
  3. 認証フロー
  4. 環境構築設定手順
  5. 動作確認
  6. 動作詳細確認
  7. SAMLレスポンスの生成と検証について
  8. XML署名の検証について

1.概要

Keycloakを用いたTomcatアプリケーションのSAML(Security Assertion Markup Language)によるシングルサインオン(SSO)の動作に関する説明である。
KeycloakとはRed Hatが開発したオープンソースソフトウェア(OSS)であり、SSOや認証・認可を行うアイデンティティアクセス管理ソフトウェアである。
  ◎ KEYCLOAK
SAMLとはIDP(Identity Provider)での認証結果やユーザ情報をXML形式のアサーションとしてSP(Service Provider)に連携することでSSO環境を実現する仕組みである。

2.前提

Keycloakはインストール済み、ユーザ作成済みとする
TomcatアプリケーションとしてSpring Security SAMLプロジェクトのサンプルアプリケーションを利用する
  ◎ 4. Quick start guide

3.認証フロー

以下、Keycloakを用いたSAMLによるSSOに関する認証フロー図である。
IDPにログインするとアサーションが生成されてSPにログインできることがわかる。

4.環境構築設定手順

1.SP(WebAP)のsecurityContext.xmlの修正

a.IDPメタデータの取得URL
アプリケーションは起動時にIDPのメタデータを取得する動きをする。
そのためsecurityContext.xmlにIDPのメタデータ取得URLを設定する。
\sample\src\main\webapp\WEB-INF\securityContext.xml(L166)

<!-- URL containing the metadata -->
<constructor-arg>
  <value type="java.lang.String">http://192.168.3.92:8180/auth/realms/a-frontier/protocol/saml/descriptor</value>
</constructor-arg>

b.エンティティIDの設定
使用するエンティティID(任意の値)を定義する。
\sample\src\main\webapp\WEB-INF\securityContext.xml(L118)

<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
  <property name="entityId" value="a-frontier:sso"/>
  <property name="extendedMetadata">

2.SP(WebAP)のspring_saml_metadata.xmlの取得

IDPへメタデータを連携するためのspring_saml_metadata.xmlファイルを取得する。


a.ビルド
コマンドプロンプトで\sampleフォルダに移動し下記コマンドを実行する。

mvn package

C:\Users\share\Desktop\spring-security-saml-1.0.3.RELEASE\sample>mvn package

以下が出力されれば完了

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------


b.デプロイ
下記コマンドを実行する。

mvn tomcat7:run

C:\Users\share\Desktop\spring-security-saml-1.0.3.RELEASE\sample>mvn tomcat7:run

以下の様に出力されれば完了

8 29, 2019 1:58:06 午後 org.apache.coyote.AbstractProtocol start
情報: Starting ProtocolHandler ["http-bio-8080"]


c.ファイル取得
以下にアクセスするとspring_saml_metadata.xmlがダウンロードできる。
  ◎ http://localhost:8080/spring-security-saml2-sample/saml/metadata

3.Keycloakにspring_saml_metadata.xmlをインポート

Keycloakに2.でダウンロードしたファイルをインポートしクライアントを作成する。

a.任意のレルムで「クライアント」→「作成」押下

b.「ファイルを選択」→spring_saml_metadata.xmlを選択

c.「保存」押下

d.作成されたクライアントの各URLを”localhost”からIP指定に修正する。

以上で環境構築設定が完了。

5.動作確認

1.クライアント端末がドメインに参加していることを確認

WebAPにアクセスするとSSO開始画面が表示される。(認証フロー画面A)
URL http://192.168.3.105:8080/spring-security-saml2-sample/

2.IDPのアドレスを選択し「Start single sign-on」を押下。(認証フロー③)

3.Keycloakの認証画面(認証フロー画面B)が表示されるのでユーザIDとパスワードを入力し「Log In」を押下。(認証フロー⑭)

4.ログイン後画面が表示される(認証フロー画面C)

6.動作詳細確認

1.クライアント端末でWiresharkを起動しパケット確認

左の〇番号が認証フロー図と対応したパケットである。

2.SAMLリクエスト確認

認証フロー⑥でSAMLリクエストが”hidden”値として連携され、認証フロー⑧でIDPにPOSTしていることがわかる。

3.SAMLレスポンス確認

認証フロー⑰でSAMLレスポンスが”hidden”値として連携され、認証フロー⑲でSPにPOSTしていることがわかる。

4.SAMLレスポンスの中身確認

下記サイトにSAMLレスポンスを張り付けると中身をXML形式で確認できる。
  ◎ SAML TOKEN


以下レスポンスの中身の抜粋
“StatusCode”に”urn:oasis:names:tc:SAML:2.0:status:Success”と入っており、ログインに成功していることがわかる。

7.SAMLレスポンスの生成と検証について

認証フロー⑯にもあるようにアサーションは共通鍵で暗号化されている。
またその共通鍵を公開鍵で暗号化し連携している。
そのため、SAMLレスポンスの検証(認証フロー⑳)には秘密鍵で共通鍵を復号、復号した共通鍵でアサーションを復号という二段階の復号が必要になる。

【SAMLレスポンス生成】(認証フロー⑯)

【SAMLレスポンス検証】(認証フロー⑳)

8.XML署名の検証について

改ざん防止のためXML署名が使われている。
検証方法としては以下の様になっている。

  1. SAMLレスポンス内のReference要素をTransform Algorithmで正規化し、DigestMethod Algorithmでハッシュ化し、DigestValueと比較する。
  2. SignedInfo要素をCanonicalizationMethod Algorithmで正規化し、SignatureMethod Algorithmでハッシュ化し、SignatureValueと比較する。