许多Windows 2000和Windows NT的系统管理员都兼职着其他的工作...
学习保护企业数据库的基础知识
许多Windows 2000和Windows NT的系统管理员都兼职着其他的工作,其中兼职最多的应该是微软的SQL Server数据库管理员(DBA)。微软在SQL Server 7.0整合了太多的自动管理功能━━正是这一点,使许多企业都认为它们已经不再需要一个专职的DBA,而只需让一名Windows 2000或Windows NT的系统管理员来处理通常由DBA负责管理的事务即可。另一方面,企业又将许多机密的信息存储到了SQL Server数据库中。如果你是一名DBA新手,则需要了解SQL Server的安全模式和如何配置其安全设置,以保证“合法”用户的访问并阻止“非法”访问。
与以前的老版本相比,SQL Server 7.0的安全模式有了很大改进,并且与Windows 2000和Windows NT的安全模式的集成非常紧密。如果你安装的是SQL Server 6.5而且没有专职的DBA,我建议你还是升级到SQL Server 7.0,因为它的管理相对要简单得多。尽管在写这篇稿子时我是在Windows NT 4.0上运行的SQL Server 7.0,但在Windows 2000上这些指令和安全问题也同样适用。另外,SQL Server 2000与SQL Server 7.0之间的区别并不大,因此这篇稿子中提到的一些问题也同样适用于SQL Server 2000。
安全层次和模式
SQL Server支持三级安全层次。第一个层次是,用户必须登录到SQL Server,或者已经成功登录了一个映射到SQL Server的NT帐号。在SQL Server登录成功并不意味着用户已经可以访问SQL Server上的数据库。第二层次的安全权限允许用户与一个特定的数据库相连接,第三个层次的安全权限允许用户拥有对指定数据库中一个对象的访问权限。例如,可以指定用户有权使用哪些表和视图、运行哪些存储过程。这种三层次的安全结构与Windows 2000、Windows NT安全结构相似,你所掌握的Windows安全知识也适用将会对掌握SQL Server有很大帮助。
SQL Server有两种验证模式:NT安全模式和混合模式。如果你选择的是NT安全模式并把NT用户登录映射到了SQL Server登录上,那么合法的NT用户也就连到了SQL Server上,不是NT合法用户的用户则不能连接到SQL Server上。在混合模式中,NT用户访问NT和SQL Server的方式与NT安全模式下相同,而一个非法的NT用户则可以通过合法的用户名和口令访问SQL Server(当然,合法的NT用户也可以通过其他合法的用户名和口令而不通过NT登录访问SQL Server)。除非必须使用混合模式,我们建议使用NT安全模式。
如果要查验或改变SQL Server系统的安全设置,需要打开Microsoft Management Console(MMC)中的SQL Server Enterprise Manager插件,右击服务器的名字,选择“Properties”,再选择“Security”标签,整个过程如图1所示。
如果要改变SQL Server系统的安全设置,需要中止SQL Server的运行并重新启动它(无需重新启动系统。)。在SQL Server的程序文件夹中,选择“Service Manager”,使用它中止SQL Server服务并重新启动SQL Server服务和SQL Server Agent服务(在中止服务器的运行时同时也中止了代理服务的运行)。
SQL Server的登录和服务器角色
在SQL Server 7.0中,可以把一个NT组映射到一个SQL Server登录上。无需为每个用户添加一个登录脚本,一个允许与SQL Server连接的NT组中的用户无需输入用户名和口令就可以与一个SQL Server连接。SQL Server根据每个用户各自的NT SID而非它们的组NT SID对用户进行跟踪,因此即使是通过组连接到SQL Server的,在SQL Server也可以判断出每个用户的变化。在一个NT组中增加用户时,该用户即可自动地拥有对SQL Server的访问权,从这个NT组中删除用户时,该用户也就失去了对SQL Server的访问权限。需要牢记的一点是,当在一个NT组中增加用户时,这些用户可以同时获得了对SQL Server的访问权限。
考虑到NT组和SQL Server之间的联系,在设置SQL Server安全性时首先需要规划NT组和用户策略。如果指定了NTFS访问权限,就可以建立一个全局组并将所有用户都放入这个组中,然后可以打开SQL Server Enterprise Manager,为这个组增加一个SQL Server登录。如果是作为一个NT系统管理员登录的,就会拥有SQL Servers的缺省安全设置,可以以DBA的身份登录SQL Server。
在Enterprise Manager窗口的左部,依次扩展Microsoft SQL Servers、SQL Server Group、你要登录的服务器和“Security”。稍后我们将说明如何用“Logins”条目把NT中的组和用户与SQL Server连接,非Windows用户如何设置用户名和口令。
在Logins之下是“Server Roles”条目,在开始添加登录前点击“Server Roles”,熟悉一下各种不同的角色,如图2所示。
这些角色与NT的特别操作者本地组(例如服务器操作者和备份操作者)有点类似,它们已经被指派了不同的权限。我们不能增加新的服务器角色,也不能对由SQL Server提供的这些服务器角色修改。我们可以把服务器角色看作是本地组。
双击一个角色打开一个标签对话框,可以在一个角色上增加新的登录,观察这个角色的成员和权限。“System Administrators”角色与超级用户等价,可以在SQL Server中进行任何操作,为了满足那些真正需要这些权限的用户的需求,应该保留这个角色。你还应该为开发人员指派“Database Creators”权限,使他们可以建立测试性的数据库。你还可以指派给初级管理人员“Security Administrators”和“Server Administrators”权限,以便在没有系统管理员的情况下他们也可以管理服务器的资源和安全性。
在熟悉了服务器角色后,又该来讨论登录问题了。唯一预定义的登录是系统管理员的登录,如果你使用的是混合模式的安全设置,首先你需要键入系统管理员口令。缺省状态下,在安装完SQL Server后的口令是空格,双击“Save”按钮,键入新的口令。如果在NT安全模式下运行SQL Server,用户不会被要求提供口令,也就无需在这里建立口令。
要为NT组或用户增加新的登录,可以右击“Logins”,选择“New Login”来打开SQL Server的登录属性━━“New Login”对话框,如图3所示。
你需要做的第一件事是在“General”标签上键入一个名字,无下拉列表的对话框提供了一个可供选择的NT组或用户名的清单(在SQL Server 2000中也有这么一项功能,但你需要输入一个用户名)。如果输入一个NT组或用户名,从下拉列表中选择包含这个组或用户的域。在选择后,域名也将出现在“Name”字段中。
你还可以利用“General”标签来允许或拒绝用户对SQL Server的访问。如果某个组中的一个用户无权访问SQL Server,你可以使这个组的其他成员拥有访问SQL Server的权限,而使这个用户不能访问SQL Server。与在NT中一样,拒绝访问权限会覆盖掉这个用户的所有权限以及作为组用户而具有的权限。
一个SQL Server登录可以使组或用户拥有与SQL Server相连接的权限,但并没有给予组或用户访问任何数据库的权限。你可以利用“General”标签为每个登录设置一个缺省的数据库,但这并不能使它拥有访问这个数据库的权限,它只是表明在组或用户有权限访问数据库时,SQL Server应该把哪个数据库与组或用户相连接。“Login Properties”属性对话框中的“Separate”标签可以指派数据库的访问权限,可以把组或用户指派给一个服务器角色。
数据库访问
SQL Server安全性的第二个层次是对数据库访问的控制。SQL Server可以在一个服务器上支持不止一个数据库,因此你可以使大多数用户拥有访问一个数据库的权限,而没有访问其他数据库的权限。除非你把这个登录作为一个数据库的用户,否则一个SQL Server登录没有访问这个数据库的权限。你可以在用户端或数据库端完成这个任务,通过“Login Properties”对话框可以使一个用户拥有对多个数据库的访问权限,此外,还可以在数据库系统上打开“New Database User”对话框,为某个数据库的所有用户添加登录。图4显示了如何利用“Login Properties”对话框的“Database Access”标签把一个用户添加到一个或多个数据库中。你可以指定一个与登录时不同的用户名,但我们不建议这样做,这样会给系统管理员带来不必要的麻烦。
在添加数据库用户登录时,你可以把这些登录放进数据库角色中,数据库角色是SQL Server 7.0中新引进的一个概念。与服务器角色一样,数据库角色与本地组有点类似,它也有一系列预定义的权限,你可以直接给用户指派权限,但在大多数情况下,只要通过简单地把用户放在正确的角色中就会给予它们所需要的权限。一个用户可以是多个角色中的成员,其权限等于多个角色权限的“和”,任何一个角色中的拒绝访问权限会覆盖这个用户所有的其他权限。与服务器角色相同的是,你不能修改预先定义的数据库角色,但可以合并现有的角色以使用户具有它们所需要的安全权限。你可以在任何时候修改角色的成员,但当把一个登录作为一个数据库用户时,无需指派它在所有角色中的登录。
公用数据库角色与NT中的“Everyone”相似。SQL Server把所有指派了数据库访问权限的登录放在公用角色中,你既不能从公用角色中移去用户,也不能删除用户。缺省情况下,公用角色对你所创建的任何数据库没有访问权限。
把需要从数据库中读取数据的用户放入db_datareader角色中,对数据库中的数据进行更新操作的用户必须被同时放入db_datareader和db_datawriter两个角色中。如果一个NT组需要对一个数据库进行访问而其中的一个用户却无须访问这个数据库,你就可以把这个组的SQL Server登录放入db_datareader和db_ datawriter角色中,而把这个用户的登录放入db_denydatareader和db_denydatawriter角色中。
使用db_datareader和db_datawriter角色会带来一些潜在的问题。一些数据库使用视图来强化安全性,视图是一种预定义的允许用户浏览的数据。例如,一个视图是一个表中的数据的子集,可以显示一些字段而隐藏另一些秘密的字段。在使用视图强化安全性时,你没有直接给予用户访问数据库的权限,而是给用户指派了访问特定的视图权限,你不能使用db_datareader和db_datawriter角色,因为这些角色会使用户拥有访问所有数据库、表的权限。
你可能希望委托一些数据库的管理权限。两个数据库角色可以交换这些角色中成员的有限的权限。db_accessadmin角色中的成员可以把一个现有的SQL Server登录添加为一个数据库用户,db_securityadmin角色中的成员可以向用户指派对表、视图等对象的权限。如果你希望一个人能完成两项任务,可以在两个角色中添加他的登录。
db_backupoperator角色的概念与NT Backup Operator类似,这个角色中的成员只能在进行备份操作时读取数据,而可能没有其他的访问权限。db_backupoperator角色可以对一个数据库进行备份但不能对它进行恢复,这个工作需要DBA或数据库所有者来完成。
如果你有一个测试或开发用数据库,或者你需要对一个数据库进行修改,开发人员的登录需要登录被放在db_ ddladmin角色中,这个角色中的成员可以创建、修改或删除数据库对象。无需过多地考虑db_owner角色,SQL Server中的每个对象都有一个所有者。一般情况下,谁创建了数据库,就是它的所有者。
SQL Server Enterprise Manager不能将每个数据库角色的权限显示出来。关于角色的详细说明,请参阅《SQL Server在线教程》(BOL),可以从SQL Server 7.0程序文件夹中或者Enterprise Manager中的“Help”选项中浏览BOL。预定义的角色功能非常多,但如果它们不能满足你的所有需求,你至少有二种方法来解决这个问题。一种是直接给用户指派权限,另一种是从Enterprise Manager中添加自己的角色,扩展数据库,右击“Roles”,选择“New Database Role”。在对话框中,输入一个新的角色名字,选择“Standard Role”,并为这个角色添加新的成员。在为这个角色指派权限前,需要退出对话框并创建这个角色,然后双击这个角色为它指派权限。当然,你也可以在以后的工作中改变角色的成员和指派给它的权限。
权限的授予
无论你是希望向用户或角色授予数据库权限,你都可以首先从用户(请记住一个SQL Server用户可能对应着一个NT组)或角色着手完成这一任务,也可以从表、视图、存储过程着手,把对某一对象的访问权限授予适当的用户或自定义的数据库角色。
通过用户指派权限。展开SQL Server Enterprise Manager,在指定的数据库下选择“Users”条目,在右边的窗口中双击指定的用户名打开“Database User Properties”对话框,点击“Permissions”按钮显示该用户拥有的对这个数据库中对象的访问权限,如图5所示。
需要注意的是这个对话框显示的仅仅是明确地授予这个用户的权限,该用户因是一个或多个角色、NT组的成员而拥有的权限则不会显示在这里,实际上,要在SQL Server中得到用户所有权限的清单是相当困难的。
可以通过SELECT对话框授予用户读一个表或视图的访问权限。如果需要对数据库中的数据进行更新,一般情况下会使用INSERT、UPDATE和DELETE命令。然而,你希望数据录入人员能够插入记录但不能对它们进行修改或删除,删除数据记录可能是拥有更大权限、更多经验的雇员的任务。要删除一个用户删除记录的权限,可以双击DELETE命令,出现一个红色的“X”符号,如图5所示。你可能有兴趣与开发人员讨论用户权限问题,但如果他们把有关的安全措施放入更新数据库记录的应用程序内部,你就无需操这份心了。然而,在数据库中实现安全措施更加安全,因为任何用户不可能通过修改应用程序的方法访问数据库中的数据。“Permissions”表显示用户Caesar可以对Customers表中的客户资料进行添加、更新等操作,但他无权删除一个客户,该表还同时显示Caesar无权对Employee Territories进行更新,但你需要记住的是他可能是拥有这一权限的组的成员。
Permissions表中的EXEC字段控制着执行存储过程的能力。存储过程是用T-SQL写成的基于SQL Server的子程序,可以使SQL Server完成与数据库相关的操作。开发人员使用它们的原因是它们效率更高并且提供了新的安全手段,如果编程人员编写了存储过程,另外的用户则必须有这个存储过程的“Execute”权限才能运行它们。
除非开发人员特别地提醒,我们可以忽视Declarative Referential Integrity(DRI)字段。有时用户在一个表中输入数据时,SQL Server必须在另一个表中查找数据。例如,如果一个用户在一个合同表中输入物品的编号时,SQL Server可能会通过另一个产品表验证输入的编号是否是一个可用的编号,这了能够完成这些验证,用户需要拥有对产品数据库的“Select”权限和合同数据库的“Insert”权限。有时,用户可能会需要通过其他的表来检验其输入的数据,但又不能直接地读取这个表,在这种情况下,用户就需要DRI权限而不是Select权限。
通过对SQL Server安全性的介绍,我们已经可以开发自己的数据库安全策略了,你下一步所需要的可能就是产生一个SQL Server脚本了。在SQL Server Enterprise Manager中,右击一个数据库,选择“All Tasks”,选择“Generate SQL Scripts”,这个选项能够产生一个脚本,对包括安全策略在内的数据库进行更新。然后就该学习如何在Query Analyzer窗口中运行脚本了,如果要运行控制安全设置的一部分脚本你就需要这样做。一个脚本文件可以代替通过鼠标在SQL Server事件管理器中进行点击和选择的操作,大大减少DBA的工作量。
查看本文来源