Keycloakを利用したTomcatアプリケーションのSAMLによるシングルサインオン実装
Keycloakを利用したTomcatアプリケーションのSAMLによるシングルサインオン実装方法を説明する。
目次
SAMLによるシングルサインオン実装方法
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署名が使われている。
検証方法としては以下の様になっている。
- SAMLレスポンス内のReference要素をTransform Algorithmで正規化し、DigestMethod Algorithmでハッシュ化し、DigestValueと比較する。
- SignedInfo要素をCanonicalizationMethod Algorithmで正規化し、SignatureMethod Algorithmでハッシュ化し、SignatureValueと比較する。