HOME > 技術レポート > セキュリティ > Keycloakを利用したTomcatアプリケーションのSAMLによるシングルサインオン実装

2019年10月18日

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

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

1.概要

Keycloakを用いたTomcatアプリケーションのSAML(Security Assertion Markup Language)によるシングルサインオン(SSO)の動作に関する説明である。
KeycloakとはRed Hatが開発したオープンソースソフトウェア(OSS)であり、SSOや認証・認可を行うアイデンティティアクセス管理ソフトウェアである。

SAMLとはIDP(Identity Provider)での認証結果やユーザ情報をXML形式のアサーションとしてSP(Service Provider)に連携することでSSO環境を実現する仕組みである。

2.前提

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

3.認証フロー

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

フロー図.PNG

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.任意のレルムで「クライアント」→「作成」押下

クライアント1.png


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

クライアント2.PNG

c.「保存」押下

クライアント3.PNG


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

クライアント4.PNG



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

5.動作確認

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

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


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

画面2.PNG


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

画面3.PNG


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

画面4.PNG

6.動作詳細確認

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

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


2.SAMLリクエスト確認

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

SAMLリクエスト2.PNG

3.SAMLレスポンス確認

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

SAMLレスポンス2.PNG

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

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


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

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

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

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

IDP.PNG

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

SP.PNG

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

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

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