保护SQL服务器的安全 用户识别问题
在我们关于SQL服务器安全系列的这文章里,我们的目标是向你提供安全安装SQL服务器所需要的工具和信心,这样的话,你有价值的数据就会受到保护,避免无意或者有意的破坏或者窃取。在本文里,我们会深入一些基础的概念,在保护数据库安全的时候,你需要利用下面这些概念:登录、用户、角色,以及组。确定谁在请求访问数据或者SQL服务器里其他信息等看上去很简单的过程,都需要用到所有这些概念。
登录
登录规定了哪些用户能够连接到安装好的SQL服务器上——这不是某个特定的数据库,而是而是整个服务器。登录有两种不同的形式:
Windows集成的登录,它会授权特定的Windows用户或者组使用它们的Windows信任书进行连接。
SQL服务器登录,它会授权用户使用由SQL服务器保存的用户名和密码进行连接。
你应该使用哪一种?
Windows集成登录肯定要比SQL服务器登录更加高效和更方便,因为用户只需要登录一次——在网络这一层。单独登录到服务器是没有必要的,因为SQL服务器会自动地处理(在后台)Windows登录,从而允许到服务器的访问。只有在服务器运行在Windows NT或者2000上的时候,对Windows登录的支持才有效;安装在Windows 98上的服务器必须要依赖SQL服务器登录。如果你正在运行Windows 2000,而且最终需要支持原有的应用程序,那么就要记住,SQL服务器登录只有在混合模式下才可用。
设计上的考虑
在设计自己数据库的时候,你需要考虑登录的方法——而且要在你真正开始保证最终产品的安全之前。你应该知道服务器使用的是哪种授权方式。那些还在Window 98上使用服务器的人可能现在就要考虑升级,如果安全是一个很重要的问题的话;那样的话,他们就可以使用Windows集成的安全(策略)。
另外一个设计问题是知道谁拥有访问权,他们能够访问什么数据,以及他们是否能够对对象和数据进行更改。你不用真的列出其名字;你只需要利用工具有效地帮助用户就行了。最后,你应该使用系统的存储过程来管理安全。SQL服务器提供了两种存储过程,用于登录的管理:
◆sp_addlogi——在使用SQL服务器验证保护你服务器安全的时候要使用这个存储过程。具体的说,这个存储过程会创建一个新的SQL服务器登录,它允许用户使用SQL服务器验证连接到SQL服务器的实例上。
◆sp_grantlogin——这个存储过程允许Windows 2000的用户或者组帐号使用Windows验证连接到微软的SQL服务器上。
只有sysadmin或者securityadmin固有服务器角色的成员能够执行这两个存储过程。
什么是系统存储过程?
系统存储过程是一个内置的存储过程,它能够帮助你管理服务器。你可以在MSDN库里找到一长串的系统存储过程。SQL服务器文献在线囊括了每个系统存储过程的所有句法细节和使用示例。
用户
登录属于服务器,而用户则属于数据库。用户ID会识别特定数据库的特定用户。而且,用户对于数据库来说是专门的——也就是说,Northwind数据库里Fred这个用户同公共数据库里Fred那个用户是不同的,尽管这两个Fred可能和同一个登录相关联。
当你在数据库里创建一个用户的时候,你就将一个特定的登录同这个用户关联起来了。对于这个数据库而言,登录具有这个用户的权限。尽管登录所用的ID不需要和用户ID相同,但是在通常情况下,如果你保持这样的惯例,那么事情就会更少让人糊涂。如果登录在数据库里没有相关联的用户,那么用户能够通过特殊的来宾用户帐号连接到该数据库。
特殊用户
所有的用户都不是数据库里的常住人口,而且不能保证用户帐号就是他们自己的。在希望用户临时访问数据库的时候,你可以使用来宾用户帐号,它可以不使用常规的用户帐号而登录访问服务器。来宾用户的登录必须拥有访问数据库的权限,而且数据库必须设有来宾用户帐号。一旦进了数据库,来宾用户会被限制到只能进行来宾用户帐号所指定的活动。但是,来宾用户帐号在一个刚刚创建的数据库里不是缺省就存在的;(数据库的)所有者或者系统管理员必须创建这样一个帐号。
除了来宾用户,你还需要考虑数据库的所有者(DBO)。他是创建数据库的用户。数据库的所有者或者系统管理员必须赋予(其他人)权限,才能让他们在数据库创建其它的对象。
为了向数据库里添加数据,你要运行sp_grantdbaccess。这个存储过程会在数据库里创建一个和指定登录相对应的用户。只有sysadmin固有服务器角色、db_accessadmin角色,以及db_owner固有服务器角色的成员才能够执行sp_grantdbaccess。
角色
角色让你将用户集中到一起,以利于更简单的管理。就像用户一样,角色也是数据库的对象。例如,你可以在自己的采购数据库里定义一个“销售”角色,并让所有的产品所有销售人员都成为这个角色的成员。如果你随后赋予这个“销售”角色许可,那么这些许可会自动地应用于该角色的所有成员上。此外,一个用户可以是多个角色的成员。
有三种类型的角色:
◆公共——这个角色会为所有的用户设置缺省的基本许可,所有的用户都会被分配公共角色。
◆服务器——服务器角色适用于整个服务器。
◆数据库——这些角色适用于专门的数据库。
服务器和数据库角色都有预先定义的类别,我们把它们列在表格A里。
表格 A