Oracle数据库数据访问安全与审计方案

这是一份真实的客户需求实现方案。客户要求监控到某些关键表在什么时间段、什么用户、什么应用程序以及访问哪些具体的记录。

数据库系统是Oracle9.2.0.1,它的审计功能可实现该需求。

基于审计对正常运行的应用的性能压力,需要设置特定时间段的数据访问审计。

从审计日志中获得的监控详细信息,那些表被什么应用访问,什么时候访问。提供详细报告信息。

(miki西游@mikixiyou 的文档,原文链接: http://mikixiyou.iteye.com/blog/1547353)

1       审计功能原理

Oracle数据库的审计功能来分析管理数据库的访问安全。

通常,审计的用途如下:

可审计特定的用户、表、或具体的行的当前操作,或者影响特定的内容。

例如,什么用户查询了什么表,甚至表中那些记录。

调查可疑的操作。

例如,如果有用户正在删除某些表的数据,审计人员可使用审计功能审计所有的数据库连接,数据库成功或者不成功的删除操作。

通报没有被授权的用户正操作或者删除数据的所有者,该非法用户有过多的不被允许的权限,可检查出权限设置问题。

监控和收集特殊的数据库行为的数据。

检测授权和访问控制的实施的问题。

例如,可以创建一个希望的审计策略。这个审计策略保证其他情况下绝不会生成审计记录。但是,如果这个策略下生成了审计记录,就可以知道有其他的安全控制没有被正确地实现。

审计一般分为四类,分别为语句审计、权限审计、对象审计、细粒度审计。

其中前三类为标准审计,在ORACLE数据库各个版本中都有,最后一类称为细粒度审计,在ORACLE9i以后的版本中出现,并在10g中功能增强。

语句审计 可审计特定类型的操作语句,甚至可以审计某些类型的一系列操作。如,audit table可审计表上的所有的DDL语句。

权限审计 可审计相关操作的系统权限。如,audit create table。

对象审计 可审计精确的对象上的明确的语句,如audit select on temployees。

对象审计更精确,可审计一个对象上唯一一个明确类型的语句,并且作用于数据库中所有的用户。

细粒度审计 可审计基于内容的细粒度的数据访问和操作,如某个字段的值大于某值。

在ORACLE10g中,就这两大类审计,比较两者的异同。

标准审计必须用参数 AUDIT_TRAIL 在数据库级启用。这个参数不是动态的;必须重启数据库来使其生效。相比而言,细粒度审计不需要任何参数修改。

一旦被设置在一个对象上,标准审计将保持在那里。要解除它,必须用 NOAUDIT 命令删除审计选项。这可能很不方便,因为在一个表上丢弃审计选项也将丢弃元数据信息。然而,细粒度审计 可以临时禁用和启用,不丢失任何元数据信息。

细粒度审计 只能够处理四种类型的语句:SELECT、INSERT、UPDATE 和 DELETE。相比而言,常规审计可以处理其它许多语句和权限,甚至会话连接和断开。

标准审计每次会话只创建一条记录(按会话)或每次访问对象创建一条记录(按访问)这种占用资源很少的方式对于控制审计线索表中的空间非常重要。细粒度审计 并不是同样节省资源;它每次访问运行一次 — 使得线索更大。

通过记录线索,标准审计可以用来检测任何中断企图,如果企图没有成功,则将产生错误代码。而 细粒度审计不能。

标准审计可以写数据库表或 OS 文件。后者在审计员(不是数据库管理员)能够访问线索时非常有用。这个选项保护了审计线索的完整性。然而,细粒度审计 日志仅写到数据库表 FGA_LOG$ 中。

标准审计可以设置用于默认对象。当表是在运行期创建时,这个功能变得极为有用:默认的审计选项允许没有数据库管理员干预的审计。这在 细粒度审计中是不可能的,用户必须在一个现有的表上创建策略,上述的情况只能在表已创建之后才可能发生。

在细粒度审计中,审计更加灵活 — 仅当访问某些列,当某个特定的条件为真时等等。这种多功能性在您需要控制线索的增长时非常方便。

在 细粒度审计 中,SQL 赋值变量默认被捕获。在常规审计中,必须把初始化参数 audit_trail设为 db_extended,以启用这一功能。

权限上的差异:常规审计需要审计系统或语句权限;细粒度审计只需要 dbms_fga 程序包上的运行权限。

根据需求定义,采用对象审计功能。如果需求审计到具体表中的记录,可使用细粒度审计来实现。

在这里,使用对象审计功能来实现我们的项目需求。

2       实现方法

2.1    修改初始化参数AUDIT_TRAIL。

Alter system set audit_trail=DB scope=spfile;

或者手工修改数据库初始化文件。

1.1    AUDIT_TRAIL

Parameter type String

Syntax AUDIT_TRAIL = {NONE | FALSE | DB | TRUE | OS}

Default value There is no default value.

Parameter class Static

AUDIT_TRAIL enables or disables the automatic writing of rows to the audit trail.

Values:

NONE or FALSE

Audit records are not written.

OS

Enables system-wide auditing and causes audited records to be written to the operating system's audit trail.

DB or TRUE

Enables system-wide auditing and causes audited records to be written to the database audit trail (the SYS.AUD$ table).

2.2    检查是否存在sys.aud$表

Select * from sys.aud$;

如果不存在,需要使用ORACLE系统提供的脚本cataaud.sql创建。

2.3    重启数据库,使修改参数生效

Shutdown immediate;

Startup open;

Show parameter audit_trail;

SQL> connect / as sysdba

已连接。

SQL> show parameter audit_trail

NAME                                 TYPE        VALUE

------------------------------------ ----------- -----------------------------

audit_trail                          string      DB_EXTENDED

SQL>

2.4    检查审计相关视图,确认是否存在审计项目。

Select * from dba_stmt_audit_opts;

Select * from dba_priv_audit_opts;

Select * from dba_obj_audit_opts;

如果上述结果为空,则表示数据库中无任何要审计的内容。

2.5    AUDIT审计功能使用。

Audit select on scott.emp

审计scott模式中emp表,所有这个查询这个表的操作都被对象审计功能记录在sys.aud$表中。

Audit使用语法如下:

AUDIT

  { sql_statement_clause | schema_object_clause | NETWORK }

  [ BY { SESSION | ACCESS } ]

  [ WHENEVER [ NOT ] SUCCESSFUL ] ;

缺省值为audit *** by session whenever successful

2.6    检查审计结果视图。

查询sys.aud$表或者dba_audit_trail视图,可得到审计结果记录。

Aud$表的记录会一直增大,而该表所在的表空间为system表空间。System表空间满会导致数据库挂起。所以,在数据库审计功能打开后,需要时刻关注aud$表的增长情况。

可移动aud$表到其他表空间,以避免system表空间满导致数据库系统挂起的问题。

Aud$表中的记录也需要定期清除,使用命令truncate table aud$;。

Aud$表结构如下:

SQL> desc aud$;

Name Type Nullable

SESSIONID NUMBER  

ENTRYID NUMBER  

STATEMENT NUMBER  

TIMESTAMP# DATE Y

USERID VARCHAR2(30) Y

USERHOST VARCHAR2(128) Y

TERMINAL VARCHAR2(255) Y

ACTION# NUMBER  

RETURNCODE NUMBER  

OBJ$CREATOR VARCHAR2(30) Y

OBJ$NAME VARCHAR2(128) Y

AUTH$PRIVILEGES VARCHAR2(16) Y

AUTH$GRANTEE VARCHAR2(30) Y

NEW$OWNER VARCHAR2(30) Y

NEW$NAME VARCHAR2(128) Y

SES$ACTIONS VARCHAR2(19) Y

SES$TID NUMBER Y

LOGOFF$LREAD NUMBER Y

LOGOFF$PREAD NUMBER Y

LOGOFF$LWRITE NUMBER Y

LOGOFF$DEAD NUMBER Y

LOGOFF$TIME DATE Y

COMMENT$TEXT VARCHAR2(4000) Y

CLIENTID VARCHAR2(64) Y

SPARE1 VARCHAR2(255) Y

SPARE2 NUMBER Y

OBJ$LABEL RAW(255) Y

SES$LABEL RAW(255) Y

PRIV$USED NUMBER Y

SESSIONCPU NUMBER Y

NTIMESTAMP# TIMESTAMP(6) Y

PROXY$SID NUMBER Y

USER$GUID VARCHAR2(32) Y

INSTANCE# NUMBER Y

PROCESS# VARCHAR2(16) Y

XID RAW(8) Y

AUDITID VARCHAR2(64) Y

SCN NUMBER Y

DBID NUMBER Y

SQLBIND CLOB Y

SQLTEXT CLOB Y

dba_audit_trail视图结构如下:

Name Comments

OS_USERNAME Operating System logon user name of the user 

whose actions were audited

USERNAME Name (not ID number) of the user

whose actions were audited

USERHOST Client host machine name

TERMINAL Identifier for the user's terminal

TIMESTAMP Date/Time of the creation of the audit trail entry 

(Date/Time of the user's logon for entries created by AUDIT SESSION)

in session's time zone

OWNER Creator of object affected by the action

OBJ_NAME Name of the object affected by the action

ACTION Numeric action type code.

The corresponding name of the action type 

(CREATE TABLE, INSERT, etc.)

is in the column ACTION_NAME

ACTION_NAME Name of the action type corresponding 

to the numeric code in ACTION

NEW_OWNER The owner of the object named 

in the NEW_NAME column

NEW_NAME New name of object after RENAME, 

or name of underlying object

(e.g. CREATE INDEX owner.obj_name 

ON new_owner.new_name)

OBJ_PRIVILEGE Object privileges granted/revoked 

by a GRANT/REVOKE statement

SYS_PRIVILEGE System privileges granted/revoked 

by a GRANT/REVOKE statement

ADMIN_OPTION If role/sys_priv was granted 

WITH ADMIN OPTON, A/-

GRANTEE The name of the grantee specified 

in a GRANT/REVOKE statement

AUDIT_OPTION Auditing option set 

with the audit statement

SES_ACTIONS Session summary. 

A string of 12 characters, 

one for each action type,

in thisorder: Alter, Audit, 

Comment, Delete, Grant, Index,

Insert, Lock, Rename, Select, 

Update, Flashback.

Values:  "-" = None, "S" = Success, 

"F" = Failure, "B" = Both

LOGOFF_TIME Timestamp for user logoff

LOGOFF_LREAD Logical reads for the session

LOGOFF_PREAD Physical reads for the session

LOGOFF_LWRITE Logical writes for the session

LOGOFF_DLOCK Deadlocks detected during the session

COMMENT_TEXT Text comment on the audit trail entry.

Also indicates how the user was authenticated.

The meth od can be one of the following:

1. "DATABASE" - aut hentication was done by pass word.

2. "NETWORK"  - aut hentication was done by Net8

or the Advanced Networking Option.

3. "PROXY"    - the client was authenticated by another user.

The name of the proxy user follo ws the method type.

SESSIONID Numeric ID for each Oracle session

ENTRYID Numeric ID for each audit trail entry in the session

STATEMENTID Numeric ID for each statement run 

(a statement may cause many actions)

RETURNCODE Oracle error code generated by the action.  

Zero if the action succeeded

PRIV_USED System privilege used to execute the action

CLIENT_ID Client identifier in each Oracle session

ECONTEXT_ID Execution Context Identifier for each action

SESSION_CPU Amount of cpu time used 

by each Oracle session

EXTENDED_TIMESTAMP Timestamp of the creation of audit trail entry

(Timestamp of the user's logon for entries created by AUDIT SESSION)

in session's time zone

PROXY_SESSIONID Proxy session serial number,

if enterprise user has logged through proxy mechanism

GLOBAL_UID Global user identifier for the user, 

if the user had logged in as enterprise user

INSTANCE_NUMBER Instance number as specified 

in the initialization parameter file 'init.ora'

OS_PROCESS Operating System process identifier 

of the Oracle server process

TRANSACTIONID Transaction identifier of the transaction 

in which the object is accessed or modified

SCN SCN (System Change Number) of the query

SQL_BIND Bind variable data of the query

SQL_TEXT SQL text of the query

2.7    解除对象的审计功能

在确认审计结束后,务必解除该对象的审计功能。命令如下:

Noaudit select on scott.emp;

猜你喜欢

转载自mikixiyou.iteye.com/blog/1547353