Oracle审计授予dba角色

时间:2012-11-29 22:54:10

标签: oracle database-administration auditing

在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数据库,这也会触发电子邮件通知?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

的改编