0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LibertyとIBM Verifyで試すSAML認証 【3】仕組みの詳細を理解する

Posted at

はじめに

本記事は「LibertyとIBM Verifyで試すSAML認証」シリーズの第3回(最終回)です。LibertyとVerifyを使用したSAML認証の仕組みをより深く理解するため、設定内容を確認していきます。

【1】SAML認証とは
【2】動かして体験しよう
【3】仕組みの詳細を理解する(本記事)

Verifyの定義

アクセス履歴とSAMLアサーション

Verifyのアプリケーション一覧から、対象アプリケーションの3点メニューにある「アプリの使用量」を選択します。
qiita-square

ここで、対象アプリのログイン状況をグラフで確認できます。画面下部には各ログインの履歴が表示されます。
qiita-square

各ログインの履歴をクリックすると、クリック対象の詳細が表示されます。
ここからSAMLアサーションの「詳細の表示」リンクをクリックします。
qiita-square

SAMLアサーションに含まれる情報が表示されます。
さらに「XMLのオープン」をクリックすると、実際に送信されたSAMLアサーションのXMLデータが表示されます。
qiita-square

この例では、SAMLアサーションにgroupIdsとして3つのグループが含まれ、そのうち1つがgroup1であることが分かります。

認証後のアプリケーション挙動が期待通りでない場合、まずSAMLアサーションの内容が想定通りか確認しましょう。

アプリケーション定義

Verifyのアプリケーション一覧から、対象アプリケーションの設定(歯車アイコン)を開きます。サインオンタブには以下の項目があります。

項目 説明
サービス・プロバイダーの固有ID IdP側でSPを一意に識別するためのID。
SPメタデータから設定。
SAMLアサーションを受信するサービス・プロバイダー・エンドポイント SPがアサーションを受信するURL。
SPメタデータから設定。
ターゲットURL 認証成功後に遷移するSPの入口URL。
サービス・プロバイダーのSSO URL 上記サービス・プロバイダー・エンドポイントと同じ値を設定。
属性マッピング SAMLアサーションに含める属性を指定。「すべての既知のユーザー属性を送信」をONにすると、取得可能な属性がすべて含まれる。

詳細は公式ドキュメントを参照してください。

Libertyの定義

server.xml

server.xmlはLibertyのプラットフォーム設定を定義します。

<featureManager>
    <feature>pages-3.1</feature>
    <feature>samlWeb-2.0</feature>
</featureManager>
  • pages-3.1:JSPページを動かすための機能
  • samlWeb-2.0:SAML認証を有効化する機能

SAML設定は以下の通りです。

<samlWebSso20
    id="defaultSP"
    idpMetadata="${server.config.dir}/federation_metadata.xml"
    groupIdentifier="groupIds"
/>
  • idpMetadata:IdPから取得したメタデータファイルのパス
  • groupIdentifier:SAMLアサーション内でグループ情報を示す属性名(例:groupIds)

上で記載したSAMLアサーションの例では、groupIdsに3つのグループが含まれています。
qiita-square


後述するセキュリティロールと、グループとの関連付けを指定します。

<application-bnd>
    <security-role name="ALL_USER">
        <group access-id="group1" />
        <group access-id="group2" />
    </security-role>
    <security-role name="PRIVILEGED_USER">
        <group access-id="group2" />
    </security-role>
</application-bnd>

ALL_USERというロールには、group1またはgroup2というグループ、PRIVILEGED_USERというロールには、group2というグループが該当すると認識されます。
ここでのグループは、groupIdentifierの定義に基づきSAMLアサーションのgroupIdsを参照します。

web.xml

web.xmlはアプリケーション設定を定義します。

<security-role>
    <role-name>ALL_USER</role-name>
</security-role>
<security-role>
    <role-name>PRIVILEGED_USER</role-name>
</security-role>

アプリケーション機能に認可を与えるセキュリティロールを定義します。
ここでは、「ALL_USER」「PRIVILEGED_USER」という2種類のロールを定義しています。
ログインユーザーがどのロールに該当するかは、server.xmlのapplication-bndに定義された関連付けによって決定されます。


<security-constraint>
    <web-resource-collection>
        <web-resource-name>normal_page</web-resource-name>
        <url-pattern>/hello.jsp</url-pattern>
        <url-pattern>/hello1.jsp</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>ALL_USER</role-name>
    </auth-constraint>
</security-constraint>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>priviledged_page</web-resource-name>
        <url-pattern>/hello2.jsp</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>PRIVILEGED_USER</role-name>
    </auth-constraint>
</security-constraint>

リクエストのURLを基準に、そのリクエストはどのロールに許可されているかを定義しています。


今回の構成では、認証・認可をXML定義のみで実現しており、アプリケーションコードには全く触れていない点が特徴的です。

ただ認可の定義をコードに近い部分で定義したほうが実装しやすいと判断する場合には、@ServletSecurityアノテーションを使用してコード上に直接指定する方法もあります。
その他、アプリケーションの全範囲を一律の認証対象として指定し、認可部分はアプリケーション内で実装するという設計も考えられます。

どのような実装を選択するかは、各種要件を鑑みて検討する必要があるでしょう。

おわりに

SAML認証の仕組みと実現方法について、サンプルを使いながら確認しました。実際に動かして体験することが理解への早道と考えます。
今回紹介したのはSAMLの一部機能に過ぎません。要件に応じて、接続方式や属性の扱いを検討してください。
本記事がSAML認証導入の第一歩となれば幸いです。

参考

WebSphere Liberty SAML Web SSO 構成ガイド

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?