首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle审计授权dba角色

Oracle审计授权dba角色
EN

Stack Overflow用户
提问于 2012-11-30 06:54:10
回答 2查看 2.4K关注 0票数 4

在XP SP2虚拟机中运行Oracle11gR1。完全公开:这是一项任务。

我尝试在用户被授予DBA角色时进行审计,并在事件发生时发出一封电子邮件。

我相信AUDIT DBA;命令会审计在数据库管理员角色上执行的所有操作。我有一个完整的工作程序,可以处理电子邮件部分,但我不知道标准审计如何像细粒度审计策略那样触发该程序。

我试过使用这个策略

代码语言:javascript
复制
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的文档时,我没有找到解决这个问题的方法。

我的问题是:有没有人能建议一种审计和Oracle数据库的方法,当用户获得DBA角色时,也可以触发电子邮件通知?

提前感谢您的帮助!

EN

回答 2

Stack Overflow用户

发布于 2013-01-04 20:51:50

您可以启用AUDIT_TRAIL并创建一个作业,该作业定期查询DBA_AUDIT_TRAIL视图,查找您想要检查的授权类型:

代码语言:javascript
复制
   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)
票数 4
EN

Stack Overflow用户

发布于 2013-01-04 22:04:00

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

代码语言:javascript
复制
 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的改编

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13636272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档