Java、Oracle、AngularJSで記述されたWebアプリケーションがあります。 ユーザーが何かを変更、作成、または更新したときに、ログをデータベースに保存します。
これを実装するには2つの方法があります。
短所:データベースレベルでは、変更を行うユーザー情報がないため、すべてのテーブルにuserNameを保存する必要があります変更を加えます。
例:テーブルは次のようになります。
my_table {
field_1,
field_2,
...,
userName
)
たとえば、ユーザーがデータを変更した場合、changeObject
とAuditUserChange
の両方の関数を呼び出す必要があります。
これに加えて、誰か(サポートスペシャリスト)がデータベーステーブルに直接変更を加えたときに監査ログを保存するために、テーブルにトリガーを追加する必要があります。
どの戦略を使用する必要がありますか?どちらのオプションが良いですか?
質問:すべて以外の方法でこのデータを変更しますか以外 Webアプリケーション? (データを「修正」する必要がありますか?)。
答えが「はい」の場合は、トリガーを使用します。
ユーザー名はデータベースにアクセスできる必要があります-Oracleのclient_identifierが適切なオプションですが、クライアントアプリケーションをコード化して渡す必要があります。
次に、次のように、監査対象のテーブルを大幅に複製するテーブルを作成します。
create table main_table
( field1 varchar2( 1 char )
, ...
, field9 varchar2( 9 char )
);
create table main_audit
( username varchar2( 256 )
, change_date date
, change_type varchar2( 1 char )
, field1 varchar2( 1 char )
, ...
, field9 varchar2( 9 char )
);
次に、トリガーはold:およびnew:疑似テーブルを使用して、1つのテーブルから別のテーブルに値をコピーします。 (変更タイプには、挿入と削除の値があり、更新の場合、レコードの「前」と「後」のイメージを表すtwo値がある場合があります(what値wereは多くの場合、それらがnow)と同じくらい重要です。
一連の変更は次のようになります。
select * from maim_audit ;
+----------+---------------------+-------------+---------+--------+
| username | change_date | change_type | field1 | field9 |
+----------+---------------------+-------------+---------+--------+
| bob | 2017-09-19 08:00:06 | 1 (Insert) | BMW | 325 |
| arnold | 2017-09-19 10:53:05 | 2 (Before) | BMW | 118 |
| arnold | 2017-09-19 10:53:05 | 3 (After) | Peugeot | 107 |
| jeff | 2017-09-19 11:15:00 | 4 (Delete) | Peugeot | 107 |
+----------+---------------------+-------------+---------+--------+
まあ、私はコンテキストが重要であると言うことから始めましょう。アプリケーションがイントラネットであるかインターネットであるか、またはWebユーザーの数がどれほど大きいかについては、まだ述べていません。
イントラネットベースのアプリケーションでは、実行可能なオプションとして、Webユーザー独自のIDを各リクエストのDBユーザーとして使用し、データベースへのすべてのロギングを行うことができます。ただし、これは、何らかの種類のシングルサインオンや、Active Directoryなどの中央認証サーバーを使用している場合にのみ、実際に拡張されます。
それがオプションではない場合、アプリケーションログを介してWebユーザーアクティビティのログを記録し、Oracleの監査機能をセットアップすることから始めます( https://docs.Oracle.com/cd/E11882_01/ server.112/e10575/tdpsg_auditing.htm#TDPSG500 )。カスタムトリガーよりもパフォーマンスがよく、信頼性が高いためです。
使用しているJava web stuff)に応じて、Auditクラスへの呼び出しを追加する関数を作成するたびにログを取ることを簡単にする方法があることに注意してください。アスペクト指向プログラミングに、またはフレームワークに要求パイプラインの概念がある場合は、必要なユーザー情報を使用してすべてのWeb要求をログに記録するだけです。
最後に、ElasticStackやSplunkなどのログ集約を調べて、すべての監査ログを1か所/形式で取得することで、悪意のあるアクティビティを特定するのではなく、探し回るのが簡単になります。