代码改变世界

6.4 SQL Server 加密

2018-07-26 10:53  笑一笑十年少!!!  阅读(616)  评论(0编辑  收藏  举报

6.4 SQL Server 加密
在存储和传输中保护数据对于应用程序和服务的完整性是很重要的。Microsoft SQL Server2008为上述两种情况提供了一些选项。在本节中,我们将了解-些可以用来保护数 据的工具。
首先,不管使用的是对称密钥、非对称密钥还是证书,加密数据都有两个要素:加密
算法和密钥值。可用的加密算法包括DES(Data Encryption Standard)、3DES(Triple Data Encryption Standard)、RC4 和 AES_256 (Advanced Encryption Standard)。加密算法其实就
是一个数学公式,规定了如何把数据从明文转换成密文。密钥是一个值,在公式中用来决
定基于输入的实际输出。这和x+y 这样的基本代数差不多。在这种情况下,x 是明文 值, 是加密密钥,而z 是密文。当然,加密算法比这个公式复杂得多。 密钥有两种:对称的和非对称的。对称密钥使用同样的密钥值来加密和解密数据。这
对于加密大量的数据是很好的,但是其安全性相对较低。非对称密钥使用- 个密钥来加密
数据,而用另一个不同的密钥来解密数据。和对称密钥相比,其安全程度较髙,但是很耗
时耗力,并不适用于大量数据。一个优秀的加密方法是用对称密钥加密数据,然后使用非
对称密钥来加密对称密钥。证书使用非对称密钥,但是具有可用于身份验证或实现不可否
认性的额外功能。
现在看SQL如何提供加密服务。图 6-12展示了 SQL Server 2008使用的加密层级结构
的概览图。顶层是 Windows 层 ,其中包括 Windows Data Protection API (DPAPI)o DPAPI
负责使用本地机器密钥加密服务器的服务主密钥(Service Master Key)。服务主密钥是SQL 环境中加密链的顶层。首次创建低级别的密钥时,系统会自动生成服务主密钥。

服务主密钥的下面是数据库主密钥(Database Master Key)。数据库主密钥可以保护数 据库中所有证书的私钥和非对称密钥的私钥。它是采用3DES加密算法和密码加密的对称
密钥。该密钥的副本使用服务主密钥加密,并存储在主数据库和应用它的数据库中。如果
数据库被转移到另一个服务器上,可以使用OPEN MASTER KEY语句并提供加密密码来
解密数据库主密钥。
在数据库作用域中,还有可用于加密数据的对称密钥和非对称密钥,以及可以用于数
字签名和实现不可否认性的证书。下一节将讨论如何创建和管理这些不同的密钥类型。
应该首先创建数据库主密钥。记住数据库主密钥是对称密钥,用来加密数据库中的所
有私钥数据。如果使用非对称密钥或证书,这是非常有用的,因为创建它们时不需要提供
密码或其他保护与双方关联的私钥的机制。要为AdventureWorks2008数据库创建一个新的 主密钥,可以执行如下命令:
USE AdventureWorks2008 CREATE MASTER KEY
ENCRYPTION BY PASSWORD = »P@ssw0rd';
GO
创建主密钥需要数据库的CONTROL权限。如果已经创建了一个主密钥,那么要想创
建新的主密钥,必须删除现有的主密钥。如果现有的主密钥已被用来加密数据库中的一个
私钥,那么就不能删除它。
一旦创建了主密钥,就可以查询sys.database目录视图,通 过 is_master_key_encrypted_
by_serve r列査看该数据库主密钥是否已使用服务主密钥加密。该列使用一个布尔值表明数 据主密钥是否使用服务主密钥加密。如果数据库主密钥是在另一个服务器上创建的,该
值就为0。
SELECT NAME, [is一master_key_encrypted_by_server] FROM sys.databases
GO
在继续讨论使用其他密钥加密数据库信息之前,让我们看一看如何备份服务主密钥和
数据库主密钥。如果必须进行灾难恢复,且需要恢复使用这些密钥之一加密的数据,那么
这将是相当有用的。两种密钥的语法是相似的,但需要额外的一步来备份加密的数据库主
密钥。
首先看服务主密钥。很简单,在 BACKUP SERVICE MASTER KEY语句中使用一个文
件路径(可以是一个本地或UNC路径),以及一个满足密码复杂度要求的密码。备份文件时
使用密码可以防止他人将您的主密钥还原到另一台服务器上,然后解密您的数据库主密钥。
下列示例将把服务主密钥的备份保存到C:\KeyBackups文件夹(此文件夹必须已存在)中:
BACKUP SERVICE MASTER KEY TO FILE =•C :\KeyBackups\ServiceMasterKey* ENCRYPTION BY PASSWORD =•c@MplexP@sswOrd,; GO
如果需要还原该服务主密钥,可以使用如下语句:

RESTORE SERVICE MASTER KEY FROM FILE = * C :\KeyBackups\ServiceMasterKey * DECRYPTION BY PASSWORD =,c@MplexP@sswOrd,; GO
备份和还原数据库主密钥的方法如下所示:
--Backup the database master key USE AdventureWorks2008; OPEN MASTER KEY
DECRYPTION BY PASSWORD = ,P@ssw0rd'
BACKUP MASTER KEY TO FILE = 1C :\KeyBackups\AWorksMasterKey1 ENCRYPTION BY PASSWORD = 1dn9e8h93ndwjKJDf ; GO
一-Restore the database master key USE AdventureWorks2008; RESTORE MASTER KEY FROM FILE = 1c :\KeyBackups\AWorksMasterKey1 DECRYPTION BY PASSWORD = 1dn9e8h93ndwjKJD1 ENCRYPTION BY PASSWORD = ,P@sswOrd, GO
对于上述示例,有两个注意点。首先,要备份数据库主密钥,必须使用最初加密它的
密码解密它。第二,在使用RESTORE MASTER KEY语句时,需要提供一个用于加密数
据库主密钥的密码。如果没有这一步,该命令就会失败。
6 .4 .1 可扩展的密钥管理
SQL Server 2008中一项最重要的新功能是可扩展的密钥管理(EKM, Extensible Key
Management)。它使用 Microsoft Cryptographic API(MSCAPI)在 SQL Server 2008 环境的外部
生成和存储用于数据和密钥加密的加密密钥。这可以提供一个更健壮、更灵活的密钥管理
机制,因为现在可以分离密钥和它们保护的数据。
这通常通过使用HSM(Hardware Security M odel,硬件安全模块)实现。HSM供应商可
创建一个与MSCAPI连接的提供程序,提供一部分HSM功能给SQL Server 2008和其他利 用 MSCAPI的应用程序。遗憾的是,由于MSCAPI用作HSM和 SQL Server之间的中间层,
它无法将HSM的所有功能提供给SQL Server。
为了使用EKM,必须首先在服务器上启用它。它默认是关闭的,但可通过sp_configure 命令打开。由于启用EKM是髙级功能,因此必须指定show advanced配置。下面的示例展 示了如何为服务器打开EKM:
sp__configure ' show advanced*, 1;
GO
RECONFIGURE
GO
sp_configure 1EKM provider enabled*, 1;
GO
RECONFIGURE
GO

在启用了 EKM后,现在可在HSM模块、智能卡或USB设备上存储加密密钥。不管
何时使用存储在这些设备上的密钥加密数据,要解密数据,必须连接上这些设备。这可防
止未经授权的用户将数据库文件复制并放至欺骗性服务器,从而访问所有秘密数据。
EKM还可提供下列好处:
• 其他授权检査
• 更易于密钥恢复
• 加密密钥检索
• 外部密钥生成和存储
• 外部密钥保留和旋转
• 更髙性能的基于硬件的加密和解密
• 管理密钥分布
• 安全的密钥处理
6 . 4 . 2 加密工具
在了解加密的一些基本知识后,下面讨论如何创建和管理加密工具。本节中的每个对
象都有一个特定的目的。在学习了如何创建对称密钥、非对称密钥和证书之后,您将学习
如何使用它们。
1 .对称密钥
如前所述,对称密钥提供一个用于加密大量数据的有效模型。使用同样的密钥来加密
和解密可以把资源开销降到最低。下面是生成对称密钥的语法:
CREATE SYMMETRIC KEY name [AUTHORIZATION owner] [FROM PROVIDER] providername WITH options ENCRYPTION BY mechanism
表 6-21列出了可以使用的参数。

创建一个对称密钥
下面的例子创建了一个名为SalesKeyl的新的对称密钥,该密钥使用的是192位的
3DES(3KEY)算法:
USE AdventureWorks2008 GO
--Create Symmetric Key CREATE SYMMETRIC KEY SalesKeyl WITH ALGORITHM =TRIPLE_DES_3KEY,
KEY_SOURCE =*The quick brown fox jumped over the lazy dog', IDENTITY一VALUE = 1FoxAndHound* ENCRYPTION BY PASSWORD = * 9348hsxasnA@B1;
GO
可以使用ALTER SYMMETRIC KEY语句添加或删除用于加密密钥的方法,也可以使
用 DROP SYMMETRIC KEY语句删除对称密钥。
在这个例子里,使用之前在“数据库用户” 一节中创建的SalesCert证书来加密对称密 钥,然后删除前例中的密码加密。
--Open the symmetric key OPEN SYMMETRIC KEY SalesKeyl DECRYPTION BY PASSWORD =*9348hsxasnA@B* 一-Add encryption using the certificate created earlier ALTER SYMMETRIC KEY SalesKeyl ADD ENCRYPTION BY CERTIFICATE SalesCert —— Remove the password encryption ALTER SYMMETRIC KEY SalesKeyl DROP ENCRYPTION BY PASSWORD =•9348hsxasnA@B, —— Close the symmetric key CLOSE SYMMETRIC KEY SalesKeyl
2 .非对称密钥
非对称密钥使用的是一对密钥而不是一个密钥。这些密钥通常被称作公钥和私钥。一
个密钥用来加密,而另一个则用来解密。哪一个密钥用来加密都没问题,但是如果没有相
应的密钥,则无法解密数据。创建非对称密钥对的方法与创建对称密钥的方法类似。下列
所示为生成非对称密钥的语法:

CREATE ASYMMETRIC KEY name [AUTHORIZATION owner] [FROM key_source WITH ALGORITHM = algorithm [ENCRYPTION BY PASSWORD = 1 password']
表 6-22列出了可用的参数;

在创建非对称密钥对时,可以指定密钥对的所有者和密钥源(可以是一个强名称文件、
一个程序集或一个可执行的程序集文件)。另外,也可以使用一个决定私钥使用的位数的算
法 ,选择密钥长度是512、1024还 是 2048位 。还可以 使用ENCRYPTION BY PASSWORD
选项来加密私钥。如果没有指定密码,数据库主密钥将加密私钥。
USE AdventureWorks2008 CREATE ASYMMETRIC KEY HumanResources WITH ALGORITHM =RSA_2048;
GO
可以使用ALTER ASYMMETRIC KEY语句更改密钥对的属性。可 以 使 用 REMOVE
PRIVATE KEY选项将私钥从数据库中删除(确保已经先备份过私钥),或者可以更改保护私
钥的方式。例如,可以更改用来加密私钥的密码,然后把保护方式从密码改为数据库主密
钥,反之亦然。
例如,使用下列代码,通过密码加密在前面的例子中创 建 的 HumanResources密钥对中 的私钥:
USE AdventureWorks2008 ALTER ASYMMETRIC KEY HumanResources WITH PRIVATE KEY (
ENCRYPTION BY PASSWORD = *P@ssw0rd*);
GO

在下一个例子中,通过先解密,然后用一个新的密码重新加密的方式更改用于加密私
钥的密码:
USE AdventureWorks2008
ALTER ASYMMETRIC KEY HumanResources WITH PRIVATE KEY (
DECRYPTION BY PASSWORD = *PQsswOrd1, ENCRYPTION BY PASSWORD = '48ufdsjEHF@*hda1); GO
3 . 证书
证书(也叫作公钥证书)是将一个非对称密钥对与一个凭据相关联的对象。证书不仅可以
用来加密,还可以用来进行身份验证和实现不可否认性。这意味着不仅可以模糊化通常是明
文形式的数据,还可以提供一种方法来确保源的可信任性,或者数据自签名后未被更改。
证书的细节标识了证书的创建日期、有效期限、创建人和用途。此外,还标识了和证
书关联的公钥,以及可以用来给消息进行数字签名的算法。
创建和使用证书的功能是在SQL Server 2005中首次引入的,即使是有经验的数据库管 理员一开始也不容易用好它。证书是应用程序安全和身份管理的一部分,而扩展至SQL
Server 2008的功能与在其他应用程序和服务中使用证书的方式是一样的。讨论这个主题几 乎就像是打开了潘多拉的魔盒,但是-旦了解证书的基本工作原理,以及它们如何用于保
护服务和数据之后,您就会体会到它的灵活性。
证书还允许跟踪其“家谱”(如图6-13所示)。这个证书层级结构不仅指明了这是由哪
个证书颁发机构(Certification Authority,CA)颁发的证书,还可以指明是哪个CA生成了被
该 CA用于生成这一证书的证书。这被称为证书链。证书链可以用来标识一个可由身份验
证信任的公共根CA(链中最髙级别的机构),也可以标识另一个被认为是可信任源的根CA。
很多应用程序和操作系统都包括一列自动被信任的商业CA。如果来自于一个根CA 的证
书被信任,那么派生于此根CA的证书也都是被信任的。如果证书不是来自于一个被信任
的链,用户可能会被筲告证书不被信任,继续操作时应该小心。商业CA通常用来获取服
务器身份验证和SSL证书,因为很多Web浏览器已经信任这些最常见的根CA 了。 很多公司都开发了自己的公钥基础结构(PKI)。这些公司发现,出于各种原因的考虑,
他们需要部署和使用证书。一些公司可能要求使用智能卡证书来登录他们的计算机。一些
公司可能会通过加密文件系统(EFS)使用证书来加密NTFS文件系统上的数据。一些公司可
能使用证书对应用程序和宏进行数字签名,这样它们的用户就知道程序的来源,以及程序
是够未被修改过。这些公司通常有自己的CA层级结构。他们可能会有一个自己管理的根
C A ,或者可能有能力生成自己的、但属于某第三方证书链的一部分的证书。
Microsoft SQL Server 2008可以创建自己的自签名证书。在某种程度上,SQL卩了成为
自己的C A ,但不要期望这些证书会在SQL实例之外被自动信任。SQLServei•生成的证书 符合X.509标准,如有必要可用在SQL Server外部,但它们不是可信层级结构的一部分。 更常见的方法是使用另一个CA生成的证书,然后将其导入SQL Server。证书在SQL Server 内外都可以广泛使用。可以将其用来进行服务器身份验证、加密和数字签名。

 

在加密方面,公钥证书和非对称密钥的操作方式一样。不过,密钥对被绑定到证书。
公钥包含在证书详细信息中,而私钥必须被安全地归档。与证书关联的私钥必须用密码、
数据库主密钥或另一个加密密钥保护。在加密数据时,最好的做法是使用一个对称密钥加
密数据,然后使用公钥加密该对称密钥。
当创建一个自签名的证书时,可以使用CREATE CERTIFICATE语句。可以选择一个
强密码或者数据库主密钥加密私钥。或者也可以使用CREATE CERTIFICATE语句从一个
文件导入证书和私钥。另外,可以基于已签名的程序集创建证书。
在证书创建完成之后,可以使用ALTER CERTIFICATE语句修改证书。可以执行的更
改包括改变保护私钥的方式或从SQL Server中删除私钥。只有证书被用于验证数字签名时 才需要删除私钥。如果公钥被用来加密数据或对称密钥,那私钥应当可以解密。
在创建证书时,最好 使 用 BACKUP CERTIFICATE语句备份证书和关联的私钥。您可
以只备份证书而不归档私钥,使用公钥来验证或加密只能用私钥解密的消息。
一旦证书不再需要,可 以 使 用 DROP CERTIFICATE语句删除它。但如果证书仍然和
其他对象关联,则无法删除它。
创建一个新证书
下面的例子创建一个名为PersonnelDataCert的新证书,后面将用它来加密数据。创建 这个证书之后,将证书备份至文件系统(可以更改例子中的路径,或者在C 盘上创建一个
名 为 terts的新文件夹)。最后将证书导入tempdb数据库中。
一一 Create the Personnel Data Certificate USE AdventureWorks2008; CREATE CERTIFICATE PersonnelDataCert

ENCRYPTION BY PASSWORD ='HRcertific@te'
WITH SUBJECT = * Personnel Data Encryption Certificate *, EXPIRY^DATE =•12/31/2011,;
GO
--Backup the certificate and private key to the file system Use AdventureWorks2008 BACKUP CERTIFICATE PersonnelDataCert TO FILE = * c :\certs\Personnel.cer * WITH PRIVATE KEY (DECRYPTION BY PASSWORD = •HRcertific@te*, FILE = * c:\certs\Personnelkey.pvk', ENCRYPTION BY PASSWORD ='QnotherPassword' );
-一Import the certificate and private key into the TempDB database USE tempdb CREATE CERTIFICATE PersonnelDataCert FROM FILE = *c:\certs\Personnel.cer1 WITH PRIVATE KEY (FILE ='c :\certs\Personnelkey.pvk•, DECRYPTION BY PASSWORD ='@notherPassword', ENCRYPTION BY PASSWORD =*TempDBKeyl');
GO
在下例中,使用ALTER CERTIFICATE语句更改用于加密私钥的密码:
Use tempdb ALTER CERTIFICATE PersonnelDataCert WITH PRIVATE KEY (ENCRYPTION BY PASSWORD = 'P@ssw0rd7891 , DECRYPTION BY PASSWORD = 1TempDBKeyl*);
GO
现在可以从AdventureWOrks2008数据库中删除私钥了。由于证书和私钥已被备份,所 以可以安全地执行此操作。
Use AdventureWorks2008 ALTER CERTIFICATE PersonnelDataCert REMOVE PRIVATE KEY
GO
最后,清理tempdb数据库:
USE tempdb DROP CERTIFICATE PersonnelDataCert; GO
4 .加密数据
在了解了可以用来加密或实现不可否认性的不同对象后,现在看看如何实际使用它
们。首先,并不是所有的内容都需要加密。加密和解密数据的过程会占用大量资源,所以
您应该注意到底需要加密哪些数据。需要保密的信息(如信用卡或社会安全号码)属于这一
类。雇员的中间名就不属于这一类别。同时要注意,并不是每一种数据类型都可以使用

EncryptByKey 函数加密。有效的数据类型是 nvarchar、char、wchar、varchar 和 nchar。
还需要知道选择在何时加密数据。表或视图中常被查询的列不应加密,因为解密大fi 会被一再查询的数据的过程通常会得不偿失。在这种情况下,更好的策略是将敏感信息存
储在一个得到更严格保护的单独的表中。记住,可在外表中的行上授予插入或更新权限,
而不必在相关表上授予选择权限。HSM可以抵销解密过程的一些开销,但可能要求执行大
量测试来验证其在生产中的性能。
加密数据之前,必须打开将执行加密过程的密钥。数据通常受对称密钥保护,而对称
密钥又受非对称密钥对保护。如果对称密钥受密码保护,那么对对称密钥和密码有ALTER
权限的用户都可以打开和关闭对称密钥。如果对称密钥由一个非对称密钥或证书保护,用
户还需要拥有非对称密钥或证书上的CONTROL权限。
试一试 创建一个加密列
使用以下示例代码在Sales.CreditCard表中创建一个加密列。这个例子使用了之前创建
的对称密钥SalesKeyl和证书SalesCert:
ALTER TABLE Sales.CreditCard ADD EncryptedCardNumber varbinary(128);
GO
OPEN SYMMETRIC KEY SalesKeyl DECRYPTION BY CERTIFICATE SalesCert WITH PASSWORD =•PesswOrd*
UPDATE Sales.CreditCard SET EncryptedCardNumber =EncryptByKey(Key_GUID(* SalesKeyl’),CardNumber); GO
CLOSE SYMMETRIC KEY SalesKeyl; GO
由于对称密钥用于加密数据,它也将用于解密。以前面的例子为模板,可以使用下面
的命令再创建一个新列来存储解密的数据。它包括了一个SELECT语句,以允许査看原来
的数据、加密后的数据和解密数据列:
ALTER TABLE Sales.CreditCard ADD DecryptedCardNumber NVARCHAR(25);
GO
OPEN SYMMETRIC KEY SalesKeyl DECRYPTION BY CERTIFICATE SalesCert WITH PASSWORD = 1PesswOrd1;
GO
UPDATE Sales.CreditCard SET DecryptedCardNumber =DecryptByKey(EncryptedCardNumber);
GO

CLOSE SYMMETRIC KEY SalesKeyl;
GO
Select TOP (10) CreditCardID, CardNumber AS Original, EncryptedCardNumber AS Encrypted, DecryptedCardNumber AS Decrypted FROM Sales.CreditCard;
GO
不过,没有必要创建一个全新的列来査看解密的数据。可 在 SELECT语句中执行
DecryptBykey函数来查看未加密的数据,如下列所示:
OPEN SYMMETRIC KEY SalesKeyl DECRYPTION BY CERTIFICATE SalesCert WITH PASSWORD = ,P@ssw0rd, ;
GO
SELECT CreditCardID, CardNumber,EncryptedCardNumber AS ’Encrypted Card Number *, CONVERT(nvarchar, DecryptByKey(EncryptedCardNumber)) AS 1 Decrypted Card Number’ FROM Sales.CreditCard;
GO
CLOSE SYMMETRIC KEY SalesKeyl;
GO

5 .透明数据加密
SQL Server 2008 的另一项新功能是透明数据加密(TDE,Transparent Data Encryption)。
TDE被设计为针对启用了 TDE的数据库或事务日志文件,使用数据库加密密钥(DEK, Database Encryption Key)执行实时I/O加密。TDE的好处是它保护“处于休眠状态”的所有数据。这 意味着当前未读入内存的数据都使用DEK保护。不过,当査询运行时,从查询检索的数据将
在被读入内存时解密。与使用对称和非对称密钥解密单个表或列中的数据不同,在读或写受
TDE保护的数据库中的表时,不必调用解密函数(因此其名称里使用了 “透明” 一词)。
设置TDE比其他加密方法要复杂些,因为在启用它之前,有一些条件必须满足:
(1) 首先,master数据库中必须有一个数据库主密钥。 (2) 其次,必须在master数据库中创建或安装一个可用于加密DEK的证书;或者可以 使用EKM提供程序的非对称密钥。
(3) 然后,需要在将加密的数据库中创建D EIC 最后,在数据库中启用加密。下列脚
本提供了一个示例:
USE master CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyStrongP@ssw0rd1;
GO
CREATE CERTIFICATE AughtEightTDE WITH SUBJECT = 'TDE Certificate for the AUGHTEIGHT Server1;
GO

USE AdventureWorks2008 CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM =TRIPLE_DES_3KEY
ENCRYPTION BY SERVER CERTIFICATE AughtEightTDE;
GO
ALTER DATABASE AdventureWorks2008 SET ENCRYPTION ON;
GO
也 可 使 用 SQL Server Management Studio管 理 数 据 库 的 “透明加密”属性。为此,可 以执行下列步骤:
(1) 在 “对象资源管理器”中,展 开 “数据库”节点。
(2) 右 击 AdvemureWorkdOOS数据库,并 选 择 “任务”命令,然 后 选 择 “管理数据库 加密”命令。
正如图6-14所示,通过这个窗口可以执行一些选项,包括使用服务器证书或服务器非
对称密钥(存储在master数据库中)“重新加密数据库加密密钥 ”,以及使用AES 128、AES 192、AES 256或 Triple DES加密算法重新生成密钥。还可选择或取消选择“将数据库加密 设置为ON” 复选框对该数据库启用或禁用TDE。

6 .数字签名
数字签名提供身份验证和不可否认性。通常,公/私钥对用于对消息进行数字签名(或
者,如果是代码签名证书,则针对的是应用程序或程序集)。下面是数字签名如何和电子邮
件消息一起工作的例子。
Bob给 Alice发送了一条消息,而他的邮件客户端被配置为自动为所有发出的消息添加他 的数字签名。在这种情况下,当消息准备好发送时,系统会生成一个密钥,然后传递给一

个哈希算法,将数据单向转换为一个哈希值。哈希值附加在消息上,而用于生成哈希值的
密钥由Bob的私钥加密。 该消息发送给了 A lice,她接收明文形式的消息,以及该消息的哈希值版本。Alice具有 访问Bob的公钥的权限,使用该公钥解密用来生成哈希值的密钥。于是该密钥被传递给哈 希算法,生成一个新的哈希。如果新的哈希与原来随消息一起发送的哈希匹配,Alice可以 确信该消息在发送过程中没有被更改。如果哈希值不匹配,那么说明该消息在发送之后已
被更改,不应被信任。
同样,可以使用数字签名来签署SQL Server组件(例如存储过程),把存储过程和一个 哈希值关联起来。就算该存储过程仅仅改变了一个比特,哈希值也会不同,这样您就知道
有人曾经对其使用了 ALTER PROCEDURE语句。
可以同时使用非对称密钥和数字证书来签署SQL Server中的存储过程、函数或DML 触发器。下面的代码创建了一个 名 为 Sales. DisplaySomeVendors的简单存储过程。然后可 以使用前面的SalesCert证书给该存储过程添加一个签名。需要解密该私钥来对该存储过程 进行数字签名。
CREATE PROCEDURE Sales.DisplaySomeVendors AS SELECT TOP (20) * FROM Purchasing.Vendor;
GO
USE AdventureWorks2008; ADD SIGNATURE TO Sales.DisplaySomeVendors BY CERTIFICATE SalesCert WITH PASSWORD ='P@ssw0rd';
GO
如果査看该存储过程的属性,可以看到它已经有了通过SalesCert证书签署的数字签名(如 图6-15所示)。也可以查询sys.cryptjroperties目录视图。该视图会显示任何已经被数字签名
的对象。下一个例子将查询sys.ciypt_properties视图,以查看分配给Sales.DisplaySomeVendors
存储过程的数字签名。然后可以修改该存储过程并再次査询视图,可注意到,该过程不再具
有数字签名了。

如果査看该存储过程的属性,可以看到它已经有了通过SalesCert证书签署的数字签名(如 图6-15所示)。也可以查询sys.cryptjroperties目录视图。该视图会显示任何已经被数字签名
的对象。下一个例子将查询sys.ciypt_properties视图,以查看分配给Sales.DisplaySomeVendors
存储过程的数字签名。然后可以修改该存储过程并再次査询视图,可注意到,该过程不再具
有数字签名了。

SELECT * FROM sys.crypt_properties GO
ALTER PROCEDURE Sales.DisplaySomeVendors AS SELECT TOP (10) * FROM Purchasing.Vendor
GO
SELECT * FROM sys.cryptproperties
6 . 5 最佳实践
与其他应用程序和服务器产品一样,应遵循一些指导原则来帮助提升安全级别。记住,
您永远都不可能为每个可能的威胁做好准备,但是可以让恶意用户更难访问数据。
• 使用强密码一 如前所述,应当利用密码策略,要求用户创建定期更改的复杂密码。
您应当使用户明白设置强密码的重要性。尽管针对SQL登录名实施的密码策略是
在服务器上进行管理的,但是您仍然应该提供一个应用程序或工具,允许用户更
改密码并在密码快要到期时通知他们。
• 不要以sa 帐户登录一 应 尽 量 少使用sa帐户。要提供更加确切的审核信息,必须 要求用户使用他们自己的登录名(或作为一个组中的成员登录),从而可以跟踪哪个
用户在执行什么操作。如果每个人都有sa密码,那么每个人都可以使用此帐户登 录,这就无法阻止他们窃取或破坏数据了。您不可能追究相关人员的责任,因为
您可能连他是谁都不知道。
• 对 SQL服务使用最小特权帐户一 应 用 最 小特权原则,并使用拥有正好满足服务
需要的权限的帐户。虽然把SQL Server帐户或SQL Server代理帐户设为管理员组 的成员很有诱惑力,但这并不是必要的。标识出每个帐户将与之交互的SQL Server 外部资源,然后仅指派需要的权限。
• 定期审核主体一 勤勉的管理员会知道已创建哪些帐户和谁要为这些帐户负责,并
且知道需要采取哪些步骤禁用或删除多余的帐户。
• 禁用或删除所有不使用的网络协议一 在 SQL Server配置管理器中,可以启用或 禁用SQL Server使用的协议。另外,如果服务器或应用程序不使用NetBIOS协议, 可以考虑对网络适配器禁用这个协议。
• 使用在线加密保护传输中的数据—— 仅仅保护服务器上的空闲数据是不够的。作为
一名数据库管理员,应该使用诸如SSL(Secure Sockets Layer,安全套接字层)和 IPSec(Internet Protocol Security, Internet协议安全性)等技术在数据从客户端向服务
器、从服务器向客户端或从服务器向服务器移动时保护它们。
• 不 要 把 SQL S erv er放在物理安全性低的地方--- Microsoft Security Response Center(Microsoft安全反应中心)曾经发表过一篇很著名的文章,叫做“ 10 Immutable
Laws of Security ” 。其中第一条规则就指出,如果恶意用户能够实地访问您的计算 机,那么这台计算机就相当于是别人的7 。除非您能够提供控制访问硬件的办法,
否则数据就很容易被窃取、泄露、损坏或者销毁。加硬件锁、限制进入服务器房
间,还有保安人员都可以帮助保护数据。

最小化服务器的可见度—— SQL Server决不应该公共可用。如果应用程序架构师和 数据库管理员采取了必要的措施来防范病毒攻击,那 Slammer蠕虫病毒根本算不 了什么。Slammer可以大量而快速地传播,因为只有很少组织意识到在自己的防火 墙中开放SQL连接的害处。设计良好的数据库应用程序会使用一个健壮而安全的
前端,把数据库引擎的可见度降到最低。
• 删除或禁用不必要的服务和应用程序一 应该关掉不使用的服务和功能,从而最小
化 SQL Server的受攻击面。通常来说,最好避免在SQL所在的机器上运行IIS、 活动目录和Exchange等其他服务。这些服务都可能成为被恶意用户所利用的入口
点,从而获得访问数据的权限。由于SQL Server Reporting Services不再需要IIS,
这可以帮助减少系统的受攻击面。
• 尽可能使用Windows身份验证----Windows和 Kerberos身份验证本身都比SQL 身份验证更加安全,但这是您、您的应用程序开发人员和安全小组都必须遵守的
设计决策。
• 不要对经常被搜索的列进行加密—— 加密经常被访问或搜索的列所导致的问题可
能比它解决的问题还要多。如果加密列是最好的或唯一的保护数据的方式,那么
必须在生产中进行加密前测试性能影响。
• 使用TDE保护休眠中的数据—— 加密数据库和事务日志文件可降低他人复制数据
文件并卷走敏感的商业数据的可能性。
• 总是备份数据加密密钥—— 这是显而易见的,但要确保安全可靠地备份用于加密
数据的密钥或其他加密密钥。同时测试备份和恢复策略。
• 了解您在公司安全策略中的角色一 大多数组织都有一个备案的安全策略,定义了
可接受的网络使用,以及对服务器或服务行为的期望。作为一名数据库管理员,
配置和保护服务器的职责可能会被备案为总体安全策略的一部分。对数据库管理
员以及服务器的期望必须明确表述。同时,也应清楚规定管理员的责任。
6 . 6 小结
在本章中,我们学习了 SQL Server 2008中的许多安全功能。您现在应该很好地了解了 如何自顶向下地将安全性应用于SQLServer中,包括: • 如何配置不同的身份验证模式
• 如何创建和管理服务器和数据库主体
e 如何指派和控制权限 • 如何保护服务器上的数据
您应该将本章中讨论的一些最佳实践应用到自己的环境中。记住,你不可能拥有绝对
安全的服务器,不要对自己的安全设计自信过头,因为“满招损”,这会导致您的安全设计
中出现相当大的漏洞。不过,通过本章的学习,您应该对实现本章讨论的安全机制充满信心。
在第7章中,我们将学习如何创建和管理SQL端点,以及如何使用各种连接方法来启
用对数据库资源的访问。