4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Keycloak とフェデレーションして Deep Data Security を使う

4
Last updated at Posted at 2026-07-09

はじめに

前回の記事では、Deep Data Security を OCI IAM と連携させて、MCP Server からの SQL 問い合わせ結果に制限をかけました。

現在 Deep Data Security が対応している IdP は OCI IAM と Entra ID のみです。だからといって それ以外の IdP が使えない訳ではないです。
今回は、OCI IAM から Keycloak を IdP にしたフェデレーションを設定して、前回と同じ MCP Server に SQL クエリをかけてみたいと思います。

OIDC or SAML ??

OCI IAM と Keycloak のフェデレーションは、OIDC (OpenID Connect) でも SAML (Security Assertion Markup Language) でも実現できます。

既に(&常に) OCI IAM と Keycloak の両方に同一ユーザーがプロビジョニングされている状態で、認証作業だけ Keycloak に任せるのであれば、どちらを使ってもそれほど差異はありません。

一方、Just-In-Time (JIT)プロビジョニング(Keycloak にはユーザーが登録されていて、OCI IAM にはユーザーが登録されていない状態で、Keycloak での認証完了後に OCI IAM のユーザーをその場で新規登録する)を行なうのであれば、SAML が現実的な手段です。Deep Data Security の DATA ROLE は IAM のグループとマッピングされるので、IdP (Keycloak) のグループ情報がうまく IAM に連携される必要があります。SAML フェデレーションであれば「Keycloak のこのグループは IAM のこのグループにマッピング」というようなルールを設定できますが、OIDC のフェデレーションでは、JIT プロビジョニングでグループのマッピングが自由に行えません。

フェデレーション OCI IAM における JITプロビジョニング時のマッピング
OIDC 単一のグループにマッピングすることのみ可能
SAML IdPのグループとIAMのグループをマッピングすることが可能

Aさんは employees グループ、B さんは managers グループ、といった Keycloakで設定されている情報を Just-In-Time で IAM に反映させるには、SAML フェデレーションが必須となります。

ということで、今回は SAML フェデレーションを設定します。
全体像はこのようになります。

image.png

SAML フェデレーションを設定する

1. OCI IAM側: SP メタデータの取得

Keycloak側でOCI IAMをSPとして登録する際、OCI IAMのSPメタデータが必要です。

コンソールで、ドメインの「フェデレーション」のタブから「SAMLメタデータのエクスポート」をクリックします。

image.png

メタデータ・ファイルの「XMLのダウンロード」をクリックして、XMLファイルをダウンロードして下さい。次のステップで使用します。

image.png

