[Database, Integration] Oracle Databaseのプロキシ認証をJCA Adapter for Databaseから利用する

この内容はJPOUG Advent Calendar 2017の12月23日版です。
JPOUG Advent Calendar 2017
https://jpoug.doorkeeper.jp/events/67051
12月22日は@mogmetさんの「まだbondingで消耗しているの?HAIPでインターコネクト冗長化の時代が来たよ!」でした。
まだbondingで消耗しているの?HAIPでインターコネクト冗長化の時代が来たよ!
http://blog.mogmet.com/oracle-interconnect-haip/ 
今日は、Oracle Databaseのプロキシ認証をOracle SOA Suiteで利用可能なOracle JCA Adapter for Databaseでも利用可能、というお話です(本当ならコンテナ関連の話にしたかったのですが、イケメン敏腕エバンジェリストのチェックが厳しいので、やめておきますw)。

背景

プロキシ認証を多用されているOracle Databaseユーザーから、「JDBCドライバではプロキシ認証サポートしているけど、Oracle SOA Suite/Service Busで利用できるOracle JCA Adapter for Databaseではサポートしているの?」という問い合わせを受けました。ドキュメントにもサポートしていると明記されているので、「Yes」で終わりなのですが、「本当なの?」という疑いの眼差しが刺さったことでちょいとお手伝いしました。
JCA Adapter for DatabaseはオンプレミスのSOA Suite/Service Busだけでなく、SOA Cloud Serviceでもご利用いただけます。設定はドキュメントに記載があるので、ドキュメントに沿って実施するだけです。
Oracle® Fusion Middlewareテクノロジ・アダプタの理解 12c (12.2.1.2.0)
プロキシ認証のサポート
https://docs.oracle.com/cd/E84527_01/adapters/develop-soa-adapters/GUID-B03AD33F-2383-4E53-BF58-09D284CDDE97.htm#GUID-11B2D79B-714A-43EA-97D0-3AD64A0C7DFD
Oracle® Fusion Middleware Understanding Technology Adapters 12c (12.2.1.3.0)
Proxy Authentication Support
https://docs.oracle.com/middleware/12213/adapters/develop-soa-adapters/overview7.htm#TKADP1337
JDBCドライバのドキュメントでのプロキシ認証に関する記述はこちら。
Oracle® Database JDBC開発者ガイド 12cリリース2 (12.2)
プロキシ認証
https://docs.oracle.com/cd/E82638_01/JJDBC/proxy-authentication.htm
Oracle® Database JDBC Developer's Guide 12c Release 2 (12.2)
Proxy Authentication
https://docs.oracle.com/database/121/JJDBC/proxya.htm#JJDBC28352 

データベースの設定


前提として、Databaseにはuser1、user2というユーザーが存在し、user1、user2には同じ名前、同じ構成の表があるものとします(今回はSHIPという表を使いますが、特に意味はありません)。
SHIPはこんな感じの表です。
名前                NULL?     型
------------------ --------- ---------------
ORDERID            NOT NULL  VARCHAR2(100)
STATUS                       VARCHAR2(100)
CREATEDDATE                  DATE
UPDATEDDATE                  DATE
ISCHECKED          NOT NULL  VARCHAR2(1)
その上で、プロキシユーザーproxy_user1を作成します。権限は最小限のものを付与します。
CREATE USER proxy_user1 IDENTIFIED BY welcome1;
GRANT CONNECT, RESOURCE, CREATE ANY DIRECTORY, DROP ANY DIRECTORY TO proxy_user1;
プロキシユーザーにuser1、user2として接続できるよう権限を付与します。今回は簡単のため、ロールは使いませんでしたが、単にユーザーだけで通すのはよろしくないので、パスワードで認証するようにしました(証明書を使った認証も可能です)。
ALTER USER user1 GRANT CONNECT THROUGH proxy_user1 authenticated using password;
ALTER USER user2 GRANT CONNECT THROUGH proxy_user1 authenticated using password;
これでデータベース側の設定は終わりです。

Application Serverの設定

データソースとJCA Adapter for Databaseの設定が必要です。

1) データソースの作成
WebLogic Server管理コンソールに管理者としてログインし、ドメイン>サービス>データ・ソースとたどり、データソースを作成します。今回は汎用データ・ソースを選択しています。Database接続ユーザーはproxy_user1を使うことにご注意ください。


2)JCA Adapter for Databaseの設定
WebLogic Server管理コンソールで、ドメイン>デプロイメントを開き、DbAdapterをクリック、[構成]>[アウトバウンド接続プール]をクリックして[新規]を押し、新規アウトバウンド接続プールを作成します。プロパティのDataSourceName(XAドライバを使っている場合にはXADataSourceName)にデータソースのJNDI名を指定します。以下は設定例です。

Adapterの設定が終了すると、再デプロイするように求められるので、更新しておきましょう。
これでApplication Serverの設定は終了です。

JCA Adapter利用時の設定

今回は、Oracle Service BusでJCA Adapter for Databaseを構成しました(SOA Infraを選ばなかった深い理由はありません)。処理自体は非常にシンプルで、キーであるORDERIDを使って表のレコードを取得する、というものです。SOAPだけだと面白くないのでRESTでも呼べるようにしています。

プロキシユーザーのままアクセスするわけにはいかないので、実際のユーザーとパスワードを指定する必要があります。ルーティングのリクエスト・アクションに[トランスポート・ヘッダー]アクティビティを配置し、
jca.db.ProxyUserName
jca.db.ProxyPassword 
という2個のプロパティにそれぞれユーザーとパスワードを指定します。今回は簡単のためにリテラルで指定していますが、実際にはHTTPヘッダーやリクエストメッセージ中に含めて渡すことになるでしょうし、エラー処理も全く入れていないので、実運用時にはエラーハンドラを設定する必要があります。

設定が終わればデプロイします。これでOracle Service Busでの設定は終了です。

試してみる

では、試してみます。まず、USER1でSHIP表の内容を(みんな大好き)SQL*Plusで確認します。
SQL> select * from ship;

ORDERID           STATUS        CREATEDD UPDATEDD I
----------------- ------------- -------- -------- -
P0001             COMPLETED     17-12-19 17-12-19 C
AX0001            STARTED       17-12-19 17-12-19 C
A0001             STARTED       17-12-19 17-12-19 C
USER2のSHIP表はこんな感じ。
SQL> select * from ship;

ORDERID           STATUS        CREATEDD UPDATEDD I
----------------- ------------- -------- -------- -
AX0001            COMPLETED     17-12-22 17-12-22 C
先ほどのService Busで作成したRESTサービスでデータを呼び出します。ORDERIDはAX0001を使うことにしましょう。user1ならSTARTEDが出てくるはずです。

user2の場合は、STATUSはCOMPLETEDで、日付が違うはずです。
 user2のパスワードを間違えて指定した場合、当然ながらエラーになってしまいます。Web APIとして利用するなら、当然エラー処理をして素のエラーメッセージを隠し、わかりやすいエラーメッセージに変更する必要があります。

まとめ

ドキュメントに記載の通り、JCA Adapter for Databaseでも問題なくプロキシ認証が動作することがわかりました。この機能を実際のシステムで使うかどうかはよくわかりませんが…。
なお、Oracle Integration CloudのIntegration(旧Integration Cloud Service)にもOracle Database Adapterがありますが、こちらではプロキシ認証はサポートされていませんのでご注意ください。

明日(2017/12/24) は吉田もとたか@OracleACEさんです。それでは、Happy Holiday!

0 件のコメント:

コメントを投稿