的 说明DBA负责的安全和审计工作 启用标准数据库审计 指定审计选项 复查审计信息 维护审计线索 《Oracle Database Concepts》《Oracle数据库管理员指南》《Oracle 数据库安全性指南》 责任分离 责任分离的主要要求 DBA必须是可信任的,同时也必须承担责任(考虑因素) 滥用信任:DBA可能会滥用DBA_USERS视图中的加密密码 用审计线索保护受信任位置:审计线索会指定特定人员有没有违反规程和有没有破坏性行为。 必须共同分担DBA责任 绝对不要共享账户 DBA和系统管理员必须由不同的人员担任 分离操作员与DBA的责任 Oracle Database Valut: 数据库必须强制执行责任分离,或者不允许DBA查看某些或所有数据库schema中的数据,可以使用Oracle Database Vault选件。 数据库安全性 安全性功能 -限制对数据和服务的访问,Oracle DB通过提供细粒度的授权控制来限制数据库访问。 -验证用户 遵循简单规则的口令 比较严格的验证方法,令牌或公共密钥基础结构(PKI)证书 更严格的验证方法,通过诸如指纹,虹膜,骨组织模式等唯一生物学特征来识别用户。 监视可疑活动 监视合规性 监视或审计是安全过程不可缺少的一部分 强制性审计:不管其他审计选项或参数如何设置,所有Oracle DB都会审计特定的操作。由于数据库需要记录诸如授权用户连接等数据库活动,所以存在强制审计日志。 标准数据库审计:通过使用audit_trail初始化参数在系统级别启用。启用审计之后,选项要审计的对象和权限,并使用audit命令设置审计属性。 基于值审计:扩展了标准数据库审计的功能,不仅会捕获发生的审计事件,还会捕获插入,更新或删除的实际值。基于值审计是通过数据库触发器实施的。 细粒度审计(FGA):扩展了标准数据库审计的功能,从而可捕获发出的实际SQL语句,而不仅仅是发生事件的情况。 SYSDBA(和SYSOPER)审计:将DBA与审计者或安全管理员的审计责任分离开,审计者或安全管理员在操作系统审计线索中负责监视DBA的活动。 标准数据库审计
使用数据库审计,必须先将静态AUDIT_TRAIL参数设置为指向审计记录的存储位置。这样做可启用数据库审计。启用数据库审计并指定审计选项(登录事件,执行的系统和对象权限或使用的SQL语句)后,数据库开始收集审计信息。 -AUDIT_TRAIL参数设置为OS,审计记录存储在操作系统的审计系统中。ADUIT_FILE_DEST参数指定的文件中 -ADUIT_TRAIL参数设置为DB或DB,EXTENDED,可以在DBA_ADUIT_TRAIL视图参看审计记录 -ADUIT_TRAIL参数设置XML或XML,EXTENDED,审计记录会写入ADUIT_FILE_DEST参数指定的目录中的XML文件。使用V$XML_AUDIT_TRAIL视图可查看目录中的所有XML文件。 维护审计线索是一项重要的管理任务。审计线索可能会迅速地增长,具体取决于审计选项的审计重点。如果维护不当,审计线索会创建过多的记录,以至影响系统的性能。审计开销与生成的记录号直接相关。 ALTER SYSTEM SET ADUIT_TRAIL=[NONE|OS|DB|DB,EXTENDED|XML|XML,EXTENDED] SCOPE=SPFILE; 修改静态初始化参数之后重新启动数据库。 统一审计线索
Oracle DB进行标准审计和细粒度审计时跟踪相同的字段,这使您可以轻松分析数据库活动。为实现这点,标准审计线索和细粒度审计线索包含了彼此互补的属性。 通过标准审计收集的额外信息包括: -系统更改号(SCN),记录对系统的每一项更改。 -用户执行的确切SQL文本与SQL文本一起使用的绑定变量。只有已指定ADUIT_TRAIL=DB,EXTENDED的情况下,这些列才会出现。 通过细粒度审计收集的额外信息包括: -每个审计记录的序列号 -将源自一条语句的多个审计条目联系起来的语句编号。 公共属性包括: -用全球标准时间(UTC)表示的全球时间戳。这个字段在监视不同地理位置和不同时区时的数据库时特别有用。 -每个Real Application Cluster(RAC)实例的唯一实例编号。 -用于将一个事务处理的审计记录组成一组的事务处理标识符。 DBA_COMMON_AUDIT_TRAIL视图组合了标准审计日志记录和细粒度审计日志记录。 指定审计选项 -SQL语句审计 AUDIT <TABLE_NAME>; 可按用户名或者按成功或失败来设置SQL语句审计的重点: SQL>AUDIT TABLE BY HR WHENEVER NOT SUCCESSFUL; -系统权限审计(非重点和重点) AUDIT SELECT ANY TABLE,CREATE ANY TRIGGER; AUDIT SELECT ANY TABLE BY HR BY SESSION; 审计设置可以为<BY SESSION>或<BY ACCESS> -对象权限审计(非重点和重点) AUDIT ALL ON HR.EMPLOYEES; AUDIT UPDATE,SELECT,ON HR.EMEPLOYEES BY ACCESS; 可用來审计关于表,视图,过程,序列,目录和用户定义数据类型的操作.这种审计类型可按成功或失败设置审计的重点,而且可以按会话或访问权限分组.与系统权限审计不同,默认情况下,对象权限审计按会话分组.如果要为每个操作分别生成一条审计线索记录,必须显式指定<BY ACCESS>
audit all on hr.employees;--开启审计 col username format a20 col userhost format a30 col sql_text format a30 set linesize 300 select username,userhost,sql_text,timestamp from dba_audit_trail where username='DBMONITOR' and timestamp>=trunc(sysdate) and sql_text is not null / noaudit all on hr.employees;--关闭审计
使用和维护审计信息 最佳实践提示 审计会造成性能下降,其幅度与审计线索的写入数据成比例.要定制满足站点需求的审计选项,可只启用那些满足安全策略所需的选项.设置审计重点,以减少审计线索条目的数量.
基于值的审计 进行数据库审计时会记录审计对象中发生的插入,更新和删除操作,但是不会捕获更改的实际值.要扩展数据库审计,可使用基于值的审计,利用数据库触发器(事件驱动的PL/SQL构造)来捕获更改的值. CREATE OR REPLACE TRIGGER HR.HRSALARY_AUDIT AFTER UPDATE OF SALARY ON HR.EMPLOYEES REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW BEGIN IF :OLD.SALARY != :NEW.SALARY THEN INSERT INTO HR.AUDIT_EMPLOYEES VALUES(SYS_CONTEXT(‘USERENV’,’OS_USER’),SYSDATE,SYS_CONTEXT(‘USERENV’,’IP_ADDRESS’),:NEW.EMPLOYEE_ID||’ SALARY CHANGED FOR ‘|| :OLD.SALARY||’ TO ‘||:NEW.SALARY); END IF; END; / 细粒度审计 -根据内容监视数据访问 -审计SELECT,INSERT,UPDATE,DELETE和MERGE -可链接到表或视图中的一列或多列 -可以执行某个过程 -使用DBMS_FGA程序包进行管理 数据库审计会记录已发生某个操作这一事实,但是不会捕获关于导致操作的语句的信息。细粒度审计(FGA)扩展了审计功能,可捕获查询或处理数据的实际SQL语句。与标准数据库审计或基于之的数据库审计相比,FGA将重点审计的范围设置得更窄。可将FGA选项设置为按表或视图中的各个列进行审计,还可以将其设置为条件选项,以便只在符合管理员定义的特定规范时才捕获审计。FGA策略支持多个相关列。默认情况下,如果其中任何一个出现在SQL语句中,就会审计该语句。通过使用DBMS_FGA.ALL_COLUMNS和DBMS_FGA.ANY_COLUMNS,可对语句中是否使用了任何或全部相关列来进行审计。 可以使用DBMS_FGA PL\SQL程序包来创建对目标表或视图的审计策略。如果查询块中返回的任何与审计列和指定的审计条件相匹配,则审计事件会导致在审计线索中创建并存储审计记录。此外,审计事件还可执行某个过程。FGA自动将审计重点放在语句级别。一个SELECT语句会返回数千行,但只生成一条审计记录。 FGA策略
COL username FORMAT a20 COL userhost FORMAT a30 COL sql_text FORMAT a30 SET LINESIZE 300 SELECT username, userhost, sql_text, timestamp FROM dba_audit_trail WHERE username = 'DBMONITOR' AND timestamp >= TRUNC (SYSDATE) AND sql_text IS NOT NULL / BEGIN DBMS_FGA.add_policy (object_schema => 'HR',--FGA审计对象schema object_name => 'EMPLOYEES',--审计table policy_name => 'audit_emps_salary',--FGA审计名称 audit_condition => 'department_id=10',--FGA审计条件 audit_column => 'SALARY,COMMISSION_PCT',--FGA审计的列名 handler_schema => 'secure',--指定调用schema handler_module => 'log_emps_salary',--指定执行程式 enable => TRUE,--启用审计 statement_types => 'SELECT,UPDATE');--审计dml类型 END; / BEGIN--删除fga审计 DBMS_FGA.drop_policy (object_schema => 'HR', object_name => 'EMPLOYEES', policy_name => 'audit_emps_salary'); END; / BEGIN DBMS_FGA.add_policy (object_schema => 'HR', object_name => 'EMPLOYEES', policy_name => 'audit_emps_salary', audit_condition => 'department_id=10', audit_column => 'SALARY,COMMISSION_PCT', --handler_schema => 'secure',--如果不指定存储路径,默认会存放在dba_fga_audit_trail视图中 -- handler_module => 'log_emps_salary', enable => TRUE, statement_types => 'SELECT,UPDATE'); END; / SELECT salary FROM employees WHERE department_id = 10; SELECT commission_pct FROM employees WHERE department_id = 10; SELECT salary, commission_pct FROM employees WHERE department_id = 10; DELETE employees WHERE department_id = 10; SELECT salary, commission_pct FROM employees; COL DB_USER FORMAT a20 COL userhost FORMAT a30 COL sql_text FORMAT a30 SET PAGESIZE 600 SET LINESIZE 300 ALTER SESSION SET nls_date_format='YYYY-MM-DD HH24:MI:SS'; SELECT DB_USER, userhost, sql_text, timestamp FROM dba_fga_audit_trail WHERE --DB_USER='DBMONITOR' timestamp >= TRUNC (SYSDATE) AND sql_text IS NOT NULL / DB_USER USERHOST SQL_TEXT TIMESTAMP -------------------- ------------------------------ ------------------------------ ------------------- DBMONITOR ***************** SELECT salary FROM hr.employee 2018-03-30 11:04:44 s WHERE department_id=10 HR ***************** SELECT salary FROM employees w 2018-03-30 11:15:59 here department_id=10 HR ***************** SELECT commission_pct FROM emp 2018-03-30 11:16:31 loyees WHERE department_id=10 HR ***************** SELECT salary,commission_pct f 2018-03-30 11:17:00 rom employees WHERE department _ID=10 HR ***************** SELECT salary,commission_pct f 2018-03-30 11:17:00 rom employees
审计的DML语句,注意事项 -如果满足FGA谓词并且引用了相关列,则会对记录进行审计. -无论指定的列是什么,都会审计DELETE语句. -会审计MEEGE语句以及生成的INSERT/UPDATE和DELETE语句。
BEGIN DBMS_FGA.add_policy (object_schema => 'HR', object_name => 'EMP', policy_name => 'audit_emp_salary', audit_condition => 'department_id=90', --audit_column => 'SALARY,COMMISSION_PCT', --handler_schema => 'secure', -- handler_module => 'log_emps_salary', enable => TRUE, statement_types => 'DELETE'); END; / BEGIN DBMS_FGA.drop_policy (object_schema => 'HR', object_name => 'EMP', policy_name => 'audit_emp_salary'); END; / DELETE emp WHERE department_id = 90; SELECT SALARY, COMMISSION_PCT FROM emp WHERE department_id = 90; DELETE emp ; SELECT DB_USER, userhost, sql_text, timestamp FROM dba_fga_audit_trail WHERE --DB_USER='DBMONITOR' timestamp >= TRUNC (SYSDATE) AND sql_text IS NOT NULL /
FGA准则 -要审计所有行,请使用NULL审计条件 -要审计所有列,请使用NULL审计列 -策略名必须唯一 -创建策略时,审计的表或视图必须已经存在 -如果审计条件语法无效,则访问审计的对象时会出现ORA-28112错误 -如果表中不存在审计的列,则不会审计任何行 -如果不存在事件处理程序,并不会返回任何错误,仍会创建审计记录。查询时触发‘ORA-28137: 无效FGA 审计程序’ SYSDBA审计 具有SYSDBA或SYSOPER权限的用户可在数据库处于关闭状态时进行连接。 -审计线索必须存储在数据库外部 -始终会对以SYSDAB或SYSOPER身份执行的连接进行审计 -可使用AUDIT_SYS_OPEARATIONS启用对SYSDBA或SYSOPER操作的附加审计 -可使用AUDIT_FILE_DEST控制审计存储路径 维护审计线索 应根据最佳实践准则来维护审计线索: -复查和存储旧记录 -避免出现存储问题 -避免记录丢失,标准审计的审计线索存储在AUD$表中,FGA审计线索存储在FGA_LOG$表中。默认情况下,这两个表都是SYSTEM表空间中。通过使用数据泵导出和导入可将这两个表迁移到另一个表空间中。
ALTER TABLE SYS.AUD$ MOVE TABLESPACE <TABLESPACE_NAME>; SYS.FGA_LOG$--表上有LONG字段无法进行直接迁移,可采用DROP再CREATE. 3:53:14 SQL> select table_name,tablespace_name from dba_tables 13:53:21 2 where table_name='AUD$'; TABLE_NAME TABLESPACE_NAME ---------------- ------------------------------------------------------------ AUD$ TP 13:53:23 SQL> ALTER TABLE SYS.AUD$ MOVE TABLESPACE SYSTEM; 13:53:59 SQL> select table_name,tablespace_name from dba_tables 13:54:02 2 where table_name='AUD$'; TABLE_NAME TABLESPACE_NAME ----------------- ------------------------------------------------------------ AUD$ SYSTEM
Oracle Audit Vault 合并和保护审计数据 -Oracle 9i发行版2和更高的版本 -SQL Server 2000,2005 -IBM DB2 UDB 8.5和9.2 -Sybase ASE 12.5-15.0 -安全并可伸缩 -清理源Oracle审计数据 集中式报告 -报表界面进行了更新,Oracle Application Express -合规性标准报表 -新增定制报表 安全威胁预警 -检测和警告安全相关事件 总结 审计类型:强制审计,标准审计,基于值的审计,细粒度的审计,SYSDBA/SYSOPER审计 标准审计:audit_trail参数控制,NONE,OS,DB, DB EXTENDED,XML,XML, XML,EXTENDED,通过DBA_AUDIT_TRAIL视图查询,基表AUD$ 基于值的审计:触发器实现 细粒度的审计:FGA,DBMS_FGA.ADD_POLICY,通过DBA_FGA_AUDIT_TRAIL视图查看,基表FGA_LOG$ SYSDBA/SYSOPER审计