2. Keycloak側: OCI IAM を SP として登録する

  1. realmの選択/作成
    連携用の realm を選択または新規作成します。
    (ここでは mcp-realm)
     

  2. ユーザー/グループ作成
    OCI IAM とフェデレーションをテストするため、ユーザーを2つ作成します。
    ひとつは、前回の記事で登場した 既に OCI IAM に存在する sking、もうひとつは OCI IAM には存在しない dlee です。

    設定項目 ユーザー #1 ユーザー #2
    username sking dlee
    firstName Steven David
    lastName King Lee
    email sking@example.com dlee@example.com

    ユーザーを作成したら、グループ employees を作成し、skingdlee をメンバーに加えます。
     

  3. Clientの追加(=SAML SP登録
    「Clients」メニューから「Import Clients」を選び、先ほど OCI IAM からダウンロードしたメタデータファイルをインポートします。

    image.png

    これにより Client ID が自動的に OCI IAM の Issuer に設定され、プロトコルも SAML に自動設定されます。 - 長いからって Clien ID は絶対に変えちゃダメ
    Encrypt assertions は、Off にしておきましょう。フェデレーションの通信は HTTPS で行われるので不要なのと、デバッグする時に便利です(SAML をトレースする Chrome 拡張機能を使って SAML アサーションを確認できます)。
     

  4. 属性マッパーの追加
    SAML アサーション (ユーザーの認証情報や属性が記述されたXML形式のデータ) に埋め込む属性(Atrributes)を設定します。後の工程で OCI IAM はこの属性を使って、ユーザー/グループのマッピングを行います。

    Client の画面に Client scopes というタブあるので、開くと
    <Client ID>-dedicated
    という名前の scope があらかじめアサインされていますので、これに属性のマッピングを追加します。

    image.png

    <Client ID>-dedicated をクリックすると mapper の一覧画面になります。最初は何も登録されていませんので、ここに mapper を追加していきます。
    「Add mapper」→「By configuration」と進むと、どのマッピングを使うか選択する画面になるので、属性に合わせてた項目を選択します。

    mappings attributes
    User Property username, lstName, firstName, email
    Group list memberOf

    各々の項目の設定画面で SAML Attribute Name を上記の属性名にします。
    ↓ username の例
    image.png

    最終的に、下図のようなマッピングのリストとなります。

    image.png
     

  5. IdP メタデータのダウンロード
    Keycloak コンソール左側のメニューから Realm settings に進むと、画面の一番下に Endpoints が出てきますので、 SAML 2.0 Identity Provider Metadata のリンクからメタデータをダウンロードして下さい。次のステップで使用します。

    image.png

3. OCI IAM側: Keycloak を IdP として登録する

設定作業に入る前に、Keycloakから返される SAML アサーションがどんな内容になるか確認しておきましょう。

<!-- SAMLアサーションの抜粋 -->
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <saml:Assertion>
    <saml:Issuer>https://xxxxxxxxxxx/realms/mcp-realm</saml:Issuer>
    <saml:Subject>
      <saml:NameID 
        Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">dlee</saml:NameID>
    </saml:Subject>
    <saml:AttributeStatement>
      <saml:Attribute FriendlyName="email" Name="urn:oid:1.2.840.113549.1.9.1"
        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
        <saml:AttributeValue xsi:type="xs:string">dlee@example.com</saml:AttributeValue>
      </saml:Attribute>
      <saml:Attribute Name="username" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
        <saml:AttributeValue xsi:type="xs:string">dlee</saml:AttributeValue>
      </saml:Attribute>
      <saml:Attribute FriendlyName="firstName" Name="urn:oid:2.5.4.42"
        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
        <saml:AttributeValue xsi:type="xs:string">David</saml:AttributeValue>
      </saml:Attribute>
      <saml:Attribute FriendlyName="lastName" Name="urn:oid:2.5.4.4"
        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
        <saml:AttributeValue xsi:type="xs:string">Lee</saml:AttributeValue>
      </saml:Attribute>
      <saml:Attribute Name="memberOf" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
        <saml:AttributeValue xsi:type="xs:string">employees</saml:AttributeValue>
      </saml:Attribute>
    </saml:AttributeStatement>
  </saml:Assertion>
</samlp:Response>

後ほど出てくる SAMLアサーション名ID属性 は、上記 XML の NameIDAttribute のことを指しています。

  1. SAML IdP の追加

    対象ドメインの詳細ページで「フェデレーション」のページから アイデンティティ・プロバイダ を追加します。アクションで 「SAML IdPの追加」を選択します。

    image.png

    Keycloak からダウンロードした IdP メタデータをアップロードします。

    image.png

    「ユーザー・アイデンティティのマップ」 セクションで、ユーザー属性のマッピングを行います。ここでは SAMLアサーション名IDユーザー名にマップします。

    image.png

    これで SAML アサーション内の NameID つまり Keycloak の 'sking' や 'dlee' が IAMのユーザー名としてマッピングされます。
     

  2. Just-In-Time (JIT)プロビジョニングの有効化と属性のマッピング
    Just-In-Time (JIT)プロビジョニング で OCI IAMに新しくユーザーを登録する場合、ユニークなキーとなるユーザー名の他に姓・名やメールアドレスなどの情報も含めて登録することもできます。
    また、登録するユーザーがどのグループに属するかどうかの情報も KeyCloak 側と同期しなければならないケースもあります。今回は、ユーザー/グループの関係は IdP 側で一元管理し、その情報を元に Deep Data Security の DATA ROLE とマッピングを行うシナリオなので、グループ情報の同期は必須です。

    IdP の画面の右上の「アクション」から「JITの構成」を開きます。

    image.png

    • JITプロビジョニングを有効化 = YES、新規 IAM ユーザーの作成 = YES、既存ユーザーのユーザーの更新 = NO
      image.png

    • 「ユーザー属性のマップ」セクションで、属性のマッピング
      image.png

    • 「グループ・メンバーシップのマップ」でグループのマッピング
      (今回は明示的に KeyCloak の グループと IAM のグループをマッピング)
      image.png
       

  3. IdP ポリシーの作成
    これまで IdP を新規に作成しましたが、フェデレーションを実現するには、IdP ポリシーを作成して、このポリシーの中で IdP とそれに関連する統合アプリケーションを設定する必要があります。これにより、この統合アプリケーションにログインしようとしたユーザーは IdP ポリシーに従って Keycloak のフェデレーション認証に誘導されます。

    「フェデレーション」の画面から 「IdPポリシーの作成」をクリックし、IdP ポリシーを新規作成します。
    IdP ポリシーの編集画面で 「アイデンティティ・プロバイダ・ルール」に先ほど作成したIdPを、「アプリケーション」に紐つけしたい統合アプリケーションを各々設定します。

    image.png
    image.png
     

  4. アクティブ化 & テスト
    最後に「アクション」から IdP をアクティブ化します。ログインのテストを行うメニューもありますので、ここから Keycloak のログイン画面に飛んで認証できるかどうか、確認してください。

    image.png

フェデレーションをテストする

では、前回同様 MCP Inspector から実行してみましょう。
David Lee さんのユーザー情報は、OCI IAM には存在しない状態です。

MCP Inspector から Connect すると、ログイン画面が OCI IAM ではなくて Keycloak に飛びます。

dlee でログインして下さい。
image.png

ログインに成功すると、OCI IAM に新しいユーザーが作成されています。

image.png

employees グループにも dlee が属していることを確認します。

image.png

では、MCP Server に対して Query を投げてみます。

image.png

Deep Data Security が効いています ☺️

まとめ

OCI IAM から Keycloak を IdP にしたフェデレーションを設定して Deep Data Security を試しました。
SAML フェデレーションを使えば、JITプロビジョニングで Keycloak (IdP) と OCI IAM (SP) 間のグループ・マッピングが可能です。

SAML のやり取りをトレースする Chrome 拡張を使うと、デバックに便利です!

image.png

参考

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?