在银行、保险等重要的
金融行业,加强关键程序和生产数据的安全建设对于保障业务的正常开展具有十分重要的现实意义。本文立足于业务操作、程序维护和进库处理这三个主要的安全隐患环节,利用Unix Shell语言工具和Informix Audit技术,在程序文件和业务数据的风险防范方面进行了一些有益的探索,建立了一套比较完善的安全保障机制,并提供了具体的实现途径,具有较强的实用性。
一、业务操作的安全对策
采用控制Unix系统提示符的进入,设立一个封闭的
应用系统环境的
方法。在正式的生产环境中,各种应用系统的直接用户,如业务终端用户和业务管理用户对
计算机知识一般不是很了解,他们的工作职责是在程序的控制下,用合法的系统用户和口令字注册并受限于程序画面,执行规定的业务操作,而不能让其接触到Shell提示符,从而对生产环境中的程序和业务数据形成第一级保护屏障。具体做法是:编制Shell语言程序.safe文件,并在系统注册用户的.profile文件最后加入一行exec .safe。
.safe的源程序范例清单如下:
cond=true
while [ $cond ]
do
clear
echo “”
echo “业务处理系统菜单”
echo “”
echo “ ( $HOST )”
echo “”
echo “ 1)…… ”
echo “ 2)…… ”
echo “ q)…… ”
echo “”
echo “请选择:\c ”
read choice
case $choice in
1) echo “请输入口令:”
stty -echo
read passwd
stty echo
if test $passwd = one
then
…
fi
;;
2) echo “请输入口令:”
stty -echo
read passwd
stty echo
if test $passwd = two
then
…
fi
;;
q) exit
;;
esac
done
.safe文件放在系统用户的注册目录下,.profile和.safe文件权限建议设置为500,并在系统管理员的监控之下。该Shell程序可封锁进入提示符的任何企图,把用户与文件系统、数据库隔离开来;另外,在实际应用中为减少数据库用户线索数等应用开销,同一应用系统常被分为不同模块供不同权限的操作员使用。该Shell程序可以实现对一个系统注册用户提供多个操作分支,且每个操作分支都能设置自己的安全口令,同时还可将相关的应用列在同一个Shell菜单中,提供一个系统注册名供用户选择使用,以减少增加注册用户的系统开销。
二、程序维护的风险防范
采用归档在提示符下操作的方法,形成有力的监督机制。因为工作需要,一般在生产环境中单独为程序维护人员建立一个系统帐户,由于工作性质特殊,程序维护人员仍难免要直接到提示符下操作,如何如实记录程序维护人员在提示符下的操作轨迹,以供事后稽核和备查,是程序和业务数据安全性方面第二层需要考虑的
问题。
在Unix系统中,每个注册用户都有一个记录其Shell轨迹的.sh_history文件,但却不能区分是何时从局域网上哪台机器用何身份发出的Shell命令,因而缺乏针对性起不到监督作用。在局域网中,程序维护人员一般每人配有一台PC机,每台PC机的IP地址确定了用机人的身份。对某一台业务主机来讲,可以生成一个文件.ipcode,该文件包含了局域网中每个IP地址与该业务主机每个系统注册用户的组合和局域网中每台其它主机与该业务主机每个系统注册用户的组合。通过环境变量Histfile对.ipcode文件中每个组合设置各自相应的Shell轨迹文件,为每个具体的用机者建立一份详详细细的Shell档案,使在Shell提示符下发生的每笔操作行为有证可查。具体做法是,在每个系统注册用户的.profile文件中加入如下Shell语句段:
NETTERM=‘tty|cut -c 6-’
NETIP=‘finger|grep $NETTERM “ ”|cut -c 60-’
NETTTY=‘cat /var/adm/shhist/.ipcode |grep $LOGNAME“|”$NETIP|cut -f1 -d “|” ’
HISTFILE=/var/adm/shhist/.shhist.$NETTTY
export HISTFILE
ksh -o vi
相应地,在类似上述.safe的文件中增加一个菜单选项,提供程序维护人员进入系统提示符的口令:
echo “请输入口令:”
stty -echo
read passwd
stty echo
if test $passwd = shell
then
sh
fi
;;
.ipcode文件每行用管道线“|”作域间分隔符,格式为:
序号|注册名|IP地址(或主机名)
初次启动该机制时,一次性地在/var/adm/shhist目录下建立.ipcode文件以及与其相对应的.shhist.1、.shhist.2等空Shell归档文件(/var/adm/shhist只是本文推荐目录)。
在每天主机开启时用Unix系统命令at运行/var/adm/shhist/.timer文件,给所有的Shell轨迹归档文件每隔一段时间加上时间标签。本文中该程序设置为每晚11时前不间断运行,.timer程序清单如下:
time= “‘date|cut -c 12-13’”
cond = true
if test $time -le 23
then
while [ $cond ]
do
for i in ‘ls /var/adm/shhist/.shhist’
do
echo ‘date’>>$i
done
sleep 60
done
fi
三、进库处理的稽核审计
审计是要跟踪重要的数据库活动事件,防范进库操作风险。在日常实际
应用中,由于应用系统的不尽完善,特别是对一些特殊的业务处理无法一一编制相应的程序而仍不得不进库操作。把原始的业务生产库表数据直接暴露给程序维护人员,其数据的风险是极其巨大的,对数据有意的破坏或无意的维护处理不当,都有可能造成无法估量的损失。因此,对这些特殊的进库操作行为如何进行有效的稽核和风险防范,就成为重中之重。原则上每一项进库操作都应留有痕迹,记录下该项操作的各种属性,保留必要的时限以备审查,防止操作者否认该项操作而推卸责任。利用Informix 数据库提供的audit安全审计技术,对一些重要的数据库操作事件进行审计跟踪,便可以构筑防范数据风险关键的、最后的一道防线。
建立缺省和专用的audit mask,立足于对缺省的default_mask应尽可能多地设置审计事件,对缺乏维护经验的用户也应多设置一些审计事件,而且主要是对一些执行成功的事件进行审计跟踪。使用操作系统的ps命令,通过终端号tty值获得进程号pid和IP地址,以进程号pid值为关联,将审计事件与相应的IP地址挂起钩来,进行具体的定位,有关audit的设定和操作命令如下:
onaudit -l 1 (将审计机制置开状态)
onaudit -p /usr/informix/adt/log (创建audit审计文件存放目录)
onaudit -a -u _dml -e +DLRW,INRW,RDRW(创建审计跟踪DLRW,INRW,RDRW事件的用户模板_dml)
onaudit -a -u whyw -r _dml(将用户whyw的审计模式定义为模板_dml的)
onaudit -o (显示audit mask表
sysmaster@sysaudit中的记录)
onaudit -l -u whyw (查看whyw用户的审计模式)
首先,应在每天主机开启时用Unix系统at命令执行下述的/usr/informix/adt/.trace文件,生成/usr/informix/adt/.stand文件,/usr/informix/adt/.stand文件每行格式为用户名|进程号|IP地址|时间:
cond = true
while [ $cond ]
do
time= “‘date|cut -c 12-13’”
if test $time -le 23
then
for i in ‘ps -ef|grep dbaccess|grep -v “grep dbaccess”|cut -c 34-40’
do
user=‘ps -ef|grep dbaccess|grep -v “grep dbaccess”|grep $i|cut -c -8’
ppid=‘ps -ef|grep dbaccess|grep -v “grep dbaccess”|grep $i|cut -c 10-14’
pid=‘echo $ppid’
ip=‘finger|grep $i|cut -c 60-’
date_time= “‘date’”
echo $user“|”$pid“|”$ip“|”$date_time >> /usr/informix/adt/.temp
done
for i in ‘cat /usr/informix/adt/.temp’
do
no_time=‘echo $i | cut -f1-3 -d “|”’
for j in ‘grep $no_time /usr/informix/adt/.stand’
do
grep -v $j /usr/informix/adt/.temp > /usr/informix/adt/.mide
cp /usr/informix/adt/.mide /usr/informix/adt/.temp
done
done
cat /usr/informix/adt/.temp >> /usr/informix/adt/.stand
cat /dev/null > /usr/informix/adt/.temp
sleep 10
else
break
fi
done
其次,应根据具体情况,选择一些重要的、有针对性的事件进行审计跟踪,以下项目仅供
参考:
ADCK(Add Chunk)、ALIX(Alter Index)、ALTB(Alter Table)、CRAM(Create Audit Mask)、CRDB(Create Database)、CRDS(Create Dbspace)、CRIX(Create Index)、CRRL(Create Role)、CRSP(Create Stored Procedure)、CRTB(Create Table)、CRTR(Create Trigger)、DLRW(Delete Row)、DRAM(Delete Audit Mask)、DRBS(Drop Blobspace)、DRCK(Drop Chunk)、DRDB(Drop Database)、DRDS(Drop Dbspace)、DRIX(Drop Index)、DRRL(Drop Role)、DRSP(Drop Stored Procedure)、DRTB(Drop Table)、DRTR(Drop Trigger)、DRVW(Drop View)、EXSP(Execute Stored Procedure)、GRDB(Grant Database Access)、GRTB(Grant Table Access)、INRW(Insert Row)、LGDB(Change Database Log Mode)、LKTB(Lock Table)、ONAU(Onaudit)、ONIN(Oninit)、ONMN(Onmonitor)、ONMO(Onmode)、ONPA(Onparamas)、ONSH(Onshowaudit)、ONSP(Onspaces)、ONST(Onstat)、ONTP(Ontape)、RNDB(Rename Database)、RNTC(Rename Table/Column)、SOSP(System Command Stored ProCedure)、STDP(Set Database Password)、STLM(Set Lock Mode)、USTB(Update Statistics Table)、USSP(Update Statistics Stored Procedure)。
成功执行的审计事件名相应地贯以字母S即可,如SADCK、SALIX等。
最后,为方便对审计记录进行保存、查询和
分析,可专门建立一个名为auditlog的表存储审计记录,并定期地把Informix生成的审计文件的
内容装载到该表中,该表具有与审计文件格式相对应的结构,具体如下:
create table auditlog (
adttag char(4),
date_time datetime year to fraction(3),
hostname char(18),
pid int,
server char(18),
username char(8),
errno int,
event char(4),
dbname char(18),
tabid int,
objname char(18),
extra_1 int,
partno int,
row_id int,
login char(8),
flags int,
extra_2 varchar(160,1))
同时,创建一个用户表user,用来存储用户名、进程号、IP地址和时间信息,并通过进程号pid与auditlog表相关联,user表结构如下:
create table user (
username char(8),
pid int,
ip char(15),
date_time datetime year to fraction(3))
假定auditlog表和user表在数据库zxdb中,可以考虑在每天日结时,将当天的审计信息和用户信息追加到auditlog表和user表中。对user表直接按上述生成的/usr/informix/adt/.stand文件格式内容进行load;对auditlog表则需先用Informix的onshowaudit命令进行格式整理,再用生成的audit.log文件进行load,整个处理可用Unix系统的at命令触发下面的/usr/informix/adt/.daily文件自动地定时完成(假设只对whyw用户设置了审计跟踪机制,多个用户审计跟踪情形可类似处理):
onaudit -l 1
cat /dev/null > /usr/informix/adt/audit.log
for i in ‘ls /usr/informix/adt/log’
do
onshowaudit -l -u whyw -f /usr/informix/adt/log/$i|grep ONLN >> /usr/informix/adt/audit.log
rm /usr/informix/adt/log/$i
done
dbaccess zxdb << !
load from /usr/informix/adt/audit.log insert into auditlog;
load from /usr/informix/adt/.stand insert into user;
!
cat /dev/null > /usr/informix/adt/.stand
在Unix系统的/etc/rc2.d目录下创建一个文件S99log,每天主机开启时可定时触发运行本文涉及到的.timer、.trace和.daily文件。S99log文件内容如下:
at -m -f /var/adm/shhist/.timer 0630am tomorrow
at -m -f /usr/informix/adt/.trace 0630am tomorrow
at -m -f /usr/informix/adt/.daily 0600am tomorrow
四、结束语
以上针对程序和生产数据的安全性,提供了三种稽核防范措施,初步形成了程序和数据的一种安全机制,从客观上做到操作责任具有可追溯性,切实地防范风险。但技术措施仅仅是一种手段,更重要的是要不断加强业务操作人员和程序维护人员的安全意识
教育,并建立严格的内控制度。诸如坚持开发环境和生产环境严格分开;控制主机间用户对等访问和数据库服务器间的连接访问;加强程序版本测试减少程序潜在安全漏洞等措施,从不同的角度共同培育安全生产的
计算机应用环境。
上述程序及命令均在Fujitsu GP7000 Model 400 小型机的Solaris 2.6 和Informix Online 7.30.UC2系统平台上实现。