本文原作者:Michael D.Reilly
Email:Mdreilly@win2000mag.com
翻译整理:欲望之翼
发布日期:2003-10-01
数据库的安全想管理是数据库管理员(DBA)最重要的工作之一,企业内部的数据安全在企业分布式运算架构中有许多设定及管理方式。传统上你可以将安全性管理嵌入到你的应用程序当中进行处理,例如你自己在应用程序中做帐户密码的管理等。但是,如此做可能会让你的应用程序的安全性弹性较差。此外,你也可以利用中间层来管理安全性,例如利用微软事务管理器管理后端数据存取的安全,这样的做法既有弹性又无须自行撰写控制程序;而且,除了可以控制数据库中数据的新增、删除、修改等动作外,还可以控制操作系统中文件的访问,这样做可大大降低数据库权限设定的复杂性。当然,你更可以直接利用数据库的安全管理功能对数据进行保护,这是保护数据最直接的方式,无须复杂的学习过程,再加上SQL Server本身友好的图形用户接口(Gui),数据库的安全管理简直轻而易举。本文对SQL Server的安全性管理做一个简单的描述,其中的观念也适用SQL Server7.0及SQL Server2000。通过阅读本文,你便可以对SQL Server的安全性管理有一个基本的了解。
安全等级及安全验证模式
SQL Server工具备三个安全等级。在第一个安全等级,用户必须登录SQL Server,或您具备一个有效的Win2K/NT登录帐号,它与SQL Server的登录帐号相对应。但是,登录SQL Server并不代表用户具有访问SQL Server数据库的权限。你必须运用第二个安全等级才能授予用户访问某一个特定的数据库的权限。第三个等级则可以让你指定用户对数据库中对象的权限。比如说,你可以指定用户可看到哪些表格以及视图,或用户可以执行哪些存储过程,这三个安全等级与Win2k/NT系统中的安全等级类似,因此你可以将原本就具备的Windows安全观念进行扩展,并在SQL Server当中运用。
SQL Server的验证模式有两种:Windows安全验证模式及混合验证模式。如果你选用Windows安全验证模式,将Windows的用户登录帐号对应至SQL Server登录帐号,那么经Windows确认的用户也能与SQL Server连接。如果是没有确认的,则不能登录。在混合模式中,Windows用户连接Windows及SQL Server的方式与前述模式相同,但是无法通过Windows验证的用户可以改以另外提供的名称以及密码登录SQL Server。因此除非必要,否则我们建议你最好使用Windows安全验证模式。
如需确认或变更SQL Server系统的安全验证模式,请打开SQL Server的企业管理器,在数据库服务器的名称上点右键然后选择“属性”。选取“安全”项,如图1:
如果你想使修改后的安全验证模式生效,必须停止并重新启动SQL Server(不需要重起计算机)。在SQL Server程序文件夹中,选取“服务管理员”来停止或者重新启动SQL Server服务,以及重新启动SQL Server Agent代理服务。
SQL Server登录帐号及Server角色
在SQL Server7.0中,你可以将NT用户组对应至SQL Server登录帐号。你不需为每个用户新增一个登录帐号。只要所属的NT用户组具备访问SQL Server的权限,该用户不需要输入名称或密码便能够进行访问。由于SQL Server是通过各个用户的NT SID而不是用户组SID来追踪用户的,因此你可以判定是谁在SQL Server做了哪些修改,即使你使用的是用户组而不是个别的用户。当你在NT 用户组中添加新的用户,该用户便自动拥有访问SQL Server的权限。同样,任何你用用户组中删除的用户也会自动失去访问SQL Server的权限。请务必记住这点,你在NT用户组中添加新的用户的同时,也会授予这些用户访问SQL Server的权限。
鉴于NT用户组与SQL Server之间微妙的关系,规划SQL Server安全的第一个步骤便是规划NT用户组及用户策略。先设计全局用户组(Global Group),再依照指定NTFS权限的方式将用户分配到各个用户组。之后,如需为用户组新增SQL Server登录帐号,请打开SQL Server企业管理器。如果你以管理员的身份登录并且具有SQL Server预设的安全性权限,你就可以以DBA的身份登录SQL Server。
在企业管理器窗口左边的窗格中,逐层展开至如图2所示,也就是“角色”对象:
这些角色与NT的特别操作员局部用户组(如数据库服务器操作员、备份操作人员)极为相似,都是预先定义并且具备特定的权限的。你不可以新增Server角色,也不能修改SQL Server提供的角色。你可以将Server角色视为可加入Windows全局用户组的局部用户组。
在“角色”上点鼠标两次就可以将新的用户加入角色中,并可以检查角色成员和权限。“系统管理员”角色有如在SQL Server中能处理任何事情的超级用户。请将此角色保留给真正需要最高等级管理权限的人员。程序设计人员需要“数据库建立者”的角色才能建立测试数据库。你可以授予低层次管理人员“安全管理员”及“数据库服务器管理员”角色,让他们不具备完整的系统管理员身份,但仍然能管理数据库服务器的属性及安全。
在检查过SQL Server的角色后,请将你的注意力转回到“登录”项目。唯一的预设登录项目为系统管理员的登录帐号。如果你选用的是混合安全验证模式,第一个必要的步骤是输入系统管理员的密码。根据默认值,安装SQL Server以后,系统管理员的角色并没有设置密码。你必须在“登录”下的“Sa”上双击后键入新的密码。
如果你是在NT安全验证模式中操作SQL Server,画面并不会提示你或输入密码。因此你不需要执行这个步骤。
如果需要为NT用户组或用户新增登录帐号,请在“登录帐号”项目上点右键,选取“新增登录帐号”来打开 SQL Server的“登录属性”—“新增登录帐号”对话框,如图3:
数据库访问
SQL Server的第二个安全等级为控制数据库的访问权限。SQL Server可在一台数据库服务器上支持多个数据库,因此你会希望选择授予或拒绝某些用户访问数据库的权限。在设定数据库用户登录帐号以前,即使能够登录SQL Server也不能访问数据库。你可以从用户端或者是数据库端完成前述作业。在“登录属性”对话框中建立多个数据库用户的登录帐号。或是进入数据库,打开“新增数据库用户”对话框,加入所有有效的数据库用户登录帐号。图4为你详解如何使用“登录属性”对话框中的“数据库访问”卷标来新增一个或多个数据库的用户。

