※ 本記事は2017年1月12日に公開されたものです。
アクセス経路の制限で役に立つセッション情報がクライアントプログラム名です。
ホスト、クライアントプログラム名、データベースユーザー名の3つを組み合わせることで、たとえユーザー名とパスワードが知られていても特定のホストの特定のアプリケーションからしかアクセスできないといった、厳密なアプリケーションからのアクセス経路の制限が実現できます。また、アプリケーション用のアカウントではSQL*Plusからアクセスできないようにして、SQL文を手入力して自由な検索をされにくくすることもできます。
クライアントプログラム名はSYS_CONTEXT関数を利用して以下のように取得できます。
SQL> select sys_context('userenv','client_program_name') from dual; SYS_CONTEXT('USERENV','CLIENT_PROGRAM_NAME') -------------------------------------------------------------------------------- sqlplus@dbsec.jp.oracle.com (TNS V1-V3)
以下のような条件を仮想プライベートデータベースやData Redaction、Database Vaultのポリシーに設定することで、SQL*Plusからのアクセスを禁止することができます。
sys_context('userenv','client_program_name') not like 'sqlplus%'
なお、ここで検索できる値はV$SESSIONビューのPROGRAM列の値と同一で、12cからの統合監査の監査証跡を確認するためのUNIFIED_AUDIT_TRAILビューにもCLIENT_PROGRAM_NAMEとして格納されます。11gまでの監査機能ではクライアントプログラム名は取得できません。
Javaで作成したカスタムのアプリケーションでは、CLIENT_PROGRAM_NAMEにはデフォルトではたとえばJDBC Thin Clientというようにドライバ名が格納されます。ここにたとえばMyAppという値を設定するためには、下記のようにPropertyを設定してデータベースに接続します。
DriverManager利用時の例
Properties props= new Properties(); props.setProperty("user","puku"); props.setProperty("password","oracle"); props.setProperty("v$session.program","MyApp"); DriverManager.registerDriver (new oracle.jdbc.OracleDriver()); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@dbsec.jp.oracle.com:1521/appdb", props);
DataSource利用時の例
OracleDataSource ods = new OracleDataSource(); ods.setURL("jdbc:oracle:thin:@dbsec.jp.oracle.com:1521/appdb"); ods.setUser("puku"); ods.setPassword("oracle"); Properties props = new Properties(); props.setProperty("v$session.program", "MyApp"); ods.setConnectionProperties(props); Connection conn = ods.getConnection();
WebLogic Serverを利用している場合には、データソースの「構成」タブの「接続プール」タブの「プロパティ」テキストボックスに下記のように設定します。
設定方法に関してはこちらのblogも参考にしてください。
クライアントプログラム名を設定しておけば、たとえばデータベース監視中に同じホストから複数のセッションが張られている場合でも、どのクライアントプログラムからの接続化を特定しチューニングを実施したり、怪しい(許可されていない)セッションが張られていないかどうか確認したりするのにも利用できます。ぜひご活用ください。

