李素奇
(射阳县中医院,江苏 射阳 224300)
我们在接触SQL Server时经常会碰到三个术语分别是登录名、用户名、账号,访问SQL Server时必须要有登录名,在master数据库中的syslogins表里存放每个登录名的信息。登录名不同于用户名,使用登录名并不能访问数据库中的资源,此时必须要创建用户名;在数据库里创建用户名并与其中一个登录名关联,用户信息存放在数据库的sysusers表中,且用户没有口令与他关联,用户访问特定对象的权限是需要授予的。总之,数据库的对象是用户,根据授予的权限来获得资源,登录名则不能获得资源,只是进门的钥匙,而账号则是特指用户管理器中创建的账户。
在大多数情况下,我们习惯登录名和用户名使用一样的名称,系统管理员一般用sa表示,数据库属主一般用dbo表示,sa始终关联着dbo用户,只有在新的登录名创建后才能创建新的用户。
在登录SQL Server时,我们需要经过三步验证,第一步需要正确的登录名和密码登录到SQL Server,但此时还不能访问数据库资源。第二步在特定数据库中创建或绑定用户,允许用户与特定数据库连接并访问资源。第三步指派用户对特定数据库的对象的访问权限,比如哪些表、视图、存储过程是用户有权使用运行的。
我们在登录Windows系统后,系统管理员的账户也有SQL Server的管理权,为保证特定的用户能够访问SQL Server数据库那应该需要怎样设置呢,这就涉及到SQL Server的验证模式,SQL Server支持两种不同的安全模式,即Windows验证模式和混合安全验证模式。
在Windows验证模式下,SQL Server数据库检测当前Windows 用户账户,并在syslogins表中查找该账户,如有则有权限登录,并且不需要输入登录名和口令进行验证,在此过程中SQL Server是从RPC连接中来获得Windows的用户信息,Windows验证优点在于,首先,SQL Server数据库管理员只需管理数据库,用户账户由Windows 去管理,其次,Windows管理用户账户的工具相比SQL Server的更强大,SQL Server如需这些功能,需要定制来进行扩展。
在混合安全验证模式下,允许Windows验证模式或者SQL Server的验证模式进行登录连接数据库,当通信时使用TCP/IP Sockets就是使用SQL Server进行验证登录;当使用命名管道就是使用Windows进行验证登录,使用混合安全模式灵活性更好,更能适应不同的应用场景。使用SQL Server验证时需输入登录名和口令,在syslogins表中进行匹配,匹配成功,正常登录,
SQL Server的验证模式类型的确定,取决于服务器与客户和网络验证模型之间使用的网络通信协议。一般情况下我们可以运用SQL server 工具企业管理器来进行设置、修改验证模式。
用户管理是一件复杂的事情,如何保证用户在不超出设置的权限范围内,访问到他们所需要的数据,是每个数据库管理员需要慎重分配的。我们知道用户可以进行分组,也就是需要访问相同数据且具有相同权限的用户放入一个组里进行统一管理。此时可以把组当成角色来理解,在SQL server里有数据库角色和服务器角色两种,其中数据库级的对象是数据库角色,包含数据库名,而服务器级的对象是服务器角色,包含登录名(见图1)。
图1 登录过程图
SQL Server 安装完成后,系统自动会创建以下一些固定的数据库角色如:
Db_owner(数据库的属主,能执行特定数据库的所有的任务。)
Db_accessadmin(能在数据库中添加、删除数据库角色、用户)
Db_securityadmin(能在数据库中分配对象和语句权限)
Db_ddladmin(能在数据库中添加、删除和修改对象)
Db_backupoperator(能恢复或备份数据库)
Db_datareader(能查看任意表中的数据)
Db_datawriter(能在表中添加、修改、删除数据)
Db_denydatareader(拒绝读取表中的数据)
Db_denydatawriter(拒绝修改表中的数据)
以上这些数据角色可在数据库sysusers表里查看。SQL Server数据库中的用户都是公共角色成员,管理员可以定义数据库用户的角色,比如有一个医疗的角色和一个护理的角色,在医疗部中有几位科室主管,这些科室主管用户不能在护理部和科护士长的角色中,此时就需要我们继续创建角色,把科室主管加到角色中并为分配一定的权限来进行工作。
SQL Server 安装完成后,系统也自动会创建以下一些固定的服务器角色如:
Sysadmin(系统管理员组,可执行任何任务)
Securityadmin(审核、管理服务器登录名)
Serveradmin(设置服务器及配置信息)
Setupadmin(可复制、安装)
Processadmin(管理进程)
Diskadmin(管理磁盘文件)
Dbcreator(修改、建立数据库)
以上这些服务器角色可在数据库master 的syslogins表里查看。
数据库的安全性离不开数据库角色的控制,用户通过数据库角色中的用户名确定对数据库操作的权限。数据库角色分为标准角色和应用程序角色。
一般来说每个数据库的系统表里都保存角色和用户信息,sysusers系统表中有uid,name,gid等字段在数据库中用户的标识是uid,组用gid来表示,在sysuser表中uid与gid相等的行就是定义的角色。其中gid与uid都等于0是public的角色,所以一般可以通过对uid来判断sysuser表中的记录是角色还是用户。
数据库里的对象和全部的数据库都是SQL server 的对象,在一个数据库中表、存储过程、规则、视图、缺省和自定义的数据类型都是其对象。它们各自都有其对应的属主,简而论之创建该对象的用户就是其属主。比如系统管理员(sa)创建数据库后,并在其登录后sa在该数据库中则是数据库属主(dbo),再比如sa用户创建表,则sa将对该表拥有权限。
对象名是该对象属主的一部分,数据库中所有的对象都归该数据库的属主所拥有,比如当查询appdata数据库中mancode表中的内容,一般通过select命令查询:select *from mancode。但如果用户fck在appdata数据库中创建了表doctor,你则需要限定该对象的名字:fck.mancode。在数据库appdata中任何有权限的用户都可创建同一名称的表。所以在数据库appdata中就有fck.mancode,lyy.mancode,cd.mancode,chy.mancode等。数据库中的用户访问其中某一对象时,如该对象属主的用户名没有限制,那将先访问拥有该对象的用户,其次数据库属主所拥有的对象。
权限对用户账户来说是其中重要的属性之一,可以完成特定范围内的一些操作。SQL server一般拥有的权限,有两种不同的类型。控制用户与对象进行操作交互就是对象的权限,特别是在插入、修改、删除、查询某一表中行的数据,又或者某一存储过程能否执行。恢复和备份数据库、删除和创建对象通过语句权限来实现。
权限用来完成特定的操作,是用户账户的属性,权限一般有三种类型,分别是对象权限、语句权限、暗示性权限。对象权限是控制用户与对象进行交互、操作,主要进行查询、插入、修改、删除数据库中某个表的数据或运行一个存储过程,一般有五个权限,分别是查询(select)、修改(update)、删除(delete)、插入(insert)、执行(exec),在数据库属性内设置。语句权限适用于备份、恢复数据库删除、创建对象,在添加用户后设置。暗示性权限是数据库角色、服务器角色等拥有的权限,由系统设置完成。
数据库中的用户根据数据库的角色被设定了一些缺省权限,这样的用户分为四类。分别是数据库管理员(配置服务器,创建、删除数据库,master数据库被系统管理员一直拥有),数据库属主(管理数据库,创建、管理数据库中的对象),对象属主(对象属主dbo在对象上授予、回收权限等操作),除以上三类的都归为第四类。实际上我们发现权限是重叠的,正常情况下系统管理员会被设定为数据库的属主,这时系统管理员既可以管理服务器也可以删除、创建、管理数据库,同时数据库中的所有对象数据库属主都可以拥有,这样看来系统管理员就同时担任了前三类角色,而其余的用户则可以是第四类角色。
所有权链是SQL Server中难以理解和比较复杂的,当我们创建存储过程或者试图时,同时也创建了所有权链,实际上存储过程或者视图创建时的对象的拥有者的名单就是一个所有权链。当用户在视图中通过select提取数据时,SQL server既检查在该视图用户的权限,也要检查所有权链。所有权链有两种类型,当视图的属主拥有视图中全部引用的对象时,(unbroken ownership chain)是该视图的所有权链。当多个以上的用户拥有一个视图的对象时,所有权链将断链(broken ownership chain)。比如,用户yb在allpat表上创建视图时,所有权链将断链。所有权链断链不是恒定的错误,在任意数据库中由任意多个用户创建的视图都有可能出现所有权链断链,理解在所有权链内部权限所起到的作用是很重要的。
根据上文我们已知道对象和语句上权限是如何运行工作的,但是如何实现的呢?将所有权链、权限、所有权组合起来是一个让人难以理解且复杂的事情,系统管理员是如何对它们进行跟踪和管理?在单属主模式(single owner model)和多属主模式(multiple owner model)这两种模式下可以跟踪和创建安全性。单属主模式(single owner model)中,数据库里的所有对象被dbo所拥有,dbo具有授权和收回的权限。多属主模式(multiple owner model)中,用户可以直接管理、创建表及数据。当然它们也有各自的优、缺点,单属主模式(single owner model)缺点是所有在对象上权限的变化及处理需要dbo实时跟踪,优点是在这两种模式下相对简单,数据库中dbo拥有控制权。多属主模式(multiple owner model)缺点是所有权链断链需要一定能力水平才能解决,优点在于dbo的工作量被大大减少了。在一些特殊情况下,单属主模式(single owner model)和多属主模式(multiple owner model)这两种模式联合。在设计数据库时我们会碰到用户不光拥有自己的表,且这些表还有为应用程序做的个性化设置或者其他表里数据的子集,通过客户端的应用程序来控制数据的输出与输入并且表的创建也被管理起来了。这样简化了用户的管理。
以下示例可直观地了解以上的内容。
在数据库appdata中创建一个角色ruser,拥有表allpat的所有权限、表inpat的查询(select)权限,再创建luser登录名,并为它创建uuser账户,同时归类到ruser角色中,用户账户uuser不能有对mzdj表的查询权限(select)。
Exec sp_addrole ‘ruser’ --ruser角色创建
Grant all on allpat to ruser ---ruser角色拥有allpat表的所有权限
Grant select on inpat to ruser ---ruser角色拥有inpat表的查询权限
Exec sp_addlogin ‘luser’,’pwd’,‘appdata’ --增加登录用户名luser
Exec sp_grantdbaccess ‘luser’,‘uuser’ --添加账户uuser
Exec sp_addrolemember ‘ruser’,‘uuser’ --增加uuser为ruser的成员
综上所述我们知道服务器角色是可以分配账户,数据库角色管理账户,根据目的不同分配不同的权限来规范用户操作,定义和生成权限是系统管理员平时的重要任务。
总之,提高数据库的安全性,保护数据库,防止因非法操作而造成的数据泄露、损坏、更改。