【问题标题】:Oracle audit grant dba roleOracle 审计授予 dba 角色
【发布时间】:2012-11-18 03:29:55
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

    标签: oracle database-administration auditing


    【解决方案1】:

    您可以启用 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)
    

    【讨论】:

      【解决方案2】:

      您也可以为此创建一个数据库触发器:

       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

      【讨论】:

      • 感谢您的回复和链接。触发器是我尝试做的完美解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 2019-05-16
      • 1970-01-01
      相关资源
      最近更新 更多