虽然你可以指定一个与登录名不同的用户名称,的我们依然建议你应该尽量避免这么做,因为这样的设定会造成管理员的困扰。
在新增数据库用户的帐号后,你可以指定各用户的数据库角色,此为SQL Server7.0所提供的新概念。象Server角色一样,数据库角色与登录SQL Server的局部用户组,以及Windows的驱谴农具用户组极为相似。数据库角色与Server角色两者皆有预设的权限。你可以直接授予用户权限,但在大多数的情况下,只要能授予用户正确的角色,他们就能具备需要的权限。一位用户可以扮演多重角色,并具备个角色拥有的所有权限。只要当中有任何一个角色的访问权限被收回,用户即失去所有其他的权限。和Server角色一样,预设的数据库角色无法被修改,也无法删除。当然,你可以根据需求,新增具备不同访问权限的数据库角色,但你或者可结合既有的角色,给予用语确实需要的访问等级。角色的成员可以随时修改,且在你将登录者加入数据库用户时,并不需要指定该用户应具备的角色。
至于数据库当中的“公共”(Public)这个角色,则与NT中的“Everyone”类似。SQL Server会将拥有数据库访问权限的登录者视为数据库“公共”角色。“公共”角色中的用户无法被修改,也无法被删除。根据默认值,“公共”角色不具备任何数据库的访问权限。千万不要被图4中的Northwind数据库范例误导,因为Northwind仅仅是个测试数据库,每个人都可以不受限制的看到其中的数据。
你可以将需要从数据库选取数据的用户加入db_datareader及db_datawriter角色,如果某NT用户组需要具备数据库的访问权,但当中有位用户A不应具备同样的权限,你可以将该用户组的SQL Server登录帐号全部加入到db_datareader及db_datawriter角色中,然后将A用户登录帐号加入到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或者数据库拥有者(DBO)的工作。
如果你有一个测试或研发数据库,或程序设计人员会持续变更“产品”数据库,你便需要授予程序设计人员db_ddladmin的角色。属于此角色的成员能建立、修改、删除数据库对象。你不需担心db_owner角色的问题。SQL Server中的每个数据库对象皆属于各自的拥有者;且根据默认值,建立数据库的人员是该数据库的拥有者。
SQL Server企业管理器并不会显示各数据库角色拥有的访问权限。如需取得关于各角色的说明,请参阅SQL Server在线书籍(BOL)。你可利用企业管理器里的帮助选项得到BOL。你会发现,预先设定的角色皆相当有弹性,但如果仍然不能满足你的需求,你还有其他的一些选择。其中的一个方式是直接授予用户权限。另一个方法是根据你的需求添加新的数据库角色,授予新角色必要的权限,然后再将用户加入这些角色中。我们可以在企业管理器的角色选项上点右键来新增角色。
授予和收回用户和角色的权限
如果你希望授予新增加的用户或角色访问数据库的权限,你可以从用户或角色开始执行授权的工作。或者,你可以从表格、视图或者存储过程开始进行,然后授予合适的用户或用户定义的数据库角色访问该对象的权限。
如果要直接授予用户访问权限,打开SQL Server的企业管理器,选取目标数据库下的“用户”项目,比如这里目标数据库是master,用户是chenlin,如图5所示:
然后在用户chelin上双击鼠标打开数据库属性对话框,按下“权限”按钮来显示用户访问数据库对象的权限,如图6所示:
上图我们把xp_cmdshell这个对象改名为xpcmdsell并且赋予了chelin用户,这个也不失为一个留后门的好方法哦~~。图中的EXEC字段控制的是用户能否执行扩展存储过程。存储过程是以T-SQL(事务-结构化查询语言)编写的,并存储在SQL Server的子程序,应用程序可以调用该子程序来执行数据库相关的作业。比如xp_cmdshell这个扩展存储就可以用来执行cmd命令,添加系统帐户等工作。
产生SQL脚本
上文简要的介绍了SQL Server安全性,应该可以辅助你迈出规划数据库安全策略的第一步,那么下一步就应该是产生SQL Server脚本了,还是打开企业管理器,在数据库名称(比如是master)上点右键,选取“所有任务”—-“Generate SQL Scripts”,此选项可以用来重新产生数据库的脚本语言,其中也包括安全原则。然后,尝试看看如何在查询分析器窗口执行脚本语言。你也可以选择只执行控制安全设定的脚本语言。一般你需要花费数个小时在企业管理器中逐一点击和选择才能完成的工作,脚本语言在几秒之内便可以完成。
因为本文主要是针对初学者,因此对实际应用方面的提及较少,你可以通过本文建立数据库安全管理的基本概念之后,然后再去参考SQL Server进一步的安全管理书籍,对于实际的应用将有很大的帮助。http://netadmin.77169.com/HTML/20031007023500.html