简介
本白皮书面向的对象是 Microsoft SQL Server 管理员和开发人员,主要是介绍 SQL Server 2000 Service Pack 3 (SP3) 的安全功能。本文讨论了安全方面的一些最佳做法,给出了详细的建议信息,并提供了一些源代码示例。最后,列出了安全最佳做法检查表。本白皮书的重点是 SQL Server 引擎。有关复制、分析服务或数据转换服务的详细讨论,请参阅 http://go.microsoft.com/fwlink/?LinkId=15402。
前提
SQL Server 2000 安全是基于 Microsoft Windows NT 4.0® 和 Windows 2000 安全模型实现的,因此,阅读本白皮书的前提是读者对 Windows NT 4.0 和 Windows 2000 安全有一个基本的了解。另外一个前提就是,读者理解域、全局组、本地组和用户帐户应用于 Windows NT 4.0 安全上下文时的概念,以及 Windows 2000 中 Microsoft Active Directory ®的概念。
对于那些对代码示例感兴趣的读者,学习 Microsoft Visual Basic® 和结构化查询语言 (SQL) 有助于增强理解。此外,有使用 SQL 分布式管理对象 (SQL-DMO) 的经验对理解本白皮书中的内容也大有好处。
但是,即便是那些对 Windows NT 4.0、Windows 2000 或 SQL Server 知之甚少的读者,通过阅读本文,也将对使用这些产品时的安全性有一个大概的了解。
SQL Server 2000 安全模型
SQL Server 2000 安全模型是基于 Windows 安全模型实现的。有关 Windows 安全最佳做法的详细讨论,请参阅 http://go.microsoft.com/fwlink/?LinkId=15392。
应该按图 1 所示保护 SQL Server 2000 的安全。
图 1:Windows 用户和组为 SQL Server 管理员提供了强大且灵活的安全模型
上图中的步骤可以总结为如下几点:
1. 将每个域中的用户指派到 Windows 全局组。
2. 将各个域中的 Windows 全局组放入 Windows 本地组。
3. 授予 Windows 本地组登录 SQL Server 2000 的权限。
4. 授予 Windows 本地组访问适当数据库的权限。此 Windows 本地组可能与步骤 3 中被授予登录权限的本地组不同。因此,通常重复步骤 1 和 2 来按需要的访问权限组织用户。
5. 为 Windows 本地组分配对特定数据库对象的访问权限。
另一种实现安全的途径是基于角色的使用,通常通过如图 2 所示的方式来实现。
图 2:基于角色的安全是 SQL Server 2000 中的另一个安全选项
当使用角色来分配对象权限时,仍然需要使用建议的方法为各个用户授予对服务器和数据库的访问权限。
步骤 1 到步骤 4 与图 1 中基本相同,所不同的只是可能不必创建多个 Windows 全局组和本地组。同时,它还对 Windows 2000 通用组提供完全支持。
步骤 5:将各个 Windows 帐户和 Windows 组分配给某个角色。
步骤 6:为角色分配对象访问权限。
使用角色,通过在 SQL Server 2000 内组织用户而减少了在 Windows 内组织用户的需要。
身份验证模式
SQL Server 2000 提供两种身份验证模式来保护对服务器访问的安全:Windows 身份验证模式和混合模式。
Windows 身份验证模式
Windows 身份验证模式是 SQL Server 2000 中的默认身份验证模式。在 Windows 身份验证模式下,SQL Server 2000 仅依赖用户的 Windows 身份验证。然后,授予 Windows 用户或组对 SQL Server 的访问权限。使用此模式与服务器建立的连接称为信任连接。
当使用 Windows 身份验证模式时,数据库管理员通过授予用户登录 SQL Server 2000 的权限来允许他们访问运行 SQL Server 的计算机。Windows 安全标识符 (SID) 用于跟踪已经过 Windows 验证的登录。使用 Windows SID,数据库管理员可以直接授予 Windows 用户或组登录权限。
混合模式
在混合模式下,可以使用 Windows 身份验证或 SQL Server 身份验证对用户进行验证。SQL Server 负责维护经过 SQL Server 身份验证的用户的用户名和密码对。
如果客户端和服务器能够使用 NTLM 或 Kerberos 登录身份验证协议,则以混合模式连接的 SQL Server 就像使用 Windows 身份验证模式一样,也依赖 Windows 来验证用户身份。如果客户端无法使用标准 Windows 登录,则 SQL Server 要求提供用户名和密码对,并将其与存储在系统表中的用户名和密码对进行比较。依赖用户名和密码对的连接称为非信任连接或 SQL 连接。
在内部使用安全标识号
SQL Server 使用 SID 跟踪信任的登录。可以直接对 Windows 用户和组授予对数据库或特定数据库对象的访问权限。例如,Jane 同时是 Windows 中 SALES 和 MARKETING 组的成员。SALES 组被授予了登录 SQL Server 以及访问 pubs 数据库的权限。管理员可以通过 Jane 的 Windows 名称 REDMONDJane 授予其访问 authors 表的权限。Windows 帐户必须通过域和用户名来引用。在这种情况下,Jane 的 SID 将存储在 pubs 数据库的系统表中。SQL Server 2000 不支持用户主体名 (UPN)。例如,如果 Windows 登录包含域 SALES 和用户名 SOMEONE,那么登录到 SQL Server 时应使用 SALESSOMEONE,而不能使用 Windows 2000 Active Directory 所支持的 SOMEONE@MYCOMPANY.COM 形式的登录。
角色
角色的使用与 Windows 组的使用很相似。通过角色,可以将用户集中到一个单元中,然后对这个单元应用权限。对角色授予、拒绝或吊销权限时,将对其中的所有成员生效。可以用角色来代表一个组织中某一类工作人员所执行的某项工作,然后对该角色授予权限。当工作人员执行该项工作时,便成为该角色的成员;而当不再执行该项工作时,便不再是该角色的成员。这样,就不必在用户接受或离开某项工作时,反复地授予、拒绝或吊销每个用户的权限。
角色的功能之所以如此强大,其中涉及到了许多关键的概念。首先,除固定的服务器角色外,其他角色都是在数据库内部实现的。这意味着数据库管理员无需依赖 Windows 管理员来组织用户。第二,角色可以嵌套。嵌套的深度没有限制,但不允许循环嵌套。第三,数据库用户可以同时是多个角色的成员。
因为角色的这些特性,使得数据库管理员可以安排权限的层次结构,以反映使用数据库的组织的管理结构。例如,财务部门可能包含分别负责应付帐款和应收帐款的不同组。数据库管理员可以分别为 APEmployees 和 AREmployees 创建不同的数据库角色,并只对每个角色分配完成相应工作的雇员所需的权限。然后,数据库管理员可以创建一个 FinManagers 角色,并使之包含这两个限制较多的角色(APEmployees 和 AREmployees)。这样,FinManagers 将具有他们的直接下属雇员的所有权限。当某个负责应付帐款的雇员被提升为管理人员时,数据库管理员只需要将其添加到 FinManagers 角色中即可。
public 角色
public 角色在每个数据库(包括系统数据库 master、msdb、tempdb 和 model)中都存在。public 角色提供数据库中用户的默认权限,不能删除。其功能相当于 Windows NT 4.0 环境中的 Everyone 组。每个数据库用户都自动是此角色的成员,因此,无法在此角色中添加或删除用户。
预定义角色
SQL Server 2000 包括几个预定义的角色。这些角色具有预定义的、不能授予其他用户帐户的内在权限。有两种类型的预定义角色:固定服务器角色和固定数据库角色。
固定服务器角色
固定服务器角色的作用域在服务器范围内。它们存在于数据库之外。固定服务器角色的每个成员都能够向该角色中添加其他登录。
注意 Windows BUILTINAdministrators 组(本地管理员组)的所有成员都默认是 sysadmin 角色的成员。
表 1列出了 SQL Server 2000 中存在的固定服务器角色。
表 1:SQL Server 2000 固定服务器角色
要将用户添加到固定服务器角色中,请使用下列 Transact-SQL 语句:
/* Add Bob to the sysadmin server role */
exec sp_addsrvrolemember "REDMONDBob", "sysadmin"
可以将 Windows 用户和组添加到服务器角色中。下列代码显示了如何使用 SQL 分布式管理对象 (DMO) 集合将用户添加到服务器角色中:
' Declare variables
Dim oServer As SQLDMO.SQLServer
' Create a server object and connect
Set oServer = CreateObject("SQLDMO.SQLServer")
oServer.Connect ("SERVERNAME")
' Add Bob to the sysadmin server role
oServer.ServerRoles("sysadmin").AddMember ("REDMONDBob")
有关如何使用固定服务器角色的详细信息,请参阅 SQL Server 联机丛书。
固定数据库角色
固定数据库角色在数据库级别定义,并在每个数据库中都存在。db_owner 和 db_security 管理员角色的成员可以管理固定数据库角色的成员身份;但是,只有 db_owner 角色可以将其他用户添加到 db_owner 固定数据库角色中。
表 2 列出了 SQL Server 2000 中存在的固定数据库角色。
表 2:SQL Server 2000 固定数据库角色