2011年底,众多席卷而来的密码泄露事件弥漫整个网络,当我注视着最常用的几个密码都在互联网上被公开时,除了手忙脚乱的在各大网站修改密码,剩下的就是深深的遗憾。几乎所有从事IT行业的人,都深知安全的重要,可是放在实际执行中,又往往习惯性失明,忽视了自己周围本应能够达到的力所能及之安全,很多专业人士就以这样或者那样的侥幸心理放任了风险的存在,并一步一步走向了安全危机。
笔者从事数据库工作超过十年,并且在一直不遗余力的推广数据库技术与数据库安全知识,在此我愿意和大家分享一下我对于数据库安全的理解。
基于对于数据安全的服务和思考,我将数据库安全概括为五大方面(如下图所示),即:
软件安全、备份安全、访问安全、防护安全和管理安全
在这五大安全方向中,可能出现两种性质的安全问题,第一,由于内部管理不善而导致的数据安全问题;第二,由于外部恶意攻击入侵所带来的安全安问题。通常我们把安全问题狭义化为后者,这实际上是片面的,在数据安全问题上,前者造成的数据损失、数据损毁,其发生率和影响度都远远超过后者。
下面我们对数据安全的五大方面做一下简要的分析和探讨:
1.软件安全是指我们选择的数据库产品、版本是否稳定安全;厂商所能提供的补丁集和BUG修正是否及时。很多用户在部署数据库软件时,仅仅选择了最容易获得的初始版本发布(如Oracle Database 10.2.0.1或者Oracle Database 11.2.0.1等),遗漏了可能已经存在的补丁修正,并且在运行维护中并不能够及时跟踪软件更新,也无法获得BUG信息、补丁修正和安全告警,这就使得软件本身的很多风险隐患得不到修正。如果软件安全无法保证,数据库安全的基础也就丧失了。
2.备份安全是指用户数据能否得到及时有效的备份保全,能否在故障灾难之后获得及时的恢复和挽救。很多企业在数据灾难之后因为缺乏有效备份而一蹶不振,根据Gartner 2009年的一份调查报告显示,在经历了数据完全丢失而导致系统停运的企业中,有2/5再也没能恢复运营,余下的企业也有1/3在两年内宣告破产,由此可见,由于备份安全问题导致的企业伤害可能远远大于黑客攻击。
3.访问安全是指用户数据库的访问来源和访问方式是否安全可控。通常数据库系统处于IT系统的核心,其安全架构涉及主机、系统、存储、网络等诸多方面,如果没有明确的访问控制,缺乏足够的访问分析与管理,那么数据库的安全将是混乱和无法控制的,最基本的访问安全要实现程序控制、网络隔离、来源约束等。
4.安全防范是指通过主动的安全手段对数据库安全进行增强、监控、防护、屏蔽或阻断,诸如数据加密、审计、数据防火墙等技术都在这一范畴之内。我们必须认识到,在IT技术高度发展的今天,风险是无处不在、层出不穷的,可能我们从未思考过的安全问题,每天都在不断涌现,所以在数据库环境中采取主动式防护,可以帮助我们监控分析和屏蔽很多未知风险,已经有很多成熟的产品和技术可以用于安全防范。
5.管理安全是指在企业数据的日常管理维护范畴内,能否充分保证数据安全。诸如DBA的维护、文件的管理、参数或数据结构的变更等等都可能引入数据风险,管理安全要求我们通过规范、制度以及技术手段去确保维护管理安全。2011年陕西移动曾经发生过近1400万手机用户数据泄露的安全事故,最终查明就是因为维护人员的数据窃取导致的数据泄露,而除此之外,很多维护性误删除、误更新等故障也威胁过无数用户的数据安全。
对于数据库安全来说,通常我们认为缺乏的并非技术手段,更多的是缺乏规范和安全认知,如果用户都能够严格的遵循安全守则并应用现有的安全技术手段,数据库的安全性就能够大幅增强,我们的安全事故发生率也会大大降低。
下面就让我们以Oracle数据库为例,探索一下Oracle数据库的安全机制和安全实现。
Oracle数据库自1977年肇始之初,就一直将安全置于首位,"Oracle"这个名字就是来自于美国中央情报局投资的项目代码,而CIA 也正是Oracle最早期的用户之一。接触过Oracle数据库的人都应当熟悉一个类似如下图所示的错误"ORA-00942:表或视图不存在",这个简单的错误提示,最初就是在CIA的要求之下作为一项安全防范设定的,这个提示的安全意义在于:避免提供任何具体的实质性提示性信息,以预防黑客的攻击性尝试。由此可见,安全防范可以从每一个细节入手,安全是一项全面整体的技术实现,并非孤立的存在。
接下来让我们从Oracle数据库的密码机制上来深入了解一下Oracle的加密机制,虽然我们知道早在Oracle 数据库版本8的年代,就已经提供了强大丰富的数据库加密功能,但是直至今日,恐怕半数以上的数据库中,仍然存放着用户的明文密码,并且未采用任何数据库安全增强机制。这也就是我认为最重要的安全问题:我们并不缺乏安全防范手段,而是缺乏对于安全风险的认知。
诚然,我们对于安全的认识是随着不断出现的安全事故逐步增强的,但是希望大家都能够有计划的逐步增强对于数据库的安全防范,主动规划推进数据安全与从挫折中学习提高实有天壤之别。对于2011年底的密码泄露事件,如果各大网站能够采取基本的技术手段对用户密码进行一定的加密,那么这次密码泄露的安全事件就不会显得那么初级和惹人恐慌,想一想明文密码和MD5加密串的区别?前者基本上意味着数据库从未从安全角度进行过任何思考和增强。
Oracle数据库的用户信息及密码存储于一个名为USER$的数据表中(所有者为SYS用户),我们可以通过基于USER$表建立的DBA_USERS视图来查询和获得这些信息,包括加密的口令串。
在Oracle Database 11g之前,用户口令通过DES加密算法进行加密,使用用户名作为"Salt"(Salt指加密过程对加密数据额外使用的干扰字串,可以使用随机或固定的 Salt),密码最长为30个字符,所有字母被强制转换为大写。从Oracle 7 至 Oracle 10g,加密一直使用username和password串连之后进行HASH运算,例如sys/temp1和system/p1将会获得相同的HASH 加密输出。
从Oracle Database 11g开始,Oracle允许最多使用30个字符、大小写混合方式作为密码,同时支持DES和SHA-1算法进行加密(SHA-1算法支持大小写混合,通过初始化参数SEC_CASE_SENSITIVE_LOGON开关),使用password||salt的方式进行HASH加密。
以下是Oracle 9i数据库中口令的加密形式,DBA_USERS视图的PASSWORD字段显示了加密后的密钥:
在Oracle 11g中,密码从DBA_USERS视图中隐藏起来,这进一步的增强了安全性,即便具有访问视图权限的用户,也无法获得口令的加密串,由此我们也可以看出Oracle数据库软件的安全增强历程:
口令的加密内容存储在底层的核心表(USER$是Oracle数据库的元数据表之一,仅超级用户或DBA用户才能访问)中,以下PASSWORD字段存储的是DES加密值,SPARE4存储的是SHA-1加密信息:
关于口令的维护,Oracle支持各种约束性限制(通过 utlpwdmg.sql 脚本启用),诸如复杂程度、长度、有效期、失败登陆次数等等,通过这些增强,Oracle的口令限制可以定制出非常稳固的安全解决方案,如果你从未接触和研究过这些手段,那么可能就说明你的数据库还缺乏足够的第一层的安全防守。
如果我们能够从Oracle的安全策略入手,学习一下Oracle的口令安全解决方案,那么就能够构建一套较为完善的基本安全解决方案。从 Oracle的第一个Internet版本 Oracle 8i(1998年发布)开始,Oracle就提供了一个加密包DBMS_OBFUSCATION_TOOLKIT 用于数据安全防护,这个加密包支持DES , 3DES 和MD5加密算法。
通过非常简单的封装调用,DBMS_OBFUSCATION_TOOLKIT 包就能够实现数据加密,以下是一个简单的示例输出,对于给定字符串进行MD5加密,以RAW方式返回加密结果(通过创建稳固的函数,可以实现用户登陆时的即时加密、比较、认证):
从Oracle Database 10g开始,DBMS_CRYPTO包被引入到数据库中,该程序包支持更广泛的加密算法,并用于替代DBMS_OBFUSCATION_TOOLKIT 包,在新的版本中,诸如DES, 3DES, AES, RC4, MD5, SHA-1, MD4, HMAC_MD5, HMAC_SH1等等加密算法和加密方式都被支持。
通过选定的加密算法和加密方式,可以对重要数据进行加密和解密,我们不仅可以实现对于密码或数值、字符数据的加密,甚至可以对类似LOB等非结构化数据进行加密。以下范例是使用DES算法CBC模式和PKCS5补码规则的加密解密实现,示例模拟对于信用卡卡号的处理过程,金融类企业数据的安全性更为突出,需要进行安全加密的类型更为丰富:
在本文最后我想重申的是,对于不同的数据库产品,都存在足够成熟的安全实现手段,应用这些安全手段就能够实现对于数据的基本保护,对于我们技术人最重要的是:认识和重视数据安全问题,并逐步推动企业或组织应用安全手段进行数据安全增强。
重视数据,保护数据,重视数据安全问题,这是每一位技术人的共同使命!