在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数据库,这也会触发电子邮件通知?
提前感谢您的帮助!
答案 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
的改编