ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQL Server 2008企业版中的数据库加密

SQL Server 2008企业版中的数据库加密

原创 Linux操作系统 作者:iSQlServer 时间:2009-02-17 16:19:56 0 删除 编辑
通过对SQL Server 2008中的透明数据加密(TDE)的介绍,现在用户可以选择如同在SQL Server 2005中一样使用单元级的加密,或者是使用TDE进行完全数据库级加密、或者是由Windows提供的文件级加密。TDE对于大量加密是最佳的选择,它可以满足调整遵从性或公共数据安全标准。TDE是文件级的,它和两个Windows®特性类似:文件加密系统(EFS)和BitLocker™ Drive Encryption(驱动盘加密),在Windows Vista®中新推出的空间级加密,也都是在硬盘上加密数据。TDE没有替代单元级加密、EFS或BitLocker。这篇文章比较了TDE和其它供应用程序开发人员和数据库管理员使用的加密方法。这不是一篇描述TDE技术、深入概述的文章,它是一篇假设你熟悉像虚拟日志文件和缓冲池之类的概念,探究技术执行的文章。它假设用户熟悉一般的单元级加密和密码术。它描述进行数据库加密所做的工作,而不是加密数据库的基本原理。

  1. 导言:进行数据库级别的加密

  透明数据加密(TDE)是在Microsoft® SQL Server™ 2008中推出的一个新的加密功能。它旨在为整个数据库提供静态保护而不影响现有的应用程序。对数据库进行加密,传统上都会涉及复杂的应用程序改动,例如修改表schemas、删除函数和明显的性能下降。举例来说,要在Microsoft SQL Server 2005中使用加密,字段数据类型必须改为varbinary;不允许进行范围和相等搜索;并且应用程序必须调用内置函数(或自动使用这些内置函数的存储过程或视图)来处理加密和解密,这些都会降低查询性能。这些问题不是只存在于SQL Server的;其它数据库管理系统也受到相似的限制。定制schemes经常用来解决根本不能使用的相等搜索和范围搜索。即使是像创建一个索引或使用外键等的基本数据库元素也通常不能与单元级或字段级加密schemes一起使用,因为这些特性的使用会泄漏信息。TDE简单地加密了所有东西,从而解决了这些问题。因此,所有的数据类型、键、索引,等等这些可以完全使用而不必牺牲安全或泄漏磁盘上的信息。而单元级加密不能提供这些功能、两个Windows®特性:文件加密系统(EFS)和BitLocker™ Drive Encryption,它通常用于和TDE同样的原因——它们提供相同范围的保护并对于用户来说是透明的。

  2. Microsoft SQL Server加密

  Microsoft SQL Server提供两个级别的加密:数据库级别和单元级别。两个都使用密钥管理层次结构。

  2.1密码密钥层次结构

  在加密树的根部是Windows Data Protection API(DPAPI ),它在机器级别保护密钥层次,并用来保护数据库服务器实例的服务主键(SMK)。SMK保护数据库主键(DMK),它存储在用户数据库级别并反过来保护证书和非对称密钥。这些反过来保护对称密钥,对称密钥保护数据。TDE使用相似的层级到证书。注意区别是当你使用TDE时,DMK和证书必须存储在主数据库上而不是用户数据库中。一个只用于TDE并作为数据库加密密钥(DEK)的新密钥,被创建和存储在用户数据库中。

  这个层次结构使得服务器可以自动地打开单元级和数据库级加密的密钥和解译数据。主要区别在于当使用单元级加密时,所有从DMK来的密钥都可以用一个密码来保护,而不是另一个密钥。这破坏了解密链并强迫用户输入一个密码来访问数据。在TDE中,必须维护从DPAPI到DEK的整个链以便服务器可以自动地提供对TDE所保护的文件访问。在单元级加密和TDE中,通过这些密钥的加密和解密是由Windows Cryptographic API(CAPI)提供的。

  下面的图片显示了完整的加密层次结构。虚线显示了TDE所使用的加密层次结构。

  

  图1: 使用TDE和EKM的SQL Server加密密钥层级

  2.2 TDE

  透明数据加密是SQL Server 2008推出的新的数据库级加密特性。

  2.3怎么使TDE可用

  为了使TDE可用,你必须具有和在主数据库中创建数据库主键和证书相关的一般权限。你还必须具有对用户数据库的CONTROL权限。

  使TDE可用

  在主数据库中执行下面的步骤:

  1. 为主数据库创建一个数据库主键(DMK),如果它还不存在的话。确保数据库主键是用服务主键(SMK)加密的。

  CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘some password’;

  2. 创建或指派一个现有的证书作为数据库加密密钥(DEK)保护者来使用。为了获得最好的安全保护,推荐你创建一个新的证书,它的唯一作用就是保护DEK。确保这个证书是由DMK保护。

  CREATE CERTIFICATE tdeCert WITH SUBJECT = ‘TDE Certificate’;

  3. 用私钥创建一个证书备份并将它存储在一个安全的地方。(注意私钥存储在一个单独的文件中——确保保存好这两个文件)。确保维护证书的备份,因为有可能发生数据丢失。

  BACKUP CERTIFICATE tdeCert TO FILE = ‘path_to_file’

  WITH PRIVATE KEY (

  FILE = ‘path_to_private_key_file’,

  ENCRYPTION BY PASSWORD = ‘cert password’);

  4. 可选的,使服务器上SSL可用,以在传输过程中保护数据。

  在用户数据库中执行下面的步骤。这些要求在数据库上具有CONTROL权限。

  5. 创建由上面第二步所指派的证书加密的数据库加密密钥(DEK)。这个证书作为服务器证书以和其它可能存储在用户数据库中的证书相区别。

  CREATE DATABASE ENCRYPTION KEY

  WITH ALGORITHM = AES_256

  ENCRYPTION BY SERVER CERTIFICATE tdeCert

  6. 使TDE可用。这个命令开启了一个后台进程(加密扫描),它以异步方式运行。

  ALTER DATABASE myDatabase SET ENCRYPTION ON

  为了监控进程,查询sys.dm_database_encryption_keys 视图(要求具有VIEW SERVER STATE权限),如下面例子所示:

  SELECT db_name(database_id), encryption_state

  FROM sys.dm_database_encryption_keys

  2.4数据是怎么加密的

  当TDE可用(或不可用),数据库标识为在sys.databases范畴视图加密,并且DEK状态设置为Encryption In Progress。服务器开启一个后台进程(叫做加密扫描或扫描),它扫描所有的数据库文件并加密它们(或解密它们,如果你设置TDE不可用)。当DDL执行时,对数据库施加了一个更新锁。加密扫描是和DDL异步的,它使用了一个共享锁。所有不和这些锁冲突的一般操作都可以执行。不能执行的操作包括修改文件结构和分离数据库。如果一般的从缓冲池到磁盘的数据库写被加密了,那么日志文件写可能没有加密。扫描还使得在虚拟日志文件上执行了一个rollover以确保未来的写日志是被加密的。这在本篇文章的后面将会详细描述。

  当加密扫描完成时,DEK状态被设置为Encrypted(已加密)。这时磁盘上的所有数据库文件都加密了,并且数据库和日志文件到磁盘的写也将进行加密。支持的加密算法有128位、192位或256位密钥的AES或3 Key Triple DES。数据是以密码块链接(CBC)加密模式加密的。写到磁盘的已加密数据库文件和没有加密的文件是一样大小的,因为没有要求添加额外的东西,并且初始化向量(IV)和加密的DEK存储在已有的空间内。因为日志是添加到下一个VLF边界,所以日志的大小增加了。注意当数据库状态标识为可加密的时候,加密的实际状态应该通过DEK状态来进行监控。当后台扫描完成时,DEK状态设置为Encrypted。这时,未来的到日志和磁盘的写操作会受到保护。这在这篇文章的后面进行了详细描述。

  2.5什么是已加密

  TDE通过缓冲池在I/O 级别操作。所以,任何写到数据库文件(*.mdf)中的数据都被加密。快照和备份也被设计成会利用TDE所提供的加密,因此它们也在磁盘上被加密。但是在使用的数据却没有进行加密,因为TDE不提供内存或传输级别的保护。事务日志也受到保护,但是需要需要额外的申请。

  对于在使用中的数据,当它们被读取和存储到缓冲池中时所有的页面都被解密,在内存中是清楚的文本形式。操作系统可能将数据内存溢出看作是内存管理的一部分。在这个过程中,解密的数据可能会写到磁盘上。Windows和SQL Server可以配置为防止内存写到磁盘,不过这样的性能成本会很高。其它操作系统动作例如休眠和崩溃转储还会使得从内存写到磁盘上。传输中的数据没有受到保护,因为这个信息在到达以前已经是解密的了;应该使得SSL可以保护服务器和任何客户端之间的通信。

  当数据库页面文件写到磁盘上时,文件头并没有和其它数据一起加密,因为这个信息对于页面来说是需要重新加载的。头包含了状态细节,例如数据库兼容性级别、数据库版本、镜像状态,等等。任何重要的数据(例如DEK)在它插入到头之前都进行了加密。头还包括了一个数据损坏校验(CRC)。用户可以拥有一个对纯文本的校验和一个对加密文本的校验。这不是一个密码校验;它只监测数据损坏(检查看看数据是否是可读的),而不是数据完整性(检查看看数据是否被修改了)。所有的其它用户数据都是存储在加密的数据库页面上,包括所有未被使用的(或之前删除的)数据,以避免信息泄漏。当TDE在任何用户数据库上都可用时,加密还自动地可用于临时数据库(tempdb)。这避免了用户数据库使用的临时对象泄漏到磁盘上。除了tempdb之外系统数据库现在还不能使用TDE加密。

  I/O 级的加密还允许快照和备份被加密。因此数据库创建的所有快照和备份都将通过TDE进行加密。当写文件时用来保护DEK的证书必须存储在服务器上用于那些文件进行恢复或重新加载。因此,你必须维护所有证书使用的备份,而不仅仅是最新的证书。

  事务日志更加复杂。因为事务日志是旨在保证一次性失败安全的,TDE不对已经写到磁盘的日志进行加密。类似的,由于这个一次性写原则日志头不能被重写,因此写到日志的数据不会受到保护,即使是在TDE可用之后进行加密了的数据。TDE后台扫描使得日志前进到下一个VLF边界,这使得密钥可以存储在头里面。这时,如果文件扫描也完成了,那么DEK状态改变为Encrypted并且所有后来的写日志都会被加密。

  2.6对数据库的影响

  TDE旨在尽可能的透明。不需要任何应用程序改动,对于用户来说使用一个TDE加密的数据库和一个非加密的数据库是觉察不出区别的。

  如果数据库有任何只读的文件组,那么TDE操作是不被允许的,但是TDE可以用于只读文件组。为了使TDE在具有只读文件组的数据库上可用,首先文件组必须设置为允许写。在加密扫描完成之后,文件组可以设置回只读的。密钥改变或解密必须以相同的方式执行。

  TDE产生的性能影响是较小的。因为加密发生在数据库级别,数据库可以平衡索引和密钥以做到查询最优化。这使得可以进行全范围和相等扫描。在使用样例数据和TPC-C运行测试时,整个性能影响估计为3-5%,并且如果访问的数据大多存储在内存中的话还可能低很多。加密是CPU进行的在I/O执行的。因此,具有较低I/O和一个较低CPU负载的服务器的性能影响是最小的。CPU占有率高的应用程序将导致性能大大下降,估计大约为28%。主要成本是在CPU利用方面,所以如果CPU占有量足够低的话,即使应用程序或服务器占有较高的I/O也不会受到太大的影响。而且,因为初始加密扫描启动了一个新的线程,这时性能会受到极大的影响;可能查看查询执行会差几个数量级。对于磁盘空间问题,TDE没有将数据库文件放到磁盘上,尽管它将在之前数据是怎样加密的中提到的事务日志放到磁盘上。

  TDE不是一种访问控制。所有具有访问数据库权限的用户仍然可以访问;他们不需要被赋予权限或提供一个密码来使用DEK。

  TDE只在SQL Server 2008企业版和开发者版本中可用。在其它版本中使用的数据库不能使用TDE来加密,并且TDE加密的数据库不能使用在其它版本中(服务器在进行连接或恢复时会报错)。

  2.7数据库备份

  当在一个数据库上TDE可用时,所有的备份都被加密。因此,必须特别注意要确保用来保护DEK的证书(看怎样是TDE可用)备份了,并与数据库备份一起维护。如果这个证书(或这些证书)丢失了,数据将无法读取到。将证书与数据库一起备份。每一个证书备份应该包含两个文件;这两个文件都应该可以存档(理想情况是与数据库备份文件分离开来以备安全)。或者,考虑使用外部密钥管理(extensible key management,EKM)特性(查看外部密钥管理)来存储和维护TDE所使用的密钥。

  2.8其它的写到磁盘特性

  如果一个特性是从缓冲池写到磁盘,那么数据是受保护的。特性直接从缓冲池外部写到文件必须手动管理加密和解密。因此,旧版本的全文搜索,以及甚至是新的文件流特性都不被TDE保护。

  2.9单元级加密

  SQL Server 提供了单元级的加密。单元级加密是在Microsoft SQL Server 2005中推出的,现在仍然受到完全支持。单元级加密是作为一系列内置函数来执行的,具有一个密钥管理层次结构。使用这个加密是一个手动处理过程,它需要重新设计应用程序架构来调用加密和解密功能。此外,schema必须进行修改,使得数据存储为varbinary,然后在读取的时候将它改回适当的数据类型。加密的传统限制是存在于这个方法之中的,就是不能使用自动的查询优化技术。

  2.10与TDE相比较

  单元级加密与数据库级加密相比多了一些优势。它提供一个更细粒度级别的加密。此外,数据直到使用的时候才解密(调用一个解密内置函数),以便即使是一个页面加载到内存,敏感数据也不是清晰的文本。单元级加密还允许显示密钥管理。密钥可以指派给用户并用密码来保护,以防止自动解密。这提供了另一个控制级别(用户扫描,例如,对他们各自的数据具有各自的密钥);然而,管理员要维护这些密钥所有加重了负担(尽管外部密钥管理——在本篇文章的后面回进行描述——还可以用来帮助管理)。因为单元级加密是高度可配置的,对于具有明确安全要求的应用程序来说它可能是很适合。

  单元级加密的主要缺点是应用程序要使用它就需要进行改动、以及性能影响和管理成本。正如前面说过的,加密和解密要求你使用内置函数。这完全是一个手动处理过程,它要求varbinary数据类型;这意味着字段必须从它们的原始数据类型改为varbinary。在安全方面,加密总是会加入些东西,所以相同的数据加密后会得到不同的值。结果,参考一致性例如外键和候选键例如主键对这些加密的字段不能产生任何作用。这也影响了查询优化——加密字段上的索引没有了作用,所以范围和相等检索变成了全表扫描。TDE使得可以使用索引和其它传统的查询优化工具,以及批量执行加密。

  一个大略的比较,使用单元级加密执行一个相当基本的查询(选择和解密一个单独的加密字段)大概会差20%。这反过来扩大了工作负载的规模,导致性能比加密整个数据库时下降了几个数量级。一个具有10,000行的样例应用程序比一个加密字段差了四倍,比九个加密字段差了20倍。因为单元级加密是为每一个应用程序定制的,所以性能下降将很大程度上取决于应用程序和工作负载的特性。正如在对数据库的影响中提到的,平均下来它是TDE的3-5%,最坏情况下是28%(假设没有运行加密扫描)。

  尽管这些对于单元级加密的性能考量可以通过清晰的应用程序设计来减轻,但是要更加注意防止数据的意外泄漏。例如,假设有一个快速的scheme 可以使用敏感数据的哈希数据来进行快速相等检索。如果这些哈希数据是存储在和加密数据一起的一个字段中,那么如果两行具有同样的值它就会变得很清楚,因为哈希是一样的。必须进行额外的安全审查,以确保不会发生无意识的数据泄漏,所以数据库和应用程序都必须确认是安全的。TDE通过最大范围的加密从而防止这些数据泄漏的发生。在单元级加密和数据库级加密中,信息都是在服务器上解密的;解密数据是以文本形式发送到客户端的。推荐使用SSL来保护这个链路。

  2.11 TDE的推荐用法

  单元级加密可以用于深度保护使用TDE加密的数据库和通过使用密码来限制访问控制。通过这个方式,即使TDE或验证被破坏了,如果数据用一个密码从根部进行了加密以便它不容易被访问到,那么数据也可能是安全的。如果使用单元级加密的所有缺点都发生了,那么使用单元级加密和TDE可能对高敏感数据的子集是很有用的。

  一般情况下,TDE和单元级加密完成两个不同的目标。如果要加密的数据数量非常小或者应用程序可以定制设计来使用它(或如果应用程序具有定制设计要求)并且不用考虑性能影响,那么推荐使用单元级加密而不是TDE。否则,推荐使用TDE进行加密现有的应用程序或对性能要求严格的应用程序。此外,单元级加密可用于SQL Server的所有版本,而TDE只能用于SQL Server 2008企业版和SQL Server 2008开发者版本。

  2.12 外部密钥管理

  外部密钥管理((EKM)是SQL Server 2008的另一个新特性。它使得密码密钥层级的各个部分可以用外部源来管理——例如硬件安全模块(HSM)——作为一个加密提供商。使用这些密钥的加密和解密操作通过加密提供商来进行处理。这提供了在加密提供商中的灵活性和选择,以及公钥管理。TDE支持EKM所提供的非对称密钥。TDE不支持其它形式的非对称密钥,并且数据库证书目前不能通过EKM提供。EKM通过对称密钥和非对称密钥提供对单元级加密的支持。极力推荐你使用EKM和数据库级加密与单元级加密以获得更全面的密钥管理和基于硬件的加密(如果可能的话通过HSM)。

  3. Windows文件加密

  Windows根据它安装的是那个版本,提供了两个粒度文件保护。在大多数的Windows 2000发布版本和后来的版本(包括Windows Vista®)中,可以使用文件加密系统(EFS)。EFS在文件级加密数据。BitLocker是一个新技术,它在空间级加密数据。它在Windows Vista Enterprise Edition、Windows Vista Ultimate Edition和Windows Server® 2008的所有版本中都可用。

  3. 1文件加密系统

  EFS是Windows 2000中推出的一个文件加密特性。像SQL Server中的加密一样,EFS依赖于Windows Cryptographic API(CAPI)。文件和文件夹都可以标记为已加密的,尽管加密实际上只发生在文件级。每一个文件都由一个单独的文件加密密钥(FEK)进行加密,就像在TDE中每一个数据库用一个单独的DEK加密一样。FEK由用户的证书保护,和证书怎样保护DEK类似。EFS证书指派给一个用户,而概念上来讲TDE证书是一个服务器级的对象。可用多个证书来加密FEK,这使得不止一个用户可以访问文件。当使用EFS和SQL Server时,数据库服务器服务帐户必须具有访问文件加密密钥来加密任何数据库文件的权限,以便它可以读取这个文件。这不能作为一种访问控制的形式——无论登陆帐户怎样,服务帐户是用来读取数据库文件的。

  3. 2与TDE相比较

  作为一个操作系统级别的加密特性,EFS具有一些优点。TDE只限于数据库文件,而EFS允许非数据库和甚至是文件夹级别的加密,这使得它可以进行更广泛的加密。密钥管理提取到操作系统,这使得用户可以利用Windows证书存储。如果密钥丢失了,那EFS会提供一个数据恢复路径,而TDE现在还没有类似的解决方案。

  EFS与TDE相比的缺点,主要是在性能和管理方面。EFS不是旨在高并发的随机访问(它不支持prefetch或异步I/O)。因此,I/O操作可能会成为瓶颈并连续执行。虽然这在一般情况下影响很小,但它已经成为了关注数据库使用的一个原因。EFS要求在操作系统级的文件管理权限,而这是数据库管理员可能不具有的。因为保护是由EFS进行的,所以分离数据库、备份数据库或添加文件组可能就不受保护,如果这些文件是放在EFS所不保护的地方的话。还有,EFS的执行可能随着版本发布而改变。这通常不是问题,因为EFS主要用在一个单独的计算机上用于一个单独的用户,但是它也是需要考虑的。

  3. 3 TDE的推荐用法

  EFS最好用在数据库只被少量用户使用的移动PC、桌面或工作站上。由于性能考虑,EFS一般不推荐与TDE一起使用,尽管没有什么阻止EFS和TDE一起使用(或者一般情况下与SQL Server一起使用)。当性能不是问题和当希望进行深度防范的时候,EFS和TDE一起使用就是一个可行的选择。EFS还可以用来代替TDE进行文件组级别的粒度。还有,因为它在文件夹级别进行保护,所以EFS可以用来保护一些当数据写到磁盘上去的特殊情况。在性能是一个主要考量的情况下,不推荐EFS和SQL Server一起使用。

  3. 4 BitLocker驱动盘加密

  BitLocker是在Windows Vista Enterprise Edition、Windows Vista Ultimate Edition和Windows Server 2008的所有版本中所包含的一个空间加密特性。默认情况下,如果有可用的可信平台模块(TPM),那么BitLocker利用它来提供导入完整性保护。

  3. 5 BitLocker和EFS

  EFS和BitLocker的比较超出了本篇文章要讨论的范围,因为它们都是复杂的技术,需要讲述很多细节,没有办法在这里一一介绍到。一般情况下,EFS旨在保护用户数据,而BitLocker 旨在保护空间和系统数据。在Microsoft SQL Server 性能方面,BitLocker 的磁盘读写延迟较低,没有EFS所具有的并发问题。

  3. 6与TDE相比较

  BitLocker和TDE都是主要保护脱机攻击。BitLocker进行空间级保护,所以当服务器是联机状态时,空间是开放状态,尽管没有解密。像EFS一样,BitLocker具有一个数据恢复机制,而TDE现在还没有这个机制。使用BitLocker的优势在于易于管理、提取密钥管理和透明性。缺点是这个保护只扩展到空间保护。分离或备份数据库到一个不受EFS或BitLocker保护的不同空间上会引起文件失去现在所具有的任何保护。BitLocker的其它缺点是保护的宽度。因为整个空间都是开放的,任何具有可访问磁盘上文件的计算机访问权限的用户都可以以文本形式访问这些数据。和TDE类似的,BitLocker依赖于访问控制的其它机制(例如TDE所使用的数据库权限和BitLocker所使用的Windows文件权限)。而使用EFS,数据库管理员可能不具有管理BitLocker所必要的权限。

  3. 7 TDE的推荐用法

  BitLocker没有与EFS相关的类似性能考量,所以推荐你采用TDE和BitLocker进行深度防范。正如在之前讨论的,存在内存可能被写到磁盘的情况,例如休眠或崩溃转储。此外,其它的特性可能写到TDE外的磁盘上。BitLocker可用于减轻这些状况程度。

  4.总结

  那些找寻数据库级别加密的人们在SQL Server和Windows中有很多选择。这些选择不是相互排斥的。在SQL Server和Windows中可用的不同加密级别可以用来提供深度防范和更好的全面安全保护。透明数据加密提供了良好的易于管理、易于使用、良好的性能和安全性。TDE还提供了一个全面防范,因为数据库会保持加密,即使它移到另一个地方去。备份和快照不需要服务器管理员提供支持就受到保护。EFS和BitLocker无论是和TDE结合使用还是作为单独的加密系统都是有效的解决方案。TDE不是为了替代这些解决方案。单元级加密提供了更多的细粒度控制,包括要牺牲性能、易于使用和管理的显示密钥管理。BitLocker和EFS在TDE不提供崩溃转移或休眠文件时提供保护(如果保护系统空间或系统文件夹)。BitLocker和EFS(以及更受限的单元级加密)可以用来保护系统数据库(master、model、resource和msdb),而TDE现在还不能做到。EFS一般更有效,因为TDE只能用在SQL Server 2008企业版或SQL Server 2008开发者版本,而BitLocker只在Windows Vista Enterprise、Windows Vista Ultimate或Windows Server 2008中可用。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16436858/viewspace-553575/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-10-17

  • 博文量
    1319
  • 访问量
    2079762