维普资讯 http://www.cqvip.com 第34卷(2006)第4期 计算机与数字工程 81 SQL Server 2000安全验证的故障诊断与分析 江南常春 (湖北工业大学计算机学院软件工程系武汉430068) 摘要:SQL Server 2000安全验证过程是其安全机制的一个重要组成部分。客户端程序,包括SQL Server 2000自带的客 户端程序,常常会出现不能正常连接的故障。本文从基本原理人手,对各种故障产生的根本原因进行分析并提供了解决方 案。 关键词:数据库安全验证故障诊断与分析 SQL Server 2000 中国分类号:TV392 Athentication DiagIl s and Analysis in SQL Server 2000 JiangNan ChangChun (Software Engineering Dept.,Computer Science School,Hubei University ofTechnology,Wuhan 430068) Abstract:Authenticaiton is a key part in hte context of SQL eSrver 2000 securiyt management.There are many kinds of problems fo connection for chems,including those clients within SQL eSver 2000.Based on securiyt principles of SQL eSrver2000,this paper gives the essential reins and rende1"8 solutions. Key words:Authenticaiton,Diagnosis and Analysis,SQL eSrver 2000 aa numl ̄r:TP392 1 引言 库进行操所要完成的第一步,可以说是迈人SQL Server2000的门槛。所谓客户端分为两种,一是 SQL Server是基于客户机/服务器的数据库管 SQL eSrver 2000自带的客户端工具,如服务管理 理系统,其主要功能是管理连接到同一网络中的所 器、企业管理器、查询分析器等;二是用户自己开发 有计算机。SQL Server的客户端提供多个用户界 的客户端程序,如ASP、VB、VC++程序等,这些客 面,用以向服务器端DBMS(DataBase Manangement 户端程序利用ODBC(Open Database Connection)或 System)提交请求,而服务器端DBMS对这些请求进 者OLE DB(Object Link and Embedded Database)等 行处理,并将结果返回到客户端。用户常会遇到诸 连接上SQL Server 2000。 如“未与信任SQL Sevrer连接相关联”等故障。这 无论哪种客户端,连接SQL Server 2000服务器 类故障一般产生于SQL Server的“验证(authenti. 需要提供一个登录ID(Identiifcation)。如果SQL caiton)”一种安全机制一一过程中。客户端在 eSvrer 2OOO验证这些ID不合法,它就不会被连接上, 向服务器端提交连接请求后,由于某些原因,SQL 这个过程就是验证(authentication)。所有登录账号, Serer认为客户端的请求不合法,因而产生这类故 必须都存在于SQL eSrver 2OO0企业管理器的“安全 障 性”文件夹下的“登录”中,并且在系统数据库master 2 基本原理 的syxlogins表中都有对应的一行记录。 sQL Sevrer 2000有两种类型的验证:Windows 首先详细剖析SQL Sevrer 2000验证所涉及到 身份验证和SQL eSrver身份验证,每一类验证都有 的有关原理。 一套属于自己的登录ID…。所谓Windows验证的 “验证”是客户端能够对SQL Server 2000数据 一套登录ID,即是Windows操作系统级上的账号标 收到本文时间:2005年6月27日 维普资讯 http://www.cqvip.com 82 SOL Server 2000安全验证的故障诊断与分析 第34卷 识,这些账号应该存在于计算机系统的“用户和组” 中。显然这类用户建立在操作系统级别上,号必须 再添加到SQL Server 2000企业管理器的“安全性” 文件夹下的“登录”中,它们在列表中的类型为 3 故障的产生原因、分析和解决 (1)先讨论一个重要的客户端一企业管理器连 接服务器时产生的问题。企业管理器是SQL erSv— “Windows用户”。所谓SQL Sevrer验证的一套登录 ID,是SQL Server 2000的内置用户,与操作系统级 上的用户和组无关。建立这类用户是在SQL Server er2000系统管理员用以与该数据库系统交互的主 要工具。它的两个主要功能是管理数据库服务器 和管理数据库中的对象。为了管理、配置和使用 20OO的直接管理下,且必须提供密码。这类登录 账号在列表中的类型为“标准”。 SQL eSrver 2000在安装时自动创建的特殊登 录账号有sa和BUILTIN\Adminstrators。sa是系统 管理员(System Administrator)的简称,该登录账号在 SQL eSrver 2000系统中拥有全部的权限,即可以执 行所有的操作,且既不能更改sa用户名称,也不能 删除sa,但可以更改其密码,它是属于“SQL eSrver 身份验证”的内建账号。而BUILTIN/Administrators 映射了操作系统级下属于系统管理员组的所有账 号到SQL eSrver 2000中,即是说如果在操作系统级 别创建了一个属于Administrators组中的账号,那么 此账号无需再添加到SQL eSrver2000的登录列表 中。它默认具有System Administrator权限,但是可 以被删除。需要注意的是,如果删除,有可能会遇 到一些连接问题,在下面的讨论中会讲解到。显 然,它是属于“Windows身份验证”的内建账号。 SoL eSrver 2000使用两种方式来执行这两种 验证类型l2],这是SQL eSrver 2000的安全模式管理 的范畴。SQL eSrver 2000的安全模式包括“仅Win— dows”和“SOL eSrver和Windows( ̄合)”两种。所谓 “仅Windows”,是指客户端只能使用“Windows用 户”类型的账号才可以连接上SQL Server 2000服 务器。这类验证过程为:SQL eSrver 2000信任操作 系统级别上的连接,从操作系统级取得用户的ID, 称为SID(Security Identifier),与master数据库的 sy ̄ogias表中记录匹配,若找到一个匹配,SQL eSrver 2000就接受此连接,验证过程结束。“仅 Windows”是默认的身份验证方式。所谓“SQL eSrv— cr和Windows(混合)”,是指客户端既可以使用 “Windows用户”类型的账号,也可以使用“标准用 户”类型的账号连接上SQL eSrver 2000服务器。 后者验证过程为:SQL eSrver 2000根据客户端提供 的登录账号和密码,与master数据库中的syxlogins 表中的记录匹配,若找到一个匹配,SQL Server 2000就接受此连接,验证过程结束;如果是“Win— dows用户”类型的账号,验证过程同“仅Windows”。 Microsoft SQL eSrver 2000,必须使用SQL Server En. terprise Manager注册服务器。注册服务器就是为 Microsoft SQL Server 2000这种client/server系统确 定一个数据库所在的机器,该机器作为服务器可以 回应客户机的各种请求l3]。在注册服务器的过程 中,需要指定企业管理器(作为客户端)与正要被注 册的SQL eSrver的实例(作为服务器)之间的连接 方式,即是客户端使用什么类型的登录账号,是通 过Windows身份验证还是SQL Server身份验证来连 接上服务器。所以作为与数据库系统交互的一个 界面,但是同时又作为一个客户端产品,企业管理 器也会产生与SQL eSrver服务器连接不上的问题。 通常产生的连接故障如下提示: “未能建立与x \x (服务器名)的连接。 原因:用户’sa’登录失败。原因:未与信任 SQL Server连接相关联。 请验证SQL Server是否在运行并检查SQL Server注册属性(通过右击XX.X、XX.X节点),然后重 试。” 或者出现: “由于如下所示的连接错误,SQL eSrver注册失 败,还要修改吗? 原因:用户’Sa’登录失败。原因:未与信任 SQL eSrver连接相关联。” 故障分析:由于企业管理器在注册时使用的是 “使用SQL Server身份验证”,而此时SQL Server 2000的安全模式设为“仅Windows”,这就是说,客 户端只有采用“Windows用户”类型的登录账号才 能够连接上服务器,而企业管理器在登录时用的是 “sa”这样一个“SQL eSrver标准用户”的登录账号, 于是服务器认为企业管理器没有建立与SQL eSrver 之间的信任关系(在“仅Windows”模式下,是靠SQL Sevrer和操作系统用户账号之间的信任来连接服 务器的)。 故障解决:此问题产生后,企业管理器不能正 常执行它所具有的功能,但是仍可修改其注册属 性。正如故障提示所指一样,此时,可修改为“使用 Windows身份验证”,确定并刷新后企业管理器正 维普资讯 http://www.cqvip.com 第34卷(2006)第4期 计算机与数字工程 83 常连接。还有一种解决方式,即是修改注册表,将 SQL erSver 2000的安全模式修改为“SQL Server和 Windows”的混合验证方式,因为此时无法通过企业 管理器来修改。具体做法是在HKEY LOCAL MACHINE\SOFTWARE\Microsoft\MS SQL Server 重试。” 在查询分析器中提示为: “无法连接到XXX\XXX(服务器名) 服务器:消息18456,级别16,状态1 l Microsoft儿ODBC SQL Server Driver儿SQL Senr— er\(SQLSERVER名称)\MSSQLServer下修改login— ]用户’XXX(机器名)\Administrator登录失败。” mode项值,值为I代表“仅Windows”,值为“2”代表 “SQL Server和Windows”。所以,此时将1修改为 故障分析:照前面的解释,如果SQLserver 2000 的安全模式设置与客户端连接服务器采用的登录 2,重启SQL Server后企业管理器即正常连接。 故障小结:事实上,本例错误提示中的用户’ sa’,可以是任意一个SQL Server标准用户名,也就 是说,当SQL Sevrer 2000安全模式设为“仅win— dows”,而企业管理器的连接使用的是SQL Sevrer标 准用户账号时,都会出现这样的故障。根本原因即 是说:服务器只允许了账号类型为“Windows用户” 的账号登录,客户端就不可以使用SQL Server标准 用户类型的账号进行登录。需要注意的是修改后 的改变是需要刷新或者重启才能生效的。 (2)使用查询分析器出现故障提示如下: “无法连接到服务器XXX\XXX(服务器名): 服务器:消息18452,级别16,状态J l Microsoft儿ODBC SQL Server DriverJl SQL Senr er]用户’sa’登录失败。原因:未与信任SQL Server 连接相关联。” 本类故障的故障分析完全同上例故障。 故障解决与小结:此时,可在查询分析器连接 窗口中选择使用“Windows身份验证”,查询分析器 即可正常连接上服务器;如果此时企业管理器是正 常的,也可以在企业管理器操作界面上修改SQL Server 2000的安全模式为“SQL Server和Windows” 后,查询分析器也可正常连接上服务器;当然,也可 以象上例那样修改注册表来达到修改SQL eSrver 2000的安全模式的目的。 (3)无论SQLserver 2000的安全模式设置为“仅 Windows”还是设置为“SQL Server和Windows”,客户 端使用“Windows用户”类型的账号都不能正常登 录服务器。例如,企业管理器的注册属性中将企业 管理器与服务器连接的方式设为“Windows身份验 证”,或者查询分析器使用“Windows身份验证”,故 障在企业管理器中提示为: “未能建立与XXX\XXX(服务器名)的连接 原因:用户’XXX(机器名)\Administrator’登 录失败。 请验证SQI Server是否在运行并检查SQL Sevrer注册属性(通过右击XXX\XXX节点),然后 账号一致时,就可以正常连接上服务器。即是说如 果SQLServer 2000安全模式设置为“仅Windows”, 那么客户端连接采用“Windows用户”类型的登录 账号;而如果SQI_Sevrer 2000安全模式设置为“SQL Server和Windows”,则客户端连接采用“Windows用 户”类型的登录账号或者“SQL Server标准用户”类 型的登录账号都可以。但为什么会出现这样的情 况呢?注意前面提到了一个特殊的内建账号: Builtin\Administrators。故障根本原因在于安全性 一用户账号列表中不存在该账号。对于内建的 Windows系统管理员账户组Adm/nistrators的所有成 员,SQI_Sevrer 2000在安装时就添加该组账户到 SQLServer2000用户账号列表中,只是此时不同于 一般Windows用户所采用机器名加上Windows用 户名或用户组名的方式为登录账号,而是使用 BUILTIN来代替机器名,所以Builtin\Administrators 代表属于Windows管理员组的所有操作系统级别 账号。由于该故障产生之前,操作系统级的登录, 也就是开机登录采用的是Windows系统管理员 “Administrator”账号,而Administrator又属于Admin— istrators组,所以在正常情况下,即Builtin\Admin. istrators存在于用户列表中时,SQL eSrver 2000信任 操作系统级别上的连接,从操作系统级取得该操作 系统管理员用户的ID,与master数据库中的syxlo— gins表中的记录相匹配,接受此连接。但是在此例 中,Builtin\Administrators被删除,SQL Server 2000 在master数据库的syxlogins表中无法找到匹配 (SQL Sevrer 2000的用户列表中不存在,则syxlogins 表中就没有该登录账号的记录),连接就会产生故 障。这也从另一个方面说明,即使SQL Sevrer 2000 信任Windows用户,这些Windows用户必须被添加 到SQL Sevrer 2000的用户列表中才可以使用这些 用户的登录账号成功登录上SQL Server 2000。 故障解决:此时需要手工添加此账号到SQL Serve ̄000登录用户账号列表中,才可以让客户端 采用“Windows用户”类型的账号登录上服务器。 此时,可以先修改企业管理器的注册属性为“使用 维普资讯 http://www.cqvip.com 84 SQL Server 2000安全验证的故障诊断与分析 第34卷 SQL Server身份验证”,这时,如果SQL Sevrer 2000 的安全模式为“SQL eSrver和Windows”时,就连接 正常了;如果为“仅Windows”,则需要编辑注册表, 修改HKEY—LOCAL—MACHINE\SOFTWARE\Mi— crosofi|MS SQL Server|SQLServerName| MSSQLServer下的loginmode项值为2,最后重启 sQL eSrver 2000,企业管理器连接正常。这时候, 再在企业管理器中添加Buihin\Administrators账 号,具体做法是在名称中输入“Buihin\Administra, tom”,其他与添加普通Windows类型的用户一样, 完成这一特殊登录账号的添加。 故障小结:BUILTIN\Administrators账号是一 个特殊的账号。如果操作系统的登录账号不是系 统管理员,或者不属于系统管理员组,但该账户存 于sQL Server 2000的用户列表中,则Buihin\Ad. ministrators可以不存在,sQL eSrver服务正常启动, 企业管理器和查询分析器使用Windows用户类型 的登录账号也可正常连接,这时,如果该用户在 SQL eSrver 2000中被赋予了sysadmin角色,那么在 企业管理器中可执行所有操作;如果该用户未被赋 予sysadmin角色,那么操作只限制在所被赋予权限 之内。附带提出的一点是,两种情况下,SQL eSrver 服务都不可被终止或改变状态。只有操作系统的 登录账号是系统管理员,或者属于系统管理员组 时,才可以操纵sQL Server服务,这是关于SQL eSrver服务启动的问题。有时候我们会删除掉 Builtin、Administrators账号,自己创建组并在SQL eSrver 2000中授予它”sysadmin”角色,这样可以更 好地控制谁可以访问sQL eSrver 2O0O,也断开了 sQL eSrver 2000系统管理员和操作系统管理员之 间的联系,因为他们通常有不同的任务,并且需要 不同的权限。 (4)客户端为用户编写的数据库应用程序时出 现: “未与信任sQL eSrver连接相关联。” 故障分析:这些客户端程序常采用SQL eSrver 账号来登录数据库服务器。尤其客户端程序是 ASP等服务器/浏览器架构的程序时,通常不可能 被允许登录到服务器的操作系统上,它只被允许登 录到服务器的数据库服务器上,所以SQL Server 2000安全模式应设置为“SQL eSrver和Windows”混 合验证方式,而在上面所示的错误下,SQL Server 2000安全模式为“仅Windows”。原理分析详见故 障(1)。 以上我们以企业管理器和查询分析器作为客 户端为例,分析了客户端连接sQL eSrver服务器的 原理,这里就不再赘述,这里我们就应用程序中如 何体现采用“Windows用户”还是“SQL eSrver标准 用户”的客户端连接予以说明。下面是对应的连接 语句(13OII/1是一个ADODB.Connection对象,test是 数据库名): 若SQL Server 2000安全模式采用“仅Window 验证”,则应用程序中连接语句如下: CORn.Open”Provider=SQLOLEDB.1;Integrated Security SSPI;Initial Catalog=test;Data Source= (服务器名)” 或者连接语句为: CoRn.Open”Driver={sQL eSrver};Server=(服 务器名);Database=test;Trustde-Connection=yes”。 若SQL eSrver 2000安全模式采用“SQL eSrver 和Windows”,则应用程序中连接语句除了上述两 种以外,还可以采用连接语句如下: conl1.Open”Provider=SQLOLEDB.1;User ID= abc;password=;Initial Catalog=test;Data Source= (服务器名)” 或者连接语句为: conl1.Open”Driver={sQL eSrver};Server=(服 务器名);Database=test;Uid=abc;Pwd=”以上两 个连接语句中,abc是一个SQL eSrver的标准用户, 密码为空。 4 结束语 理解SQL Server 2000安全验证是掌握sQL Server 2000安全机制的关键一步,并且也有助于理 解客户机/服务器这种当今普遍采用的程序架构。 以上问题及解决办法以及应用程序中的连接字符 串都已经笔者一一验证。 参考文献 [1]Microsoft Corporation Microsoft SQL Server 2000 Books On'He [2]Microsoft Corporation MCDBA SQLSezver21XD管理Exam 70 —22S[M] [3][美]Dusan Petkovlc吕静骅史进译.SQL Server2000基础 教程[M]清华大学出版社