SQL Server安全机制
SQL Server安全机制概述 : SQL Server的安全机制包括:身份认证、访问控制、数据加密、备份与恢复等。
3.1数据库的身份认证与访问控制内容
在“学生选课”系统中,有两类人员:教师和学生。
- 教师可以录入课程、登记成绩;
- 学生可以选课、查看成绩;
- 假设数据库已存在的情况下,根据系统业务需求,设计数据库安全机制。
3.2使用学生选课数据库
在“学生选课”数据库中有3张表:课程表、学生表和成绩表。

右键成绩表,选择“打开表”,可以查看、增加、修改表中的数据。

- 为课程表增加1条记录 课程编号:c03,课程名称:密码学基础
- 为学生表增加1条记录 学生编号:s03,学生姓名:王五
- 为成绩表增加1条记录 成绩编号: g03, 课程编号: c03,学生编号: s03, 成绩:90
3.3 新建登录名
教师和学生要想使用数据库,首先要能登录服务器。为教师、学生分别新建登录名。 右键“安全性”-“登录名”,选择“新建登录名”。

输入登录名“教师”,使用SQL Server身份认证,取消强制密码策略,输入密码,确定。

断开服务器的连接,使用“教师”身份登录服务器。(服务器访问权限)

此时,点击“学生选课”数据库,会发现没有任何内容,这是因为“教师”不属于“学生选课”数据库的用户,没有访问数据库的权限。

使用sa重新登录服务器,新建登录名“学生”,查看其访问权限
3.4 新建数据库用户
使用sa登录服务器,在“数据库”- “学生选课”-“安全性”-‘’用户“右键选择”新建用户“

在“数据库用户 - 新建”界面中输入用户名t1,选择登录名“教师”,确定。

此时“学生选课”数据库中多了一个新用户t1。

断开服务器连接,使用“教师”登录服务器,此时可以查看数据库(数据库访问权限),但无法查看表的信息,这是因为我们没有为用户t1授权(数据对象访问权限)。

使用sa重新登录服务器,新建用户“s1”,并与登录名“学生”关联,再次使用登录名“学生”登录服务器,查看其访问权限。
3.5 设置数据对象访问权限
用户t1对课程表具有查询、增加、修改、删除的权限,使用SQL语句对其授权。 使用sa登录服务器,点击“新建查询”按钮,出现查询界面,选择“学生选课”数据库

输入SQL语句,给用户t1授权
grant select,insert,upate,delete
on 课程
to t1;
执行SQL语句

- 用户t1对学生表具有查询权限,对成绩表具有查询、增加、修改、删除的权限,请使用SQL语句为其正确授权
- 用户s1对学生表、成绩表、课程表具有查询的权限,请使用SQL语句为其正确授权
3.6 基于角色的访问控制
当用户的权限发生变化时,为每一个用户更改权限是一个非常费时、耗力的过程。因此,可以使用基于角色的访问控制为用户授权。
3.6.1 新建数据库角色
在数据库角色中,我们可以创建自定义的角色

角色名称输入teacher,所有者选择t1,角色成员添加t1

3.6.2 撤销用户t1的权限
使用SQL语句撤销用户t1的权限,
revoke nsert,upate,delete
on 课程
from t1;

执行SQL语句成功,用户t1权限被撤销,留下查看表功能。

3.6.3 给角色teacher授权
使用SQL语句为角色teacher授权
grant select,insert,update,delete
on 课程
to teacher;

3.6.4 查看授权结果
使用登录名“教师”重新登录服务器,查看自己的权限。

数据库的备份与恢复
4.1 创建备份管理员
使用sa登录服务器,新建登录名“备份管理员”

在“学生选课” 数据库中创建新用户dbBackup,设置其数据库角色为db_backupoperator,关联登录名“备份管理员”,确定

断开连接,使用“备份管理员”身份登录服务器
4.2 完整备份
右键“学生选课“,选择”任务“-"备份"

在“数据库备份”界面中,数据库选择“学生选课”,备份类型选择“完整”,备份到磁盘的某个目录下,确定

“学生选课”数据库完整备份完成

可以查看备份内容
问题:SA与备份管理员的区别在哪里?
- 登录名:服务器方的一个实体,使用一个登录名只能进入服务器,但是不能让用户访问服务器中的数据库资源。每个登录名的定义存放在master数据库的syslogins表中
- 用户名:一个或多个登录对象在数据库中的映射,可以对用户对象进行授权,以便为登录对象提供对数据库的访问权限。用户定义信息存放在每个数据库的sysusers表中
- SQLSERVER把登录名与用户名的关系称为映射。用登录名登录SQLSERVER后,在访问各个数据库时,SQLSERVER会自动查询此数据库中是否存在与此登录名关联的用户名,若存在就使用此用户的权限访问此数据库,若不存在就是用guest用户访问此数据库(guest是一个特殊的用户名,后面会讲到)
- 一个登录名可以被授权访问多个数据库,但一个登录名在每个数据库中只能映射一次。即一个登录可对应多个用户,一个用户也可以被多个登录使用。好比SQLSERVER就象一栋大楼,里面的每个房间都是一个数据库.登录名只是进入大楼的钥匙,而用户名则是进入房间的钥匙.一个登录名可以有多个房间的钥匙,但一个登录名在一个房间只能拥有此房间的一把钥匙。
- 链接或登录sql Server服务器时是用的登录名而非用户名登录的,程序里面的链接字符串中的用户名也是指登录名。
- 二者权限不同,SA管理整个数据库系统,是最高权限拥有者和管理者。
访问控制总结和理解
个人关于访问控制一直无法更加通透的理解为什么要改变访问控制方式,从个体,ACL,组,到基于角色,看起来越来越趋于抽象,难道往好的方向发展都是具有越来越抽象的特征吗?基于角色的好处又在哪里呢?具体?后来查询到有人翻译了英文资料,写得比较详细,也帮助我对课程中引发的疑问有了很好的理解。
其中Tags 和 roles 各自的适用场景
前面说 tags(用于 ACL 目的)和 roles(用于 user management 目的)都是“用户列表”(lists of users),其实这种说法有误导性。二者用于不同场景。最重要的是, 不同的人负责系统的不同部分:
- Roles 描述的是 identity system(authentication)中的人。Roles 变化很少,通常在入职、晋升或转岗时由 HR 部门设置。
- Object types(tags) 由 object owner 在这个 object 创建时设置。
- Entitlements 用
(Role, Tag)描述,由简单的程序(安全策略)来定义,由安全团队设置。