weblogic server から oracle database へユーザidを渡す方法
DESCRIPTION
「WebLogic Server から Oracle Database へユーザIDを渡す方法」 2014年5月27日に開催された第47回WebLogic Server勉強会@東京のセッション資料です。Oracle Database がAPユーザを識別する際、CLIENT_IDを使用することができます。WebLogic Server のデータソース便利機能 「接続時にクライアントIDを設定」の使い方を紹介します。この機能は意外と知られていないので、この機会にマスターしてください。 日本オラクル テクノロジー製品事業統括本部 福田 知彦TRANSCRIPT
1 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
WebLogic Server から Oracle
Database へユーザIDを渡す方法
日本オラクル株式会社
テクノロジー製品事業統括本部
福田 知彦
2 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
3 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
一概に「ユーザー」といっても…. 3層アプリケーションの場合
エンドユーザー アプリケーションサーバー データベースサーバー
管理者/
運用担当
開発者 管理者/
運用担当
開発者
weblogic sys / system
コネクションプール
app
アクセス(ユーザー認証)
ユーザーID
利用者
アクセス対象
利用アカウント
4 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
データベースサーバーはエンドユーザーを知らない
• クラサバ環境では、エンドユーザーはデータベースサーバーに直接接続していたが、アプリケーションサーバーが中間に入り、コネクションプールを使用することで、エンドユーザーがデータベースサーバーから隠ぺいされる
• データベースにエンドユーザーを伝えるには作り込みが必要
エンドユーザー アプリケーションサーバー データベースサーバー
コネクションプール
app
アクセス(ユーザー認証)
ユーザーID
でしたが、
「接続時にクライアントIDを設定」機能でエンドユーザー名をデータベース
に伝えることができるようになりました
5 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
「接続時にクライアントIDを設定」機能とは
• DataSourceをgetConnectionする時にアプリケーションサーバーにログインしているユーザー名をデータベースに自動的に伝播する仕組み
– WebLogic Serverの場合、認証プロバイダで認証されたユーザー名
– Oracle Databaseの場合、クライアント識別子(Client Identifierアプリケーションコンテキスト属性)
エンドユーザー アプリケーションサーバー データベースサーバー
コネクションプール
接続ユーザー = app
クライアント識別子= ユーザーID
アクセス(ユーザー認証)
ユーザーID
6 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
データベースサーバーがエンドユーザーを知ると…..
• アプリケーションコードとセキュリティ実装の分離 – Oracle Databaseの仮想プライベートデータベース(VPD:Virtual
Private Database)機能を利用すれば、アプリケーションから全件検索してもエンドユーザーが参照権限を持っているデータしか結果として戻らない • アプリケーションコードが容易に
• コーディングミス(忘れ)による情報漏えいリスク軽減
•セキュリティポリシー変更時の対応が楽
• SQLインジェクションなどの攻撃を受けても、情報漏えいの範囲を制限
• データベースのアクセス監査証跡にエンドユーザー名を含めることが可能
ユーザーIDを渡すとできるようになることの例
7 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
デモ
• 「jdbc/adddrbook」という名前のデータソースのコネクションプールに接続し、ADDRBOOK表に対してSQLを実行
• 接続ユーザーによって結果の見え方が変わる (Data Redaction機能の利用)
電話帳アプリケーション
DataSource ds = (DataSource)context.lookup("jdbc/addrbook"); Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM ADDRBOOK.ADDRBOOK");
← admin
user01→
8 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
参考) Oracle Databaseで情報を見せないようにする機能
• Data Redaction (Oracle Advanced Security Option機能)
– 特定条件により、列の全体もしくは一部をマスキングする機能
• 仮想プライベートデータベース (VPD: Virtual Private
Database、Oracle Database Enterprise Edition基本機能)
– 特定条件により、特定の行や列のデータを見せないようにする機能
– SQL文にWHERE句を内部的に追加するイメージ
9 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
参考) Oracle Databaseの監査機能
• 標準監査証跡
• Unified Auditing監査証跡
CLIENT_IDENTIFIERは監査証跡に標準で格納
SQL> select os_username, username, timestamp, client_id, sql_text from dba_audit_trail; OS_USE USERNAME TIMESTAMP CLIENT_ID ------ -------- ------------------- ---------- SQL_TEXT -------------------------------------------------------------------------------- oracle ADDRBOOK 2014/04/17 14:16:32 admin SELECT * FROM ADDRBOOK.ADDRBOOK SQL> select os_username, dbusername, event_timestamp, client_identifier, sql_text from unified_audit_trail; OS_USE DBUSERNA EVENT_TIMESTAMP CLIENT_ID ------ -------- ------------------------------ ---------- SQL_TEXT -------------------------------------------------------------------------------- oracle ADDRBOOK 16-MAY-14 11.08.04.301729 AM admin SELECT * FROM ADDRBOOK.ADDRBOOK
10 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
「接続時にクライアントIDを設定」機能
11 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
データソース側の設定方法
1. 「データベース資格証明の使用」の有効化
2. 「接続時にクライアントIDを設定」の有効化
3. WebLogic Serverを再起動
12 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
1. 「データベース資格証明の使用」の有効化
• データソースの「構成」タブ→「Oracle」タブの「データベース資格証明の使用」チェックボックスをチェックし、「保存」ボタンを押します。
13 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
2. 「接続時にクライアントIDを設定」の有効化
• データソースの「構成」タブ→
「IDオプション」タブの「接続時にクライアントIDを設定」チェックボックスをチェックし、「保存」ボタンを押します。
14 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
アプリケーション側の設定方法
(Database12c利用時のみ) • weblogic.xmlに以下の設定を追加
クラス名: oracle.jdbc.OracleSQLPermission
ターゲット: clientInfo.OCSID.CLIENTID
アクション: (空欄)
weblogic.xml <security-permission> <security-permission-spec> grant { permission oracle.jdbc.OracleSQLPermission "clientInfo.OCSID.CLIENTID", "" }; </security-permission-spec> </security-permission>
15 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
利用時の前提条件
• WebLogic Server 10.3.6(+patch)と12c(12.1.2)で利用可能
• 10.3.6利用時には以下のbugの修正パッチ適用が必要
– Bug 11817754 - FEATURE TO COPY THE WEBLOGIC
AUTHENTICATED USER IN THE ORACLE CLIENT ID FIELD
• Oracle DatabaseとIBM DB2に対応
• DMS(Dynamic Monitoring Support)未対応のJDBC Driver
(例:ojdbc6.jar)の利用が必須
– DMS対応のJDBC Driver(例:ojdbc6dms.jar)では未対応
16 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
参考
• The WebLogic Server Blog
– Data Source Security Part 3 (2012/10/12)
• https://blogs.oracle.com/WebLogicServer/entry/data_source_security_
part_3
• http://orablogs-jp.blogspot.jp/2012/11/data-source-security-part-3.html
– Data Source Security Part 5 (2012/10/17)
• https://blogs.oracle.com/WebLogicServer/entry/data_source_security_
part_5
• http://orablogs-jp.blogspot.jp/2012/11/data-source-security-part-5.html
17 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
18 Copyright © 2014, Oracle and/or its affiliates. All rights reserved.