この章のトピックは、次のとおりです。
AnyCoアプリケーションの実装では、Oracleのエンドツーエンドのアプリケーション追跡機能のため、メタデータ値を使用してきました。設定された値は次のとおりです。
クライアント識別子
クライアント情報
モジュール
アクション
クライアント識別子には、各エンド・ユーザーに一意に関連付けられる値が格納されています。他の3つの値は実質的に、アプリケーションのタスクに関する降順のデータ階層です。
メタデータ値は半任意のテキスト文字列です。Oracleはメタデータ値を記録しておき、現在オープン中の接続のリスト内など、特定のデータベース機能でそれらを使用できるようにしています。これらの機能をデータベース管理者がどのように使用するのか、および、アプリケーションがどのように設計されているかによって、アプリケーションに設定する値は変わってきます。
AnyCoアプリケーションでは、どのWebユーザーがアプリケーションにログインしたかによって、クライアント識別子をsimon
またはadmin
に設定しています。クライアント情報は常に'AnyCo Corp.'に設定されます。ac_db.inc.php
のCLIENT_INFO
を参照してください。モジュールは各ページでDb
クラスのインスタンスが作成されるたびに設定されます。選択によっては、モジュール名Equipment
が常に使用されます。これは、このファイル・セットが従業員の備品の操作に関連することを示しています。アクションは実行されたSQL文によって異なります。
メタデータ値が使用される箇所を確認するため、AnyCoアプリケーションにログインし、いくつかのページ間をナビゲートします。
Windowsの場合、「スタート」メニューから「プログラム」(または「すべてのプログラム」)、「Oracle Database 12c」、データベース管理ページに移動の順に選択します。
Linuxの場合は、「Application」メニュー(Gnomeの場合)または「K」メニュー(KDEの場合)をクリックし、「Oracle Database 12c」、データベース管理ページに移動の順にポイントします。セッションページにナビゲートし、SYSTEM
ユーザーとしてログインします。次が表示されます。
複数のエントリが含まれています。Apacheによっていくつかのプロセスが作成され、どのプロセスも何らかのHTTPリクエストを処理している可能性があります。アプリケーション・ページをナビゲートすると、そのページ・リクエストが別のApacheプロセスによって処理されます。
いずれかのAnyCoセッションのSID番号をクリックしてドリルダウンします。
このページではクライアントとアプリケーションの情報も確認できます。
Oracle Database管理ツールでは、SQL文とその実行についての統計を確認できます。調整が不十分な文や、頻繁に使用されている文が見つかった場合は、エンドツーエンドの追跡メタデータでソースのPHPファイルを特定できるので、確認と再設計を簡単に行うことができます。文の場合は、各文の最初の実行時の有効なメタデータが、記録されるデータです。
メタデータの正確性は、データベースに接続するアプリケーション内での使用の一貫性に依存します。
クライアント識別子の使用の詳細は、次の技術ドキュメントを参照してください。
http://www.oracle.com/technetwork/articles/dsl/php-web-auditing-171451.html
Oracle Databaseの管理ペインは、接続と文の実行に関してOracle Databaseが記録したすべての情報の簡易ビューです。V$SESSION
やV$SQLAREA
など、様々な標準データベース管理ビューにも、これらの追跡メタデータが含まれています。問合せを作成したりその他のツールを使用して、この情報を提供できます。
クライアント識別子メタデータはデータ・アクセスを制限するときに使用できます。Oracle Databaseでは、各SQL文を手動で強化して、クライアント識別子をチェックする方法でアクセスを制限できます。
select * from equipment where sys_context('userenv', 'client_identifier') = 'admin';
別のクライアント識別子のWebユーザーがログインした場合、WHERE
条件がfalseに評価され、行は返されません。Administrator
のみがデータを表示できます。
Oracle DatabaseのEnterprise Editionでは、データ・アクセスを自動的に制限するポリシー・ルールの作成が仮想プライベート・データベース機能でサポートされています。そのため、個々のSQL文を変更する必要はありません。監査を有効にした場合は、クライアント識別子は監査ログにも記録されます。
クライアント識別子を使用してセキュリティを施す場合は、アプリケーション・コードの整合性を保つことが重要です。クライアント識別子の欠落や偽装を回避することが不可欠です。
AnyCoアプリケーションでは、PHPプロセスがスクリプトを処理していなくてもオープン状態を保つPHP OCI8永続接続を使用します。メタデータ値がユーザー・スクリプトの後でリセットされないため、PHPプロセスとそのデータベース接続がアイドルのときでも、セッションスクリーンでメタデータを確認できます。また、そのPHPプロセスで処理される後続のoci_pconnect()
で明示的に再設定されないかぎり、現在の値が有効な値として維持されます。
非永続の接続を使用してoci_connect()
またはoci_new_connect()
をコールした場合、PHPスクリプトが完了するたびに接続がクローズされてしまうため、このような動作にはなりません。
アイドル時間がほとんどないビジー・システムで、永続接続のメタデータが残ることは通常問題ではありません。データベース管理者にとっての問題領域は、アイドルではないビジーの接続です。メタデータの設定解除を行わないことは、PHPとデータベース間のラウンドトリップを回避できるため、パフォーマンスを最大限に高めることができます。これはシステム全体の速度を下げるため、お薦めしません。しかし、Db
デストラクタに次を追加して、メタデータを強制的にクリアできます。
$this->stid = oci_parse($this->conn, "begin dbms_session.clear_identifier; dbms_application_info.set_client_info(''); dbms_application_info.set_module('', ''); end;"); oci_execute($this->stid);
これを実行する場合は、最初にWebサーバーを再起動して、既存のPHP永続データベース接続をすべてクローズします。
完璧な解決策というものは存在しません。PHPプロセスがクラッシュした場合、値をクリアしたり、データベースに非永続接続をクローズするよう通知したりできません。