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 回答