はじめに
前回の記事では、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 フェデレーションを設定します。
全体像はこのようになります。
SAML フェデレーションを設定する
1. OCI IAM側: SP メタデータの取得
Keycloak側でOCI IAMをSPとして登録する際、OCI IAMのSPメタデータが必要です。
コンソールで、ドメインの「フェデレーション」のタブから「SAMLメタデータのエクスポート」をクリックします。
メタデータ・ファイルの「XMLのダウンロード」をクリックして、XMLファイルをダウンロードして下さい。次のステップで使用します。
2. Keycloak側: OCI IAM を SP として登録する
-
realmの選択/作成
連携用の realm を選択または新規作成します。
(ここではmcp-realm)
-
ユーザー/グループ作成
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を作成し、skingとdleeをメンバーに加えます。
-
Clientの追加(=SAML SP登録
「Clients」メニューから「Import Clients」を選び、先ほど OCI IAM からダウンロードしたメタデータファイルをインポートします。これにより Client ID が自動的に OCI IAM の Issuer に設定され、プロトコルも SAML に自動設定されます。 - 長いからって Clien ID は絶対に変えちゃダメ
Encrypt assertionsは、Off にしておきましょう。フェデレーションの通信は HTTPS で行われるので不要なのと、デバッグする時に便利です(SAML をトレースする Chrome 拡張機能を使って SAML アサーションを確認できます)。
-
属性マッパーの追加。
SAML アサーション (ユーザーの認証情報や属性が記述されたXML形式のデータ) に埋め込む属性(Atrributes)を設定します。後の工程で OCI IAM はこの属性を使って、ユーザー/グループのマッピングを行います。Client の画面に
Client scopesというタブあるので、開くと
<Client ID>-dedicated
という名前の scope があらかじめアサインされていますので、これに属性のマッピングを追加します。<Client ID>-dedicatedをクリックすると mapper の一覧画面になります。最初は何も登録されていませんので、ここに mapper を追加していきます。
「Add mapper」→「By configuration」と進むと、どのマッピングを使うか選択する画面になるので、属性に合わせてた項目を選択します。mappings attributes User Property username, lstName, firstName, email Group list memberOf 各々の項目の設定画面で
SAML Attribute Nameを上記の属性名にします。
↓ username の例

最終的に、下図のようなマッピングのリストとなります。
-
IdP メタデータのダウンロード
Keycloak コンソール左側のメニューからRealm settingsに進むと、画面の一番下にEndpointsが出てきますので、SAML 2.0 Identity Provider Metadataのリンクからメタデータをダウンロードして下さい。次のステップで使用します。
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 の NameID や Attribute のことを指しています。
-
SAML IdP の追加
対象ドメインの詳細ページで「フェデレーション」のページから アイデンティティ・プロバイダ を追加します。アクションで 「SAML IdPの追加」を選択します。
Keycloak からダウンロードした IdP メタデータをアップロードします。
「ユーザー・アイデンティティのマップ」 セクションで、ユーザー属性のマッピングを行います。ここでは
SAMLアサーション名IDをユーザー名にマップします。これで SAML アサーション内の
NameIDつまり Keycloak の 'sking' や 'dlee' が IAMのユーザー名としてマッピングされます。
-
Just-In-Time (JIT)プロビジョニングの有効化と属性のマッピング
Just-In-Time (JIT)プロビジョニング で OCI IAMに新しくユーザーを登録する場合、ユニークなキーとなるユーザー名の他に姓・名やメールアドレスなどの情報も含めて登録することもできます。
また、登録するユーザーがどのグループに属するかどうかの情報も KeyCloak 側と同期しなければならないケースもあります。今回は、ユーザー/グループの関係は IdP 側で一元管理し、その情報を元に Deep Data Security の DATA ROLE とマッピングを行うシナリオなので、グループ情報の同期は必須です。IdP の画面の右上の「アクション」から「JITの構成」を開きます。
-
IdP ポリシーの作成
これまで IdP を新規に作成しましたが、フェデレーションを実現するには、IdP ポリシーを作成して、このポリシーの中で IdP とそれに関連する統合アプリケーションを設定する必要があります。これにより、この統合アプリケーションにログインしようとしたユーザーは IdP ポリシーに従って Keycloak のフェデレーション認証に誘導されます。「フェデレーション」の画面から 「IdPポリシーの作成」をクリックし、IdP ポリシーを新規作成します。
IdP ポリシーの編集画面で 「アイデンティティ・プロバイダ・ルール」に先ほど作成したIdPを、「アプリケーション」に紐つけしたい統合アプリケーションを各々設定します。 -
アクティブ化 & テスト
最後に「アクション」から IdP をアクティブ化します。ログインのテストを行うメニューもありますので、ここから Keycloak のログイン画面に飛んで認証できるかどうか、確認してください。
フェデレーションをテストする
では、前回同様 MCP Inspector から実行してみましょう。
David Lee さんのユーザー情報は、OCI IAM には存在しない状態です。
MCP Inspector から Connect すると、ログイン画面が OCI IAM ではなくて Keycloak に飛びます。
ログインに成功すると、OCI IAM に新しいユーザーが作成されています。
employees グループにも dlee が属していることを確認します。
では、MCP Server に対して Query を投げてみます。
Deep Data Security が効いています ☺️
まとめ
OCI IAM から Keycloak を IdP にしたフェデレーションを設定して Deep Data Security を試しました。
SAML フェデレーションを使えば、JITプロビジョニングで Keycloak (IdP) と OCI IAM (SP) 間のグループ・マッピングが可能です。
SAML のやり取りをトレースする Chrome 拡張を使うと、デバックに便利です!





















