作为企业内部监视的一环,对于DB的管控是首当其冲。以往常见的做法是购买第三方产品(比如AuditMaster),通过第三方来监视DB。但是问题多多
1.
第三方产品系一般会把取得的监控情报按照自己的格式存储。就是为了产品粘度,你只能通过第三方的界面来看。或再2次开发通过其接口,抽出导入自己的DB。好麻烦有没有啊。
2.OS有Out of support的问题,金融企业尤其重要。 一旦Out of
support, OS将不会有Patch对应,也就是增加安全方面的风险。Out of
support是绝不被允许的。也就是需要升级OS,
OS一升级,第三方产品也得升级,这就是费用。
Audit
实际,Oracle11g中完全可以简单的实现Audit监察机能,取得按照金融厅要求的情报信息:
1. Logon情报
谁,在什么时候,通过那个终端,使用什么用户名,访问DB时间,成功与否等。
2. SQL Trace情报
谁,在什么时候,通过那个终端,使用什么工具,访问了什么,发出的SQL文为何等。
Oracle内部的Audit机能完全可以覆盖上诉要求。
1的代码:
#!/bin/bash
export
ORACLE_HOME=/u00/app/oracle11/product/11.2.0.2.0
export
PATH=${ORACLE_HOME}/bin:${PATH}
export ORACLE_SID=COMT03
LOG_FILE=/home/oracle11/workATJ/AuditMaster/log/load_audit_logon_`date
+"%Y%m%d_%H%M%S"`.log
RETVALUE=`sqlplus -S /nolog
<
conn XXX/XXX
spo ${LOG_FILE}
INSERT INTO
T_AUDIT_LOGON
SELECT
TIMESTAMP,
USERNAME,
TERMINAL,
OS_USERNAME,
ACTION_NAME,
LOGOFF_TIME,
DECODE(
RETURNCODE,
0, 'SUCCEEDED',
'FAILED'
) RETURNCODE
FROM
DBA_AUDIT_SESSION das
WHERE NOT EXISTS ( SELECT 1
FROM ORAH01.T_PA_EXCLUDE_ORACLE_USER eu WHERE
EU.USERNAME = DAS.USERNAME)
ORDER BY timestamp;
COMMIT;
spo off
EOF`if [[ $RETVALUE
== *"ORA-"* ]]
then
RETVALUE=-1;
fi
echo
$RETVALUE
2的代码:
#!/bin/bash
export
ORACLE_HOME=/u00/app/oracle11/product/11.2.0.2.0
export
PATH=${ORACLE_HOME}/bin:${PATH}
export ORACLE_SID=COMT03
LOG_FILE=/home/oracle11/workATJ/AuditMaster/log/load_audit_sqltrace_`date
+"%Y%m%d_%H%M%S"`.log
RETVALUE=`sqlplus -S /nolog
<
conn XXX/XXX
spo ${LOG_FILE}
INSERT INTO
T_AUDIT_SQL_TRACE
SELECT
EXTENDED_TIMESTAMP,
USERNAME,
TERMINAL,
USERHOST,
OBJ_NAME,
ACTION_NAME,
LTRIM(SQL_TEXT,2000)
FROM DBA_AUDIT_TRAIL
dat
WHERE NOT EXISTS ( select 1
from ORAH01.T_PA_EXCLUDE_ORACLE_USER eu where
eu.username = dat.username)
AND
OBJ_NAME NOT IN ('STMT_AUDIT_OPTION_MAP','SYSTEM_PRIVILEGE_MAP'
,'AUD$' ,'DUAL',
'DBA_AUDIT_TRAIL'
,'AUDIT_ACTIONS','SQLPLUS_PRODUCT_PROFILE',
'PRODUCT_PRIVS','DBA_AUDIT_SESSION')
ORDER BY
EXTENDED_TIMESTAMP;
COMMIT;
spo off
EOF`if [[ $RETVALUE
== *"ORA-"* ]]
then
RETVALUE=-1;
fi
echo
$RETVALUE
请看到最后这里的各位亲留意紫色的部分,可不是随便的return下
$?哦。
因为执行SQL即便出现问题,$?也不会报错。上诉的方法是可以捕捉Oracle的error的,在实际的运用中,意义很大,往往7*24的monitoring系统监视的就是返回值。