数据库审计全.docx
《数据库审计全.docx》由会员分享,可在线阅读,更多相关《数据库审计全.docx(13页珍藏版)》请在冰豆网上搜索。
![数据库审计全.docx](https://file1.bdocx.com/fileroot1/2023-2/11/e0b38c29-1e30-4029-bab0-c02b981d69be/e0b38c29-1e30-4029-bab0-c02b981d69be1.gif)
数据库审计全
数据库审计
查看数据库审计是否打开
SQL>showparameteraudit;
NAMETYPEVALUE
-----------------------------------------------------------------------------
audit_file_deststring/oracle/app/oracle/admin/PTBCS/adump
audit_sys_operationsbooleanFALSE
audit_syslog_levelstring
audit_trailstringDB_EXTENDED
audit_sys_operations:
默认为false,当设置为true时,所有sys(包括以sysdba,sysopr身份登录的用户)操作都会被记录,但记录不会被写在aud$表中。
如果为windows平台,会记录在windows事件管理当中。
audit_trail:
none为默认值,11G之后默认值为‘db’,如果默认值为none,那么不做审计
DB:
将audittrail记录在数据库审计相关的表中,审计只有连接信息
DB_EXTENDED:
这样审计还包含当时的执行的具体语句
OS:
将audittrail记录在系统文件中,文件名有audit_file_dest参数指定
修改语句为SQL>altersystemsetaudit_trail='db_extended'scope=spfile;
注:
参数audit_trail不是动态,为了使此参数中的改动生效,必须关闭数据库并重新启动。
在对sys.aud$进行审计时,还需要监控该表的大小,以免影响system表空间中其他对象的空间需求。
推荐周期性归档sys.aud$中的行,并截取该表。
目前采用计划任务,每日删除上月数据,只保留当月数据。
Audit_file_dest:
audit_trail=os时,文件位置。
语句审计
SQL>auditontablebyaccess;
每次动作发生时都对其进行审计
SQL>auditontablebysession;
只审计一次,默认为bysession
有时希望审计成功的动作:
没有生成错误消息的语句。
对于这些语句,添加wheneversuccessful。
而有时只关心使用审计语句的命令是否失败,失败原因是权限违犯、用完表空间中的空间还是语法错误。
对于这些情况,使用whenevernotsuccessful。
对于大多数类别的审计方法,如果确实希望审计所有类型的表访问或某个用户的任何权限,则可以指定all而不是单个的语句类型或对象。
SQL>auditaltersystem;
所有ALTERSYSTEM选项,例如,动态改变实例参数,切换到下一个日志文件组,以及终止用户会话
SQL>auditcluster;
CREATE、ALTER、DROP或TRUNCATE集群
SQL>auditcontext;
CREATECONTEXT或DROPCONTEXT;
SQL>auditdatabaselink;
CREATE或DROP数据库链接;
SQL>auditdimension;
CREATE、ALTER或DROP维数
SQL>auditdirectory;
CREATE或DROP目录;
SQL>auditindex;
CREATE、ALTER或DROP索引
SQL>auditmaterializedview;
CREATE、ALTER或DROP物化视图
SQL>auditnotexists;
由于不存在的引用对象而造成的SQL语句的失败;
SQL>auditprocedure;
CREATE或DROPFUNCTION、LIBRARY、PACKAGE、PACKAGEBODY或PROCEDURE
SQL>auditprofile;
CREATE、ALTER或DROP配置文件
SQL>auditpublicdatabaselink;
CREATE或DROP公有数据库链接
SQL>auditpublicsynonym;
CREATE或DROP公有同义词
SQL>auditrole;
CREATE、ALTER、DROP或SET角色
SQL>auditrollbacksegment;
CREATE、ALTER或DROP回滚段
SQL>auditsequence;
CREATE或DROP序列
SQL>auditsession;
登录和退出
SQL>auditsystemaudit;
系统权限的AUDIT或NOAUDIT
SQL>auditsystemgrant;
GRANT或REVOKE系统权限和角色
SQL>audittable;
CREATE、DROP或TRUNCATE表
SQL>audittablespace;
CREATE、ALTER或DROP表空间
SQL>audittrigger;
CREATE、ALTER(启用/禁用)、DROP触发器;具有ENABLEALLTRIGGERS或DISABLEALLTRIGGERS的ALTERTABLE
SQL>audittype;
CREATE、ALTER和DROP类型以及类型主体
SQL>audituser;
CREATE、ALTER或DROP用户
SQL>auditview;
CREATE或DROP视图
显式指定的语句类型
SQL>auditaltersequence;
任何ALTERSEQUENCE命令
SQL>auditaltertable;
任何ALTERTABLE命令
SQL>auditcommenttable;
添加注释到表、视图、物化视图或它们中的任何列
SQL>auditdeletetable;
删除表或视图中的行
SQL>auditexecuteprocedure;
执行程序包中的过程、函数或任何变量或游标
SQL>auditgrantdirectory;
GRANT或REVOKEDIRECTORY对象上的权限
SQL>auditgrantprocedure;
GRANT或REVOKE过程、函数或程序包上的权限
SQL>auditgrantsequence;
GRANT或REVOKE序列上的权限
SQL>auditgranttable;
GRANT或REVOKE表、视图或物化视图上的权限
SQL>auditgranttype;
GRANT或REVOKETYPE上的权限
SQL>auditinserttable;
INSERTINTO表或视图
SQL>auditlocktable;
表或视图上的LOCKTABLE命令
SQL>auditselectsequence;
引用序列的CURRVAL或NEXTVAL的任何命令
SQL>auditselecttable;
SELECTFROM表、视图或物化视图
SQL>auditupdatetable;
在表或视图上执行UPDATE
SQL>selectusername,to_char(timestamp,'MM/DD/YYHH24:
MI')timestamp
2OBJ_NAME,ACTION_NAME,SQL_TEXTFROMDBA_AUDIT_TRAIL
3WHEREUSERNAME='SCOTT';
我用的基本查询审计信息,显示结果如下
scott08/12/0717:
15JOB_TITLE_IDXCREATEINDEXcreateindexhr.
job_title_idxon
hr.jobs(job_title)
1rowselected.
权限审计
审计系统权限具有与语句审计相同的基本语法,但审计系统权限是在sql_statement_clause中,而不是在语句中,指定系统权限。
SQL>auditaltertablespacebyaccesswheneversuccessful;
使用SYSDBA和SYSOPER权限或者以SYS用户连接到数据库的系统管理员可以利用特殊的审计。
为了启用这种额外的审计级别,可以设置初始参数AUDIT_SYS_OPERATIONS为TRUE。
这种审计记录发送到与操作系统审计记录相同的位置。
因此,这个位置是和操作系统相关的。
当使用其中一种权限时执行的所有SQL语句,以及作为用户SYS执行的任何SQL语句,都会发送到操作系统审计位置。
模式对象审计
SQL>auditalteronTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
改变表、序列或物化视图
SQL>auditAUDITonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
审计任何对象上的命令
SQL>auditCOMMENTonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
添加注释到表、视图或物化视图
SQL>auditDELETEonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
从表、视图或物化视图中删除行
SQL>auditEXECUTEonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
执行过程、函数或程序包
SQL>auditFLASHBACKonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
执行表或视图上的闪回操作
SQL>auditGRANTonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
授予任何类型对象上的权限
SQL>auditINDEXonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
创建表或物化视图上的索引
SQL>auditINSERTonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
将行插入表、视图或物化视图中
SQL>auditLOCKonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
锁定表、视图或物化视图
SQL>auditREADonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
对DIRECTORY对象的内容执行读操作
SQL>auditRENAMEonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
重命名表、视图或过程
SQL>auditSELECTonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
从表、视图、序列或物化视图中选择行
SQL>auditUPDATEonTEST_DR.TESTBYACCESSWHENEVERSUCCESSFUL;
更新表、视图或物化视图
细粒度审计
称为FGA,审计变得更为关注某个方面,并且更为精确。
由称为DBMS_FGA的PL/SQL程序包实现FGA。
使用标准的审计,可以轻松发现访问了哪些对象以及由谁访问,但无法知道访问了哪些行或列。
细粒度的审计可解决这个问题,它不仅为需要访问的行指定谓词(或where子句),还指定了表中访问的列。
通过只在访问某些行和列时审计对表的访问,可以极大地减少审计表条目的数量。
例如:
用户TAMARA通常每天访问HR.EMPLOYEES表,查找雇员的电子邮件地址。
系统管理员怀疑TAMARA正在查看经理们的薪水信息,因此他们建立一个FGA策略,用于审计任何经理对SALARY列的任何访问:
begin
dbms_fga.add_policy(
object_schema=> 'HR',
object_name=> 'EMPLOYEES',
policy_name=> 'SAL_SELECT_AUDIT',
audit_condition=>'instr(job_id,''_MAN'')>0',
audit_column=> 'SALARY'
);
end;
ADD_POLICY添加使用谓词和审计列的审计策略
DROP_POLICY删除审计策略
DISABLE_POLICY禁用审计策略,但保留与表或视图关联的策略
ENABLE_POLICY启用策略
与审计相关的数据字典视图
数据字典视图
说 明
AUDIT_ACTIONS
包含审计跟踪动作类型代码的描述,例如INSERT、DROPVIEW、DELETE、LOGON和LOCK
DBA_AUDIT_OBJECT
与数据库中对象相关的审计跟踪记录
DBA_AUDIT_POLICIES
数据库中的细粒度审计策略
DBA_AUDIT_SESSION
与CONNECT和DISCONNECT相关的所有审计跟踪记录
DBA_AUDIT_STATEMENT
与GRANT、REVOKE、AUDIT、NOAUDIT和ALTERSYSTEM命令相关的审计跟踪条目
DBA_AUDIT_TRAIL
包含标准审计跟踪条目。
USER_AUDIT_TRAILUSER_TRAIL_AUDIT只包含已连接用户的审计行
DBA_FGA_AUDIT_TRAIL
细粒度审计策略的审计跟踪条目
数据字典视图
说 明
DBA_COMMON_AUDIT_TRAIL
将标准的审计行和细粒度的审计行结合在一个视图中
DBA_OBJ_AUDIT_OPTS
对数据库对象生效的审计选项
DBA_PRIV_AUDIT_OPTS
对系统权限生效的审计选项
DBA_STMT_AUDIT_OPTS
对语句生效的审计选项
保护审计跟踪
审计跟踪自身需要受到保护,特别是在非系统用户必须访问表SYS.AUD$时。
内置的角色DELETE_ANY_CATALOG是非SYS用户可以访问审计跟踪的一种方法(例如,归档和截取审计跟踪,以确保它不会影响到SYS表空间中其他对象的空间需求)。
为了建立对审计跟踪自身的审计,以SYSDBA身份连接到数据库,并运行下面的命令:
SQL>auditallonsys.aud$byaccess;
现在,所有针对表SYS.AUD$的动作,包括select、insert、update和delete,都记录在SYS.AUD$自身中。
但是,您可能会问,如果某个人删除了标识对表SYS.AUD$访问的审计记录,这时会发生什么?
此时将删除表中的行,但接着插入另一行,记录行的删除。
因此,总是存在一些针对SYS.AUD$表的(有意的或偶然的)活动的证据。
此外,如果将AUDIT_SYS_OPERATIONS设置为True,使用assysdba、assysoper或以SYS自身连接的任何会话将记录到操作系统审计位置中,甚至OracleDBA可能都无法访问该位置。
因此,有许多合适的安全措施,用于确保记录数据库中所有权限的活动,以及隐藏该活动的任何尝试。
将审计相关的表更换表空间
由于AUD$表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD$移动到其他的表空间上。
可以使用下面的语句来进行移动:
sql>connect / as sysdba;
sql>alter table aud$ move tablespace ;
sql>alter index I_aud1 rebuild online tablespace ;
SQL> alter table audit$ move tablespace ;
SQL> alter index i_audit rebuild online tablespace ;
SQL> alter table audit_actions move tablespace ;
SQL> alter index i_audit_actions rebuild online tablespace ;
SQL>conn/assysdba
SQL>showparameteraudit
NAME TYPE VALUE
-----------------------------------------------------------------------------
audit_file_dest string /u01/app/oracle/admin/ORCL/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
SQL>altersystemsetaudit_sys_operations=TRUEscope=spfile; --审计管理用户(以sysdba/sysoper角色登陆)
SQL>altersystemsetaudit_trail=db,extendedscope=spfile;
SQL>startupforce;
SQL>showparameteraudit
NAME TYPE VALUE
-----------------------------------------------------------------------------
audit_file_dest string /u01/app/oracle/admin/ORCL/adump
audit_sys_operations boolean TRUE
audit_syslog_level string
audit_trail string DB,EXTENDED
如果在命令后面添加byuser则只对user的操作进行审计,如果省去by用户,则对系统中所有的用户进行审计(不包含sys用户).
例:
AUDITDELETEANYTABLE; --审计删除表的操作
AUDITDELETEANYTABLEWHENEVERNOTSUCCESSFUL; --只审计删除失败的情况
AUDITDELETEANYTABLEWHENEVERSUCCESSFUL; --只审计删除成功的情况
AUDITDELETE,UPDATE,INSERTONuser.tablebytest; --审计test用户对表user.table的delete,update,insert操作
撤销审计
SQL>noauditallont_test;
将审计结果表从system表空间里移动到别的表空间上
实际上sys.aud$表上包含了两个lob字段,并不是简单的movetable就可以。
下面是具体的过程:
altertablesys.aud$movetablespaceusers;
altertablesys.aud$movelob(sqlbind)storeas(tablespaceUSERS);
altertablesys.aud$movelob(SQLTEXT)storeas(tablespaceUSERS);
alterindexsys.I_AUD1rebuildtablespaceusers;
应用
语句审计
多层环境下的审计:
appserve-应用服务器,jackson-client
AUDITSELECTTABLEBYappserveONBEHALFOFjackson;
审计连接或断开连接:
AUDITSESSION;
AUDITSESSIONBYjeff,lori; --指定用户
审计权限(使用该权限才能执行的操作):
AUDITDELETEANYTABLEBYACCESSWHENEVERNOTSUCCESSFUL;
AUDITDELETEANYTABLE;
AUDITSELECTTABLE,INSERTTABLE,DELETETABLE,EXECUTEPROCEDUREBYACCESSWHENEVERNOTSUCCESSFUL;
对象审计:
AUDITDELETEONjeff.emp;
AUDITSELECT,INSERT,DELETEONjward.deptBYACCESSWHENEVERSUCCESSFUL;
取消审计:
NOAUDITsession;
NOAUDITsessionBYjeff,lori;
NOAUDITDELETEANYTABLE;
NOAUDITSELECTTABLE,INSERTTABLE,DELETETABLE,EXECUTEPROCEDURE;
NOAUDITALL; --取消所有statement审计
NOAUDITALLPRIVILEGES; --取消所有权限审计
NOAUDITALLONDEFAULT; --取消所有对象审计
清除审计信息
DELETEFROMSYS.AUD$;
DELETEFROMSYS.AUD$WHEREobj$name='EMP';
审计相关视图
STMT_AUDIT_OPTION_MAP --审计选项类型代码
AUDIT_ACTIONS --action代码
ALL_DEF_AUDIT_OPTS --对象创建时默认的对象审计选项
DBA_STMT_AUDIT_OPTS --当前数据库系统审计选项
DBA_PRIV_AUDIT_OPTS --权限审计选项
DBA_OBJ_AUDIT_OPTS
USER_OBJ_AUDIT_OPTS --对象审计选项
DBA_AUDIT_TRAIL
USER_AUDIT_TRAIL