项目9:CJGL数据库的安全管理对任何企业组织来说,数据的安全性最为重要。安全性主要是指允许那些具有相应的数据访问权限的用户,能够登录到SQLServer并访问数据以及对数据库对象实施各种权限范围内的操作。但是要拒绝所有的非授权用户的非法操作。因此安全性管理与用户管理是密不可分的。SQLServer2005提供了内置的安全性和数据保护。SQLServer2005的安全性管理是建立在认证(Authentication)和访问许可(permission)两者机制上的认证,是指来确定登录SQLServer的用户的登录账号和密码是否正确以此来验证其是否具有连接SQLServer的权限,但是通过认证阶段并不代表能够访问SQLServer中的数据用户,只有在获取访问数据库的权限之后才能够对服务器上的数据库进行权限许可下的各种操作,主要是针对数据库对象,如表、视图、存储过程等。这种用户访问数据库权限的设置是通过用户帐号来实现的,同时在SQLServer中角色作为用户组的代替物大大地简化了安全性管理。能力目标:能够配置服务器的身份验证模式;能够创建并配置登录账户;能够为登录账户配置数据库访问许可;能够为数据库用户指定数据访问权限;能够通过角色设置批量实现用户权限管理。知识目标:熟悉SQLServer2005的安全机制;掌握服务器登录账户的管理方法;掌握数据库用户的权限管理方法;理解角色的作用;工作任务:服务器登录账户管理;数据库用户管理。任务1:服务器登录账户管理【任务描述】:用户要访问数据库,必须具备登录SQLServer服务器的权限,可以通过两种途径登录服务器:一是通过Windows系统用户身份;二是通过有效的SQLServer账户身份。用户如果不通过默认账户登录,则必须为其创建登录账户。子任务1:创建登录账户Win_User,通过Windows身份验证,并映射到CJGL数据库;子任务2:创建登录账户Sql_User,通过SQLServer身份验证,并映射到CJGL数据库;【预备知识】1、SQLServer2005身份验证机制安全身份验证用来确认登录SQLServer的用户的登录账号和密码的正确性,由此来检验该用户是否具有连接SQLServer服务器的权限。任何用户在使用SQLServer服务器之前,必须经过身份验证。SQLServer2005提供了两种身份验证模式,分别是Windows身份验证和SQLServer身份验证。1.1Windows身份验证SQLServer服务器运行于Windows服务器之上,而Windows作为网络操作系统,本身具备管理登录、验证用户是否合法的能力,因此Windows身份验证模式就是用户通过自己合法的Windows账户和口令进行验证,只要用户具备登录操作系统的权限,即可连接SQLServer服务器1.2SQLServer身份验证启用该模式通常也称为“混合验证模式”,该认证模式下,用户连接SQLServer服务器必须提供登录名和密码,这些登录信息存储在系统表syslogins中,与Windows账号无关。注意:如果SQLServe服务器启用了混合验证模式,则不但可以通过SQLServer账号登录,也可以请求Windows验证,然后通过Windows账户登录。Windows身份验证安全性要比SQLServer验证高的多,因为SQLServer服务器相比,操作系统具有更高的安全机制。【任务实施】子任务1:创建登录账户Win_User,通过Windows身份验证,并映射到CJGL数据库;1、创建Windows系统账户,账户名为Win_User,步骤如下:(1)在“桌面”右键单击,选择“管理”,打开计算机管理窗口;(2)展开“本地用户和组”节点,右键单击“用户”,选择“新用户”命令,如下所示:(3)然后在弹出的新用户对话框中输入用户名及密码,如下所示:(4)单击“创建”按钮。2、将SQLServe身份验证方式改为“Windows验证”:(1)以系统管理员账户登录SQLServer服务器,如下所示:(2)在服务器节点上右键单击,选择“属性”,如下所示:(3)在弹出的服务器属性窗口中,选择“安全性”节点,然后在右边选中“Windows身份验证模式”,如下所示:(4)更改后,必须重启服务器才能是设置生效,如下所示:(5)单击“确定”后,在服务器节点上右键单击,选择“重新启动”,如下所示:3、将Win_User设置为SQLServer登录账户(1)展开选择服务器节点下的“安全性”节点,在“登录名”节点右键单击,选择“新建登录名”(2)在弹出的“登录名”窗口中,单击“搜索”按钮(如果要输入登录名,必须确保输入正确),如下所示:(3)在弹出的“选择用户和组”对话框中,单击“高级”按钮,如下所示:(4)然后单击“立即查找”按钮,在下面列出的对象中选择“Win_User”,如下所示:(5)单击“确定”按钮,这时候在登录名文本框中会出现“FANXINGANG\Win_User”(这里的FANXINGANG视具体机器而定)(6)用户映射(即使该登录账户具有访问数据库的权限):在“登录名”窗口中,选择“用户映射”项,然后在数据库列表中选择“CJGL”,“数据库角色成员身份”保持默认。如下所示:(7)将Win_User设置为SQLServer登录账户后,可以通过Windows系统的切换用户方式,以Win_User登录操作系统,然后再连接SQLServer服务器,过程略。(8)登录账号创建成功后,可以通过该账号进行连接SQLServer服务器,登录服务器后,只能访问CJGL数据库,而不具备访问其他数据库的权限。比如要向访问“BooK”数据库,将会出现以下错误:子任务2:创建登录账户Sql_User,通过SQLServer身份验证,并映射到CJGL数据库;1、将SQLServer服务器身份验证方式改为“SQLServer和Windows身份验证模式”,过程同上;2、重启服务器后,如上述过程打开“登录名”窗口,然后在登录名文本框中输入“SQL_User”,选中“SQLServer身份验证”单项按钮,输入密码及确认密码。如下所示:3、用户映射方式同上,不再赘述。任务2:数据库用户管理【任务描述】创建了登录账户后,实际上只具备了连接服务器的权限,即便在创建登录账户的时候进行了用户映射,默认状态下,映射后的数据库用户的数据库角色是“public”,仍旧不具备访问用户定义对象的权限,因此需要为数据库创建相应用户并赋予相应权限。子任务1:为CJGL数据库创建用户“DB_User”,该用户通过登录账户“SQL_User”登录服务器;子任务2:对用户“DB_User”进行权限设置,其权限如下表所示(“*”表示具备权限):安全对象权限SELECTINSERTUPDATEDELETEdepartment***Class***Student****Course**Teacher***Timetable*score*子任务3:创建数据库角色“User_Role”,其安全对象及权限设置为上表所示,并将数据库用户“DB_User”的数据库角色设置为“User_Role”【预备知识】1、数据库用户与架构1.1数据库用户登录名:服务器方的一个实体,使用一个登录名只能进入服务器,但是不能让用户访问服务器中的数据库资源。每个登录名的定义存放在master数据库的syslogins表中数据库用户名:一个或多个登录对象在数据库中的映射,可以对用户对象进行授权,以便为登录对象提供对数据库的访问权限。用户定义信息存放在每个数据库的sysusers表中。SQLSERVER把登录名与用户名的关系称为映射。用登录名登录SQLSERVER后,在访问各个数据库时,SQLSERVER会自动查询此数据库中是否存在与此登录名关联的用户名,若存在就使用此用户的权限访问此数据库,若不存在就是用guest用户访问此数据库。一个登录名可以被授权访问多个数据库,但一个登录名在每个数据库中只能映射一次。即一个数据库中只能有一个用户名通过该登录名登录。好比SQLSERVER就象一栋大楼,里面的每个房间都是一个数据库。登录名只是进入大楼的钥匙,而用户名则是进入房间的钥匙。一个登录名可以有多个房间的钥匙,但一个登录名在一个房间只能拥有此房间的一把钥匙。连接SQLServer服务器使用的是登录名而不是数据库用户名。SQLSERVER中有几个特殊的登录名和用户名:我们常见的dbo(用户名)是指以sa(登录名)或windowsadministration(Windows集成验证登录方式)登录的用户,也就是说数据库管理员在SQLSERVER中的用户名就叫dbo,而不叫sa,这一点看起来有点蹊跷,因为通常用户名与登录名相同(不是强制相同,但为了一目了然通常都在创建用户名时使用与登录名相同的名字),例如创建了一个登录名称为me,那么可以为该登录名me在指定的数据库中添加一个同名用户,使登录名me能够访问该数据库中的数据.当在数据库中添加了一个用户me后,之后以me登录名登录时在该数据库中创建的一切对象(表,函数,存储过程等)的所有者都为me,如me.table1,me.fn_test(),而不是dbo.table1,dbo.fn_test()。SQLServer中还有一个特殊的数据库角色public,它存在于每一个数据库中,包括系统数据库,如master、msdb、model和用户数据库,数据库的所有用户都属于public角色,并且不能从public角色中删除。在SQLSERVER数据库中,guest帐户是特殊的用户帐户。如果用户使用USEdatabase语句访问的数据库中没有与此用户关联的帐户,此用户就与guest用户相关联。1.2架构(schema)以往SQLServer内的对象命名是“服务器.数据库.用户名.对象”,但SQLServer2005版本后的对象命名改为“服务器.数据库.Schema.对象”。这让你规划数据库对象命名时更有弹性。架构是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每个元素的名称都是唯一的。数据库引擎权限层次结构之间的关系图在SQLServer2005中,架构独立于创建它们的数据库用户而存在,亦即用户与架构分离,这种机制具有以下优点:多个用户可以通过角色成员身份或Windows组成员身份拥有一个架构。这扩展了允许角色和组拥有对象的用户熟悉的功能。极大地简化了删除数据库用户的操作:删除数据库用户不需要重命名该用户架构所包含的对象。因而,在删除创建架构所含对象的用户后,不再需要修改和测试显式引用这些对象的应用程序。用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决之前版本“用户离开公司”问题,也就是在拥有该对象的用户离开公司,或离开该职务时,不必要大费周章地更改该用户所有的对象属于新的用户所有。另外,也可让DBA在安装某个套装软件时,设置该套装软件所用的数据库对象都属于某个特定的架构,容易区别。也就是说,在单一数据库内,不同部门或目的的对象,可以通过架构区分不同的对象命名原则与权限。可以用比早期版本中的粒度更大的粒度管理架构和架构包含的对象的权限。2、服务器角色和数据库角色2.1服务器角色是固化在SQLServer服务器中的角色,每个服务器角色都有其隐含的权限。使用系统存储过程sp_srvrolepermission可以浏览每个固定服务器角色的权限。该系统过程的语法形式为:sp_srvrolepermission[[@srvrolename=]'role_name']固定服务器角色权限说明Sysadmin被赋予了SQLServer中的任何权限Serveradmin向该服务器角色中添加其他登录运行dbccpintable命令(从而使表常驻于主内存中)运行系统过程sp_configure(以显示或更改系统选项)运行reconfigure选项(以更新系统过程sp_configure所做的所有改动)使用shutdown命令