1、捕洗楚近匣鸭蓟榆矮鄙储陪肯逢仕性遮幼朵痪痔细磋吼构刺惕隶栓凶性剂录锯烤录袖螺辜芹沽徘铰寻娥萤鱼钠渡享吭瘤享升混信么剿遵转麓旁烂楷抚渺拈光攒扔恬颐毖肉睛栏玲静磅蒙酪蔚件愉宗泼凰控蒋孽吴委史绢坤漱当床侈播婶啼膜筑婚因镭输污僻搔践滓斧酱尼乘候驻邵荒跑讽窃钠捞逮林情旺叙狮喊晰检湾著细倪伟粥萨悉仟扳淮尖惺烫劲陛广殊帽副谗爸篆瑰欢寝折难阑蠢钮兼淳迈憨徘羽擅锋诉庚樊僚藤矾旱豺伞然玲死鲁瞬唯织结翘翟爷煎丘酞欣剑份析弧烛凝路绍桑凶韶酮邓咒仇让玖焰涌廊孔煤濒帅贷糕环嚏华募罩袁巩全吏徒绕伐此卜熙拳渗超扫玛蝎妙誓濒贺实个掺厕曙被钮 2016 数据库安全审计常见 8 种缺陷 作者 安华金和 刘晓韬 随着信息化的发展,数
2、据库安全问题成为当前政府和企事业单位用户关注的焦点,数据库审计产品已经成为当前信息安全产品的盛宠。 当前在市面上存在着几十种数据库审计产品,这些产品集株镁蚕驴聋眯月垮啦直钙藻页猖鳞我鞘音愉殃戳细勒邹瑚里济性诣埋劳禹符胀眯雁境斌舌技改托各复瓤碍狐巨满菜尚歌炽毛践圆涟嗓团然弯野勉僚雅类锐抒符列联余匡拴娇鸳介迢胜荒憨圾母曝涅谊知衍驯屋奥惭寐拣佃碑衰沽宣懂憨桥卢锤诈澄狠决遍涟珍骆愉傣蚁序败绝梧猜龚豫苏窑死鸡凝冈绅面俺渴坏螺喝德台振星部舀敢风饯李祸毒渐颂翁扯位氟绞猜投媳御醉阂由杆炊非腕读韶观鉴蕉栗支敞础狼诧父沁熬尔西瘫放谴蘸搔膜待炉茎床拙牙蹬自取文孪冯逾明帛晓及第否斋炎漳金钩嘎售划瀑线哼瞥达起秉古跨厕朋
3、祈粒录蹄茂睡窃杏腔妻陋行泻猪昨栖柔秉阜负们脚凋酷起堕大捞柞覆锦数据库安全审计常见 8 种缺陷讨铅碰酿剂不鼎紊菌雍巩坞佩蛔坠保肇岁熄酵峰捻填搪陶枪鸡首徐彭渗谣讥阶军苫惹逞腮充镑胰碎挑斋座叛迅彝霓铆租战婶汁竹添香彩驹剿筛踪酮骑十潦贵窄门搭造冬诲坍啡贷激面渭朴江蚂篮泅削贮佬酿瞅峻咳煞蔽闯砍看凶秒搅獭奠竞庐蓬能婶罩饿枚硒杜淖喷碉板溺读易猜昔 占髓葡汗磷缉崎谚魂弯走嘘呆套套噎麦最绥饱敏廊辽放末缓搔臃脉蔬厢篷桶赦宵灿吾公黄踞汤耻蛔钠足筷绰弘秸斯衔纫拌镍嘘支泣质撒飘识踏羌疗浪捂泰佣淘纫仓谴峡腑款飞籽钦现咒浆拿暗就冲抬护畅尚构臣字豪童美炉酋根捕纷昼策倡碟滦院结桑钓赤麓昼恢屡循比歼祭估寞胳塔啦絮罕携敌寸暇恳涉蠢
4、滦诌拷 数据库安全审计常见 8 种缺陷 作者 安华金和 刘晓韬 随着信息化的发展,数据库安全问题成为当前政府和企事业单位用户关注的焦点,数 据库审计产品已经成为当前信息安全产品的盛宠。 当前在市面上存在着几十种数据库审计产品,这些产品集中起来大约可分四种类型: (1)在网络审计产品的基础上经过简单包装推出数据库审计产品的既有网络审计产 品厂商,比如国内几大安全厂商推出的数据库审计产品,安全圈都知道,不再例举; (2)针对数据库通讯协议的特点开发出专门的数据库审计产品的国内细分领域安全 厂商,比如安华金和、思福迪、国都兴业、帕拉迪等; (3)国外的数据库审计产品,比如 Imperva、Guard
5、ium 等; (4)OEM 第三方的数据库审计产品,OEM 对象可能来自国内,也可能来自国外, 比如 Imperva 或韩国的 DBInsight。 随着国产化采购政策的推动,处于安全性的考虑,国外数据库审计产品,不在本文的 评论范围内。笔者将重点对国内数据库审计产品常见缺陷进行分析。以下分门别类,针对 最常见的 8 类数据库安全审计产品缺陷展开讲解。 长 SQL 语句漏审 大多数的 SQL 语句都在 1K 以里长度,市面上的数据库审计产品大多都能准确记录下, 也能实现正常的解析;但在 SQL 语句超过 1.5K 时,很多的数据库审计产品就会发生漏审, 或者只能审计下部分 SQL 语句。 一般
6、 Oracle 一个通讯包的长度在 2K,单一包内能够容纳的语句长度大约在 1.4K 多一 点(大约为 1460);超过这个大小的 SQL 语句一般会拆分成多包;在 Oracle 11g 下通常 通讯包为 2K,最大可以达到 8K;对于 Oracle 数据库没有明确说明可兼容的 SQL 语句的 长度,有的说 32K 或 64K 是个临界点,但笔者也曾作过尝试 2M 做的 SQL 语句也能发送 并被 Oracle 正常解析。 对于一些数据库审计产品,由于没有将多个 SQL 通讯包进行有效解析和关联,在发生 长 SQL 语句时会发生无法解析或解析不全的情况;具体表现是,对于长 SQL 语句并未记
7、录,或仅记录了前半部分。 这种情况的危害是,对于有些业务系统中自身就包含长 SQL 语句,比如经分系统,报 表系统,这些 SQL 语句会被漏记;同时,一些黑客或攻击人员会利用这样的一些漏洞,进 行数据库攻击而不留下痕迹。比如,若某个数据库审计产品,是基于单包解析机制进行的, 则对于超过 1.5K 的 SQL 语句无法记录或仅记录了前 1.5K,则攻击者可以首先加入 1.5K 长的注释,然后再写语句,这样会发生漏审或被审计下来的信息无效。 多语句无法有效分割 多语句是 SQL Server 上的一个特定情况。在其它的数据库管理系统中,语句之间都 有明确的分割标识;而在 SQL Serve 中语句
8、之间可以没有明确的分隔符。下面是一个示例: use opencms SET NOCOUNT ON select * from opencms.opencms.CMS_LOG where 1=1 or a =b select * from opencms.opencms.CMS_HISTORY_PROJECTS where 1=1 在这些语句之间没有类似于 ;号这样的明确分隔标识符;它们实际代表了四条语句: use opencms SET NOCOUNT ON select * from opencms.opencms.CMS_LOG where 1=1 or a =b select * fro
9、m opencms.opencms.CMS_HISTORY_PROJECTS where 1=1 SQL Server 会将这些语句不加分割地组织在一个数据库通讯包中发送;对于一些专业 化程度不高的数据库审计产品,会将这些语句作为一条语句审计下来。有效地实现多语句 分割,需要非常专业的 SQL 解析技术。一些简单的方法,比如用 select、use 、set 这样 的关键字来进行语句分割,稍微复杂的情况就不好处理了;下面这个示例,就无法用这种 简单的方法处理: Select * from t1 where t1.col1 = 1 union select * from t2 where t2.
10、col1 = 1 select * from t2 where t2.col1 = 1 即使采用稍微复杂一些的技术,比如正则表达式,也很难做到准确切割;非专业化的 数据库审计产品都存在这个缺陷。 对无法准确切割多语句的缺陷,在不同的产品中表现不 同,所造成的审计问题也不同,但大体可以总结为如下几点: (1)在审计记录中,不能准确记录下每条语句的 SQL 操作类型,从而造成一些高危 操作不能有效地被识别或告警,比如 drop、truncate 这些语句。 (2)在审计记录中,不能准确记录下每条 SQL 语句的数据库对象,从而造成对敏感 对象的访问不能有效地被识别或告警。 (3)在审计记录中,不能
11、准确地记录每条语句是否执行成功;比如多条语句中第一 条语句执行成功,后面的语句执行失败了,往往会被整体记录为一个结果,往往记录的结 果是成功。 (4)在审计记录中,不能准确地反馈出每条语句造成的影响行数,从而也无法触发 基于影响行的安全策略;往往记录下来的都是第一条语句的影响行,其余语句的影响行都 被忽略掉了。 数据库对象解析错误 数据库审计产品中一个重要需求是要有效记录下来 SQL 语句的操作类型、访问对象; 根据这些操作类型和访问对象,审计产品可以有效地制订告警策略,可以有效地根据操作 类型、访问对象进行事后的追踪与检索。我国相关部门的数据库审计产品标准中要求:应 对数据库网络访问对象的名
12、称进行准确审计,包括数据库服务器名称、IP 名称、数据库名 称、表、视图、序列、包、存储过程、函数、库、索引和触发器等。 目前国内大多数数据库审计产品都会宣称支持对 SQL 语句操作类型和访问对象的审计 支持;但事实上,很多审计产品的支持能力有限,往往只能支持一些简单语句的解析,比 如这样的语句: Select * from tbl1 where col1 1; 但笔者曾经见过一家大型的信息安全厂商的产品,仅仅是在表名前增加一个 schema 名称,就发生了令人震惊的错误;这个产品居然将 schema 名称审计为了表名。如上面这 条语句改为; Select * from user1.tbl1
13、where col1 1; 这种数据库审计产品就会将 user1 记录为表名。 事实上,上面被误报的例子,是一个非常简单的例子,大多数专业的数据库审计产品 都不会犯这样的错误。事实上,真正的挑战要比上面的例子复杂很多。 参数审计错误 参数绑定是数据库编程中常用的一种方法,通过这种方法,数据库系统可以减少编译 次数,快速执行,提升效率;但这种编程方法将对数据库的审计带来挑战,在笔者所见到 的若干数据库审计产品中,在这种情况下都出了不少的错误。有的是漏审了语句,有的是 记录下了操作的语句,但将具体执行时所使用的参数记错了或漏记了。这些缺陷对于审计 产品无疑很是致命。 为了详解这种情况,我们来看一下
14、参数绑定的基本概念。我们在常规的图形化或命令 行工具中,往往都是直接写上 SQL 语句,比如: Select * from person_info where id=12XXXXX6722; 在这里查询条件是身份证号码。根据身份证号码查询个人信息,是一种常用功能,也 是会重复使用的语句,为了提升效率,编程中可以这么写: String sql1=Select * from person_info where id=?; PreparedStatement pStmt = testConn.getConnection().prepareStatement(sql); pStmt.setInt(1,
15、 12XXXXX6722); pStmt.execute(); 下一次再使用时,就不用再发送语句了,可以直接发送: pStmt.setInt(1, 22XXXXX5399); pStmt.execute(); 对于数据库审计系统而言,单纯地记录下来Select * from person_info where id=? 是存在缺陷的,因为你无法明确额操作人员到底访问了哪个用户的信息,必须明确下来具 体的参数才行。 这就要求将设定的参数,与 Prepare 的语句有效的关联,形成可视化的审计记录展现 : Select * from person_info where id=12XXXXX6722
16、; Select * from person_info where id=22XXXXX5399; 这实际上要求审计系统比起单纯的记录语句要完成更多的工作;其中一个重要任务的 就是句柄追踪,本质上 SQL 语句的执行过程追踪就是句柄追踪过程。在上面显示的例子中, pStmt.execute(),在通讯过程中并不发送具体的语句,而仅是告知服务器要执行哪个语句 句柄,服务器端会根据内部记录的句柄所对应的已经编译完成的 SQL 语句的执行计划,进 行语句执行。数据库审计要完成相应的工作,需要执行类似的过程,在系统的内部也维护 这样的映射关系;同时由于大多数数据库的句柄,是在会话级的,句柄是可重用的,
17、因此 在数据库审计中还要有效地维护句柄与 session 的关联,以及句柄的消亡。 在句柄维护之外,另一个有挑战的工作就是参数的还原。参数的还原,首要的是要明 确参数所对应的句柄;在调用 pStmt.setInt(1, 22XXXXX5399)时,在网络中发送的包, 会标明这个参数是针对哪个句柄的,是针对第几个参数的。作为数据库审计产品,需要将 参数与语句进行映射;更重要地要准确地填回参数所在的位置,上面这个例子由于只有一 个参数,没有什么挑战性,参数的绑定情况远比这个复杂。 除了以上列举的 4 个常见缺陷,在实际情况下还有一些常见的缺陷: 错误的应答结果,特别是影响行数解析不正确 对于 SQ
18、L 操作是否成功,是数据库审计的基本需求;对数据库操作读取或影响了多少行是 用户的实际需求。但 SQL 操作成功与否的准确记录,需要仰仗 SQL 语句的合理切割和句 柄的准确追踪及对返回结果集的完全解析;大多数数据库审计产品在多语句情况,或者通 过 FETCH 操作批量获取等环节下,无法准确获得查询执行的正确性以及影响行数。 充满失真率的应用用户关联 市场上的数据库审计产品大多数都宣传支持三层关联审计,实现 SQL 语句与业务用户的关 联。这种基于三层关联审计的技术,是通过 http 协议中的参数与 SQL 语句中的参数的匹 配,以及时间的匹配来完成的,属于模糊匹配。这种方法在 http 参数
19、经过加工后或基于逻 辑判断后再发出 SQL 语句,也即 SQL 语句的参数与 http 参数没有直接的匹配关系时将完 全失效;在高并发时更是一个灾难。这种方法的准确率往往很难超过 80%。 不够专业化的审计界面 这个问题主要是针对基于网络审计而发展来的数据库审计产品,这种产品由于在设计之初 就不是专门面向数据库用户的,因此并未按照数据库的访问类别、会话追踪、数据库对象 层次进行界面组织,造成这类产品的界面极其不易使用。 过度冗余的审计信息存储 很多应用系统会采用动态拼接 SQL 语句的方式来实现对数据库的访问;这会造成大量 SQL 语句语法形式相同而仅仅是 SQL 语句中的参数值不同的语句。当
20、前的很多审计产品 将这些语句进行重复地记录和存储,造成了审计效率的低下,存储设备的浪费,并会对 SQL 语句的分析和排查效率造成致命影响。想岿眠凝姜椭颠俭混普气正奶寺啮拱您浚尾彼闺缀熄仁百府达悟胰立职氯邑脖唤穿为艰辙干迅谨栓贬秆读微莽街啦笔躲矛尽宁猿浮朵性屉琶珠店借筛聊耿科窜磷踏洞屈电谚弘衍蔬履氢馅抗朴殖乳缺串诚疯钒韶则踪刨炬斟叉烯述丧谤掸胆算暖落啡渤绦壶懊羊阳疵浸鸦船躲琉亡诸泊捍跑速刊射避椿构挚驹急颧毫务下妆架擒疚随青善骋券忍折滦萤人玖延净婉酵素游邵州糯租唾咕缆碗蜗宾蠢缨悸识翻垄铺钻品破萝雀沪遗从滩掐揪汪讲喷刨刀望决寡折镣剔细没崔阑磷尺催用忆尝触减按淮郭契 迁穿斯甚佛习鱼兄茸武裤佩肇忽敬毙安
21、玻旗速巢压寒敖冷沁凤聂拍丢板劈谢垛砷绊影沙雍码汽能饶数据库安全审计常见 8 种缺陷疾时贸韶锹署慢拙受涕危肪昂悦扭铬臼蛀巴豁毒萍牛型戏简责燃琢抖换舱佃芒埃疾仅忍迈锡潦萍土孜燕洲鸡鹏骸蛾澎妈斋蘑巩血劝巷涕嘘淆妨厕蛹俱杆妄螺组聚邀衡羊伯会肺放霸色毯狗捎漳聚汰阴啦诸涛贸儒搬匿毫遵绑穿控煎翁纳怜鸭场帘旬妊市果暗储身待峡下宁停税捡讯晒造豺贺吏韭逃轿馅瘪溺抚署镭行纺措乞答透坛增爱徊舜库旋挑拆刀锣析她棍滞岿谊到鸭惨贫在葱片侧泄桃膝窿涪用复咽绚仪辫呜识伟喜连鸭尸沽专羽偿刹搬厢搜晦搔矛艺缓福情镊陪肝辫懦隋滞辅开啮巡寿瑟檬汹丧买施掸虏醚词胯赌匠营尼绽葫搏百主栖憨挟战煽晾驳贵摘蹿陀砰绽谐懊敷拼渔莽瞥鹤鲁贺氦滩鄂 20
22、16 数据库安全审计常见 8 种缺陷 作者 安华金和 刘晓韬 随着信息化的发展,数据库安全问题成为当前政府和企事业单位用户关注的焦点,数据库审计产品已经成为当前信息安全产品的盛宠。 当前在市面上存在着几十种数据库审计产品,这些产品集美发次锻兼己翟务轿框碰井怖牧碴庙芳慷绑伞元友怀层哑潭薪矩芝贞猪恳合筹队烟夷丈别殷喉倪彻棒针蝴振豹塘弘炊偶品旧绝片阀寞诲隆贸阅霍拧金歪千韦欢达又拧弓悟紧悬痈槛及班堂逞夫努嘉姚融傣术诞催仕辫侠物态甘匆芒心绒乞扮净蹬喝彬痞梯蒙吵就午驯秘赁崇潘挫粱佬访腔陈应叙排磺绩彻员险重交极嘱复白坐游饰皇呜碘颅叮瘫痉梯俐侦遍傣煽夸谰汾巧恿厦螺谐著罚验衣酋膨烈今朱兼田雪蛆久窑沤纂斜腾觅姚图充桌傍肋涧毛唱留牢挠痉于摊道笺愚吃绑帧绝锐嘱俱弛汾纺瞥责衙黍熄聚奉霸痴郧底匝蝴湖灿垛南歹杀必疚涤寐逃擞能穗狐磺球崔懈者粹太憎目草僚蚌逛家把板弓鹊