基于SQL Server 2008中的加密和密钥管理探析
2012-07-1275706部队16分队传输室雷治安
75706部队16分队传输室 雷治安
75660部队军事指挥教研室 陈腾楠
基于SQL Server 2008中的加密和密钥管理探析
75706部队16分队传输室 雷治安
75660部队军事指挥教研室 陈腾楠
以SQL Server 2008为例,对加密和密钥管理作简要探讨分析,启发搞好网络和数据的安全维护,加强保密性。
SQL Server 2008;加密;密钥管理;探析
网络时代,数据保密是个棘手问题,这就要求系统提供大量确保数据库安全的功能,方能适应发展需要。譬如,SQL Server 2008中的加密和密钥管理就是这样。
一、数据加密
(一)数据安全防护
首先加强立法保护数据。如今,无论军民用信息都有相对的私密性,在信息技术迅猛发展和充满隐私的大环境中,数据需要用法规形式保护。其次把数据加密存储在安全性良好的数据库中。良好的数据库具备良好的安全规范,如SQL Server就有一个叫defense in depth重要的安全规范。Defense in depth意味着分层防御,即使攻击者成功打破最外层防御,仍需突破一层接一层的防御才能获得成功。这意味着攻击者通过防火墙和从服务器到数据库的Windows安全后,仍需进行一些恶劣、野蛮和强制的黑客攻击才能解码数据库中的数据。
(二)SQL Server 2008加密密钥层次结构
SQL Server 2008使用对称密钥、非对称密钥和数字证书,为各种类型的数据加密提供丰富的支持。最出色的是,它可为您管理密钥,而密钥管理是加密中最难的部分。
管理员可能至少需要管理图1所示层次结构中的上级密钥。数据库管理员需要理解服务器级的服务主密钥和数据库级的数据库主密钥。每个密钥都保护其子密钥,子密钥又保护其子密钥,从树形结构图依次向下。密码保护对称密钥或证书时例外,这是SQL Server用户管理自己的密钥,以及负责保密密钥的方法。
注意:Microsoft不推荐直接使用证书或非对称密钥加密数据。非对称密钥加密速度慢且使用此机制保护的数据量有限(这取决于密钥模数大小)。可使用密码,而不是数据库主密钥保护证书和非对称密钥。
1.服务主密钥
服务主密钥是规定SQL Server中所有密钥和证书的密钥。它是SQL Server在安装期间自动创建的对称密钥,是个至关重要的密钥。如此密钥泄露,那么攻击者最终将解码服务器中由SQL Server管理的每个密钥。Windows中的数据保护API(Data Protection API,DPAPI)为服务主密钥提供保护。
SQL Server可管理服务主密钥。虽然您可对其执行维护任务,将其转存到一个文件中,重新生成它,以及从文件中将其还原。但大多数情况下,无需对密钥做任何更改。备份服务主密钥以防止密钥损坏对管理员来说是明智的选择。
2.数据库主密钥
数据库范围内,数据库主密钥是数据库中所有密钥、证书和数据的根加密对象。每个数据库都有唯一的主密钥;尝试创建第二个密钥时,会出现错误提示。必须在使用前通过CREATE MASTER KEY Transact-SQL语句和用户提供的密码创建一个数据库主密钥:
CREATE MASTER KEY ENCRYPTION BY PASSWORD='EOhnDGS6!7JKv'
3.层次结构密钥保护的特点
SQL Server使用由密码和服务主密钥派生出来的三重DES密钥加密密钥。第一个副本存储在数据库中,第二个存储在主数据库中。由于服务主密钥保护数据库主密钥,因此可能在需要时由SQL Server自动加密数据库主密钥。最终应用程序或用户无需用密码显式打开主密钥,这是层次结构保护密钥的主要优势。
(三)数据库移动加密
分离一个存有主密钥的数据库,并将其移动到另一个服务器上是一个难题。问题在于新服务器的服务主密钥与旧服务器的服务主密钥不同。因此,服务器不能自动解密数据库主密钥。可通过使用加密密码打开数据库主密钥,然后使用ALTER MASTER KEY语句用新的服务主密钥对其加密避开这个问题。否则,总需显式打开数据库主密钥后才能使用。
如存在数据库主密钥,开发人员可用它创建三种类型中的任何一种密钥,具体取决于加密所需类型:非对称密钥,使用公钥/私钥对进行公钥加密;对称密钥,用于在同一个密钥分别加密和解密数据的方面共享秘密;证书,实质上用于包装公钥。
因所有加密选项及其已深层集成于服务器和数据库中,所以现行加密必须将防御的最终层添加到数据上。然而,需明智使用工具,因为加密给服务器增加了大量的处理开销。
二、透明数据加密
SQL Server 2005中,可使用数据库引擎加密功能,通过编写自定义Transact-SQL加密数据库中的数据。SQL Server 2008引入透明数据加密,改进了这种状况。
透明数据加密在数据库级执行所有加密操作,这消除应用程序开发人员创建自定义代码来加密和解密数据的需要。数据在写入磁盘时被加密,从磁盘读取时解密。通过使用SQL Server透明地管理加密和解密,就可在不改变现有应用程序的情况下确保数据库中业务数据的安全,如图2所示。
数据库加密密钥(Database Encryption Key,DEK)用于执行加密和解密操作,该DEK存储在数据库启动记录中,以便恢复过程中使用。可使用服务主密钥(Service Master Key)或硬件安全模块(Hardware Security Module,HSM)保护DEK。HSM通常是USB设备或智能卡,因为不易被盗或丢失。
三、扩展的密钥管理
随着法规遵从性需求的增长以及对数据隐私的整体关注,越来越多的组织将加密用作解决深层防御方案的手段。随着大规模使用加密和密钥来保护数据,密钥管理变得更复杂。一些高安全性数据库要使用数千个密钥且必须部署一个系统来存储、注销和重新生成这些密钥。而且,还应将这些密钥与数据分开存储以增强安全性。
SQL Server 2008为第三方使用公开加密功能。这些解决方案可与SQL Server 2005和SQL Server 2008数据库无缝地工作并提供企业级专用密钥管理。这将密钥管理工作负载从SQL Server转移到专用密钥管理系统。
SQL Server 2008中扩展的密钥管理还支持使用HSM提供密钥与数据的物理分离。
四、代码模块签名
SQL Server中提供加密的好处就是它提供使用证书对代码模块(存储过程、函数、触发器和事件通知)进行数字签名的能力。这提供了访问数据库表比其他对象访问更细粒度的控制。像加密数据一样,使用证书中的私钥签名代码,其结果是使用代码模块签名的表只能通过该代码访问且不允许使用在代码模块之外。换言之,只能使用已经签名该模块的证书,才能获得对该表的访问。
对存储过程而言,效果是一样的。例如,如有完整的所有权链,您可谨慎控制哪些用户获得该过程的EXECUTE权限,并可拒绝他们对基础表的直接访问。但这在过程的所有权链被破坏或执行动态SQL时不起作用,此时要求执行该过程的用户拥有对基础表的权限。实现同样效果的另一种方式是使用EXECUTE AS,但改变了过程执行的安全上下文,这不是理想的情况。
签名代码模块的另一好处就是防止对代码模块做出未授权的更改。像其他经过数字签名的文档一样,在代码改变时,证书将失效。代码不在证书上下文中执行,因此任何被提供证书访问权限的对象都将不可访问。要继续访问它们,需要创建一个证书,将该证书与新用户关联并使用该证书签名过程,授予该用户执行该存储过程必要的权限。实质上,已经将该用户作为次级身份标识添加到存储过程安全上下文中。然后,授予需要执行该过程的任何用户或角色执行权限。以下代码展示了这些步骤。假设您想要签名my Schema.Get Secret Stuff过程,并且所有引用的对象已经存在数据库中:
现只有明确授予对该存储过程具EXECUT权限的用户能访问该表的数据。