4

XP SP2 仮想マシンで Oracle 11gR1 を実行しています。完全な開示: これは割り当て用です。

ユーザーに DBA ロールが付与されるたびに監査し、イベントが発生したときに電子メールを送信しようとしています。

このコマンドAUDIT DBA;は、DBA ロールで実行されたすべてのアクションを監査すると思います。私は電子メール部分を処理する完全に機能する手順を持っていますが、標準監査が詳細な監査ポリシーと同じ方法で手順をトリガーする方法を知りません。

ポリシーを使用してみました

begin
dbms_fga.drop_policy
    (object_schema => 'SYS',
    object_name => 'DBA_ROLE_PRIVS',
    policy_name => 'EXAMPLE');
dbms_fga.add_policy
    (object_schema => 'SYS',
    object_name => 'DBA_ROLE_PRIVS',
    policy_name => 'EXAMPLE',
    audit_condition => 'GRANTED_ROLE = DBA',
    audit_column => 'GRANTED_ROLE',
    handler_schema => 'SYS',
    handler_module => 'FGA_NOTIFY');
end;

FGA_NOTIFY は電子メールの手順です。しかし、「SYSが所有するオブジェクトにポリシーを追加することは許可されていません」という通知が表示されます。Oracle のドキュメントを検索しても、これを回避する方法は見つかりませんでした。

私の質問は、電子メール通知をトリガーできる DBA ロールをユーザーが取得したときに、監査と Oracle データベースの方法を提案できる人はいますか?

よろしくお願いします。

4

2 に答える 2

4

AUDIT_TRAIL を有効にして、DBA_AUDIT_TRAIL ビューに定期的にクエリを実行し、チェックする許可のタイプを探すジョブを作成できます。

   select os_username, username, userhost, terminal, timestamp, grantee  
   from   dba_audit_trail
   where  action_name = 'GRANT ROLE'
   and    obj_name    = 'DBA'
   and    timestamp   >= (last_time_check_was_done)
于 2013-01-04T12:51:50.253 に答える
1

そのためのデータベーストリガーを作成することもできます。

 CREATE OR REPLACE TRIGGER TG_GRANTS_DATABASE
    BEFORE GRANT ON DATABASE
 DECLARE
    V_NUM_GRANTEES   BINARY_INTEGER;
    V_GRANTEE_LIST   ORA_NAME_LIST_T;
    V_NUM_PRIVS      BINARY_INTEGER;
    V_PRIV_LIST      ORA_NAME_LIST_T;

    VB_AUDIT_PRIV    BOOLEAN;
    VB_AUDIT_GRANTEE BOOLEAN;
 BEGIN
    V_NUM_GRANTEES := ORA_GRANTEE (V_GRANTEE_LIST);
    V_NUM_PRIVS    := ORA_PRIVILEGE_LIST (V_PRIV_LIST);

    -- Verify the privilege
    VB_AUDIT_PRIV := FALSE;
    FOR COUNTER IN 1 .. V_NUM_PRIVS
    LOOP
       IF  V_PRIV_LIST (COUNTER) IN ('DBA') THEN
           VB_AUDIT_PRIV := TRUE;
           EXIT;
       END IF;
    END LOOP;

    -- Verify the user
    VB_AUDIT_GRANTEE := FALSE;
    FOR COUNTER IN 1 .. V_NUM_GRANTEES
    LOOP
       IF  V_GRANTEE_LIST (COUNTER) IN ('PUBLIC') THEN
           VB_AUDIT_GRANTEE := TRUE;
           EXIT;
       END IF;
    END LOOP;

    --   Prevent the statement
    --   or audit it (BEST DONE  on 'AFTER GRANT ON DATABASE trigger')
    IF   VB_AUDIT_GRANTEE AND VB_AUDIT_PRIV  THEN
         RAISE_APPLICATION_ERROR(-20001,'Sorry, this can''t be done.');
    END  IF;
 END;

これは、 http://examples.oreilly.com/oraclep3/individual_files/what_privs.sqlに基づく適応でした。

于 2013-01-04T14:03:59.653 に答える