转:探讨SQL Server 2005的安全策略
一、简介
SQL Server 2005是继SQL Server 2000之后的又一次重大成功。单从安全方面看,它在认证和授权方面比以往都有了大幅度的提高;同时,它还提供了本机加密支持—能够实现比以往其它版本更安全的数据库应用程序设计和实现。
“自古以来”,软件安全是一个相当重要的问题。Windows 2003 Server是微软第一个“缺省安全”产品。缺省情况下,整个服务器是被锁定的,所以,你必须自己去激活每个你想要使用的服务。因此,一个攻击者必须花费相当的代价才能攻破该系统。
与此相同的策略被应用到SQL Server 2005中。缺省地,整个数据库服务器也被锁定,这样每个服务和特性必须通过手工激活才能使用。由于这个原因,SQL Server与SQL Server表面区域配置工具一同发行—通过这个配置工具,你可以定义在SQL Server的安装过程中哪些服务和特性将被激活。
本文我们主要分析一下在新版的SQL Server 2005中,其在安全方面作出的重大改进。
二、 认证
认证是你成功存取SQL Server的第一步。下图1展示了这种安全概念背后的相应模型。
图1.SQL Server的安全概念 |
就象以前的版本一样,SQL Server 2005也支持Windows和混合的认证方式。由于安全原因,微软特别推荐使用Windows认证方式。在这种方式下,安全检查是针对于活动目录进行的;但是,这样的缺点是,用户和数据库服务器必须驻留在相同的活动目录域内。
当你使用SQL Server混合认证方式时,由SQL Server负责处理登录委任状。这种配置在有些时候非常重要;但是,随之而来的缺限是你无法使用诸如活动目录等所提供的底层安全架构。
SQL Server 2005新增的一项功能就是,当你使用Windows认证模式时,它能够对认证过程的口令字和注销策略进行管理。你可以管理帐户约束、如强口令字或终止日期等。然而必须注意,只有在SQL Server 2005安装到Windows 2003 Server上时你才能使用这些特性。另外,这些功能相应的API在其它Windows平台上是无法使用的。
在你为一个帐户设置口令时,可以使用下列限制:
口令的长度必须是至少6个字符(SQL Server支持从1到128个字符的口令长度)。
口令必须使用不同类型的字符(大写,小写,数字,特殊的符号等等)。
口令中不能包含象“Admin”,“Administrator”,“Password”,“sa”或者“sysadmin”这样的短语。
除这些限制以外,一个口令字不能为空。
当你建立一个新的登录时,你可以通过T-SQL语句CREATE LOGIN使用扩展的CHECK_EXPIRATION和CHECK_POLICY来实现。CHECK_EXPIRATION能够控制登录的终止日期,而CHECK_POLICY用于激活上面描述的口令策略机制。新的选项MUST_CHANGE能够让用户在第一次登录时可以改变他/她的口令(SQL Server 2005 Beta 2版不支持这个特征)。列表1展示了使用这些新选项的部分代码:
列表1
CREATE LOGIN Paul WITH PASSWORD='P@ssw0rd1' |
三、 授权
在一个用户被SQL Server成功地认证后,接下来进行的是授权过程以决定该用户在数据库上有哪些权限。在这一方面,SQL Server 2005又增加了两个新特性:
用户与模式分离开来
执行上下文
(一) 用户和模式的分离
模式是一个容器—你可以在其中对数据库对象(表,存储过程,视图,等等。)进行逻辑分组。这与.NET框架基类库中的命名空间是一样的。因为SQL Server中的一个模式也可能有一个所有者,因此你可以指令在一个给定模式中的每个对象都拥有一个相同的所有者。SQL Server 2000的实现模式并不很好:模式的名字与用户的名字是相同的。因此,在模式和数据库对象的所有者之间存在一个直接的关系(见图2)。
图2.原来在SQL Server 2000中的用户和模式关系 |
SQL Server 2000中的最大问题在于在一给定模式中的对象必须使用完全限定名(schema.objectname);但是,当你从数据库中删除一个表时,该对象的完全限定名会发生改变。因此,你对数据库所作的改变将也会不幸地发生到客户端的查询中,而且有时这样的改变将付出昂贵的代价。而在SQL Server 2005中,模式成为数据库中一个单独的拥有名字和所有者的本机对象。这样的模式与用户不再存在关系(见图3)。
图3.在SQL Server 2005中用户和模式分离开来 |
列表2
USE master |
(二) 执行上下文
SQL Server 2005的另外一个新特征是允许你改变一个存储过程的执行上下文。你可以通过用EXECUTE AS语句来改变执行上下文进而控制这些数据库对象是以哪些用户身份执行的。EXECUTE AS语句支持下列选项:
EXECUTE AS CALLER
EXECUTE AS USER='user name'
EXECUTE AS SELF
EXECUTE AS OWNER
EXECUTE AS CALLER是默认选项,这时一个存储过程是以调用用户的身份执行的。使用EXECUTE AS USER选项时,存储过程则用你指定的用户身份执行。当你使用EXECUTE AS SELF时,存储过程用创建者的身份执行。最后,你可以使用EXECUTE AS OWNER来执行存储过程,其身份是该对象的所有者。
四、 密码学技术
当你在某一应用程序中使用密码学技术时,你必须设法对密钥(或是一非对称算法的私人密钥或是一对称算法的共享密钥)进行管理。SQL Server 2005提供了两个选项来管理用户密钥:
用户自己管理密钥
由SQL Server为你管理密钥
当你自己管理密钥时,SQL Server用存在于数据库中的一给定口令字来存储对称密钥,这时你必须把该口令字保存在一个秘密的地方。而当由SQL Server来替你管理密钥时,它使用服务主键和数据库主键技术。图4展示了这一概念背后的思想。
图4.SQL Server 2005中的服务和数据库主键 |
正如你所见,这个服务主键处于服务器级别上。该键在SQL Server安装过程中被创建并且通过数据保护API(DPAPI)保护起来。用几个T-SQL语句,你就能把服务主键复制到一个文件中并能够从文件中恢复回去。
数据库主键处于数据库级上并且必须通过administrator来显式地创建。可以通过口令或服务主键来对该主键进行加密。列表3说明了如何创建数据库主键:
列表3
CREATE MASTER KEY ENCRYPTION BY PASSWORD='p@ssw0rd1' |
用对称密钥加密
用非对称密钥加密
用证书加密
你可以用T-SQL语句“CREATE SYMMETRIC KEY”来创建一对称密钥。这样的加密是通过一存储在表sys.symmetric_keys中的口令字或数据库主键进行的。为了使用一对称密钥,你必须先用语句OPEN KEY(见图5)打开它(这包括密钥的解密),之后,你就可以把该密钥用于你自己的加密目的。
图5.用对称密钥进行加密 |
对称密钥的优点在于它的高性能—它大约比同样的非对称密钥快1,000到10,000倍。缺点是加密和解密都使用一把密钥,而且双方都必须知道该密钥。你可以用语句“CREATE ASYMMETRIC KEY”来创建一非对称密钥。这样的密钥还可以通过一口令字或数据库主键来加密。列表4告诉你如何创建一非对称密钥:
列表4
--用口令加密 |
一非对称密钥总是被存储在表sys.asymmetric_keys中。在你创建该密钥后,你能使用函数EncryptByAsmKey来加密数据而用DecryptByAsmKey来解密被加密的数据。列表5展示了这两个函数的使用:
列表5
DECLARE @EncryptedStuff varchar(1000) |
最后,你还可以使用证书来加密数据,或者是一个现有证书—把它导入进数据库服务器中即可或是一个通过T-SQL语句“CREATE CERTIFICATE”创建的新证书。一个证书本身也能通过一口令字或通过数据库主键被加密。列表6显示出这两种可能性:
-- 用口令加密 |
本文通过一些片断示例,分析了SQL Server 2005在安全方面提供的新功能。尤其应注意到,它在密码功能上作了很大改进。SQL Server 2005将更加成熟起来并在大型企业开发领域发挥重要作用。