第9章 安全管理

存取控制

自主存取控制

大型数据库管理系统几乎都支持自主存取控制(又称为自主安全模式),目前的 SQL 标准也对自主存取控制提供支持,这主要是通过 SQL 的 GRANT(授予) REVOKE( 收回)和 DENY(拒绝)语句来实现的。

授予和收回权限是数据库管理员(DBA)的职责。DBA 依照数据的实际应用情況将合适的权限授给相应的用户。

权限种类

在自主存取控制中,通常将数据库中的权限划分为两类。 一类是对数据库管理系统进行维护的权限,另一类是对数据库中的对象和数据进存操作的权限,这类权限又可以分为两类:一类是对数据库对象的操作权限,包括创建、删除和修改数据库对象,称为语句权限;一类是对数据库数据的操作权限,包括对表、视图数据的增、删、改、查权限,存储过程的执行权等,称为对象权限。

在数据库管理系统中,除了通过显式的授权方法让用户获得权限外,还有一种隐含的权限。隐含权限是用户自动具有的权限,比如系统管理员自动具有全部的操作权限,数据库对象拥有者自动具有所拥有对象的全部权限。隐含权限不能被更改。

用户分类

在自主存取控制中,一般将数据库中的用户按其操作权限的不同划分为以下三类:

  • 系统管理员。 系统管理员在数据库服务器上具有全部的权限,包括对服务器的配置和管理权限,也包括对全部数据库的操作权限,当用户以系统管理员身份进行操作时,系统不对其权限进行检验。 每个数据库管理系统在安装好之后都有自己默认的系统管理员,SQL Server 2008 的默认系统管理员是"sa",是 system administrator 的缩写,但并不是 Windows 用户。sa是 SQLServer 身份验证的登录名,而不是Windows身份验证的登录名。在安装好之后也可以授予其他用户具有系统管理员的权限。系统管理员在数据库服务器上具有全部的权限,包括对服务器的配置和管理权限,也包括对全部数据库的操作权限。
  • 数据库对象拥有者。 创建数据库对象的用户即为数据库对象拥有者。数据库对象拥有者对其所拥有的对象具有全部权限。
  • 普通用户。 普通用户只具有对数据库数据的操作权限。

强制存取控制

自主存取控制能够通过授权机制来有效控制对敏感数据的存取,但由于用户对数据的存取是"自主"的,因此用户可以自由地决定将数据的存取权限授予何人,决定是否将"授权"权限授予其他人。在这种授权机制下,仍可能存在数据的"无意泄露"。 比如。用户 U1 将自己权限范围内的某些数据存取权限转授给了用户 U2,U1 的意图是只允许 U2 本人操作这些数据。但 U1 这种安全性要求并不能得到保证,因为 U2 一旦获得对数据的访问权限,就可以获得自己权限内的数据的副本,然后在不征得 U1 同意的情况下传播数据副本。造成这一问题的根本原因在于, 这种机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并没有安全性标记。要解决这个问题,就需要对系统控制下的所有主客体实施强制存取控制策略。 在强制存取控制中,DBMS 将全部实体划分为主体和客休两大类。

主体是系统中的活动实体,既包括 DBMS 所管理的实际用户,也包括代表用户的各个进程。 客体是系统中的被动实体,是受主体操纵的,包括文件、基本表、索引、视图等。对于主体和客体,DBMS为它们的每个实例指派一个敏感度标记(Label)。

敏感度标记被分为若干级别,例如绝密(Top Secret)、秘密(Secret)、可信(Confidential) 和公开(Public) 等。主体的敏感度标记被称为许可证级别(Clearance Level),客体的敏感度标记被称为密级(Classification Level)。强制存取控制机制就是对比主体的 Label 和客体的 Label,最终确定主体是否能够存取客体。

当某一用户(或某一主体)以标记 Label 注册到系统时,系统要求他对任何客体的存取必遵循如下规则:

(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体。

(2)仅当主体的许可级别等于客体的密级时,该主体才能写相应的客体。

在某些系统中,第二条规则与这里的规则(2)有些差别。这些系统规定:仅当主体的许可级别小于或等于客体的密级时 ,该主体才能写相应的客体,即用户可以为写入的数据对象赋予高于自己的许可证级别的密级。 这样数据一旦被写入,该用户自己也不能再读取该数据对象了。这两种规则的共同点是它们均禁止了拥有高许可证级别的主体更新低密级的数据对象,从而防止了敏感数据的泄露。

强制存取控制(MAC, Mandatory Access Control)的两条核心铁律Bell-LaPadula(BLP)模型:

  • 铁律一:向下读(No Read Up)------ 只能读"低于或等于"自己密级的数据
    目的:防止高权限人员把机密信息泄露给低权限人员(防泄露)。
  • 铁律二:向上写(No Write Down)------ 只能写"高于或等于"自己密级的数据
    目的:防止低权限人员把垃圾/恶意信息写入高密级区域(防污染/防篡改)。
    (注意:写入后,该数据会继承客体的高密级,低权限用户自己就没权限再读回来了)。

强制存取控制是对数据本身进行密级标记,无论数据如何被复制,标记与数据是一个不可分的整体。只有符合密级标记要求的用户才能操作数据,从而提供了更高级别的安全性。

较高安全性级别提供的安全保护要保护较低级别的所有保护,因此在实现强制存取控制时,首先要实现自主存取控制,即自主存取控制与强制存取控制共同构成了 DBMS 的安全机制。系统首先对要进行的数据操作进行自主存取控制检查,通过后再对要存取的数据库对象进行强制存取控制检查,只有通过了强制存取控制检查的数据库对象方可存取。强制安全模式本质上 分层次的,它与自主安全模式相比更严格。

通用安全性分级模式,共定义了D、C、B和A四类安全级别,从D类到A类级别依次增高。D类提供最小(Minimal)保护,C类提供自主(Discretionary)保护,B类提供强制(Mandatory)保护,A类提供验证(Verified)保护。

(1) 自主保护。C类分为两个子类 C1 和 C2,C1 安全级别低于 C2。 每个子类都支持自主存取控制,即存取权限由数据对象的所有者決定。

①C1子类对所有权与存取权限加以区分,虽然它允许用户拥有自己的私有数据,但仍然支持共享数据的概念。

②c2 子类还要求通过注册、审计及资源隔离以支持责任说明( Accountability)。

(2) 强制保护。B类分为3 个子类 B1、B2 和 B3,B1 安全级别最低,B3 最高。

①BI 子类要求"标识化安全保护" ,并要求每个数据对象都必须标以一定的密级,同时还要求安全策略的非形式化说明。

②B2 子类要求安全策略的形式化(formal) 说明,能识别并消除隐蔽通道(covert channel)。隐蔽通道的例子有:从合法查询的结果中推断出不合法查询的结果;通过合法的计算推断出敏感信息。

③B3 子类要求支持审计和恢复以及指定安全管理者。

(3) 验证保护。A类要求安全机制是可靠的且足够支持对指定的安全策略给出严格的数学证明。

SQL Server的安全控制

身份验证模式

Windows身份验证模式

微软公司将 SQL Server 安全性与 Windows 操作系统的安全性进行了绑定,提供了以 windows 操作系统用户身份登录到 SQL Server 的方式。也就是 SQL Server 将用户的身份验证交给了 Windows 操作系统来完成。在这种身份验证模式下 SQL Server 将通过 Windows 操作系统来获得用户信息,并对登录名和密码进行重新验证。

当使用 Windows 身份验证模式时,用户必须首先登录到 Windows 操作系统中,然后再登录到 SQL Server 。而且用户登录到 SQL Server 时,只需选择 Windows 身份验证模式,而无须再提供登录名和密码,系统会从用户登录到 Windows 操作系统时提供的用户名和密码中查找当前用户的登录信息,以判断其是否是 SQL Server 的合法用户。

对于 SQL Server 来说,一般推荐使用 Windows 身份验证模式,因为这种安全模式能够与 Windows 操作系统的安全系统集成在一起,以提供更多的安全功能。

混合(SQL Server+Windows)身份验证模式

混合身份验证模式是指 SQL Server 允许 Windows 授权用户 和 SQL 授权用户登录到 SQL Server 数据库服务器。如果希望允许非 Windows 操作系统的用户也能登录到 SQL Server 数据库服务器上,则应该选择混合身份验证模式。 如果在混合身份验证模式下选择使用 SQL 授权用户登录 SQL Server 数据库服务器,则用户必须提供登录名和密码两部分内容,因为 SQL Server 必需要用这两部分内容来验证用户的合法身份。

SQL Server 身份验证的登录信息(用户名和密码)都保存在 SQL Server 实例上,而 Windows 身份验证的登录信息是由 Windows 和 SQL Server 实例共同保存的。

  1. 只有在"混合身份验证模式"下,sa才能登录到 SQL Server。
  2. 不管是哪种身份验证模式,Windows中的Administrator无需授权就可登录到SQL Server服务器。
  3. 安装好SQL Server之后,可以根据需要随时更改身份验证模式:。

登录账户

SQL Server 2008的安全权限是基于标识用户身份的登录标识符(Login ID,登录ID)的,登录ID就是控制访问 SQL Server 数据库服务器的用户账户。如果末指定有效的登录ID,则用户不能连接到SQL Server数据库服务器。

在 SQL Server 2008 中有两类登录账户。一类是由 SQL Server 自身负责身份验证的登录账户;另一类是登录到 SQL Server 的 Windows 网络账户,可以是组账户或用户账户。

数据库用户

用户在有了登录账户之后,他只能连接到 SQL Server 数据库服务器上,并不具有访问任何用户数据库的权限,只有成为某数据库的合法用户后才能访问该数据库。

数据库用户一般都来自服务器上已有的登录账户,让登录账户成为数据库用户的操作称"映射"。一个登录账户可以映射为多个数据库中的用户,这种映射关系为同一服务器上不同数据库的权限管理带来了很大的方便。管理数据库用户的过程实际上就是建立登录账户与数据库用户之间的映射关系的过程。默认情况下,新建立的数据库只有一个用户:dbo,它是数据库的拥有者。

Guest 用户

Guest 是 SQL Server 中一个特殊的数据库用户,在实际应用中经常作为数据库的匿名访问者使用。 当没有映射到数据库用户的登录账户试图访问数据库时,SQL Server 将尝试用 guest 用户来连接。可以通过为 guest 用户授予 CONNECT 权限来启用用户数据库中的 guest 用户。

启用 guest 用户(使 guest 用户具有连接权限)的语句如下:GRANT CONNECT TO guest;

禁用 guest 用户(收回 guest 用户的连接权限)的语句如下:REVOKE CONNECT TO guest;

注意:在每个数据库中还有一个特殊用户:dbo,该用户的全称是 database owner。dbo 是创建该数据库的登录账户映射到该数据库中的用户,其所创建的对象都是 dbo.对象名。

除guest用户外,所有的数据库用户都必须对应一个登录账户(登录名与数据库用户在服务器级:别是一对多的;在数据库级别是一对一的)

权限管理

当登录账户成为数据库中的合法用户之后,该账户除了具有一些系统视图的查询权限之外,并不对数据库中的用户数据和对象具有任何操作权限,因此,下一步就需要为数据库中的用户授予数据库数据及对象的操作权限。

对象级别的权限

数据库对象上允许的操作权限可以分为6种不同的类型

操作权限 使用说明
SELECT 允许用户查询数据。可以在表、视图和表值函数上授予用户该权限。
INSERT 允许用户插入数据。可以在表、视图和表值函数上授予用户该权限。注意,不同系统对该权限的管理不同,在 SQL Server 中,拥有 INSERT 权限的用户并不意味着一定拥有 SELECT 权限。
UPDATE 允许用户修改数据。可以在表、视图和表值函数上授予用户该权限。同 INSERT一样,在 SQL Server 中,拥有 UPDATE 权限的用户并不意味着一定拥有 SELECT 权限。
DELETE 允许用户删除数据。可以在表、视图和表值函数上授予用户该权限。同样,在 SQL Server 中拥有 DELETE 权限的用户并不意味着一定拥有 SELECT 权限。
REFERENCES 如果用户要插入数据的表中有外键约束,而用户在该外键所引用的表上没有 SELECT 权限,则拥有该权限的用户能够向这样的表中插入数据、 可以在表、视图 、标量函数、表值函数上授予用户该权限。
EXECUTE 允许用户具有执行存储过程和标量函数的权限。 可以在存储过程、标量函数上授予用户该权限。

(1) 授权语句。T-SQL 授权语句的筒化语法格式为:

sql 复制代码
GRANT <permission> [,...n ] 
ON 
	[ОВЈЕСТ ::] [schema_name].object_name [(column [,...n])] 
	TO <database_principal> [,...n] 
	[WITH GRANT OPTION] 
<permission> ::= 
ALL [PRIVILECES] | permission [(column [,...n])]

(2) 拒绝权限。拒绝用户具有某权限使用的是 DENY 语句,在 T-SQL 中其简化语法格式如下:

sql 复制代码
DENY <permission> [,...n] ON
[OBJECT ::][schema_name].object_name [(column[,...n])] 
	TO <database_principal> [,...n ] 
[CASCADE]
[AS <database_principal>]

其中,CASCADE 表示要拒绝的权限也会被对此主体授予该权限的其他主体拒绝。

(3) 收权语句。收权也就是将已授给用户的权限收回来,即不允许用户再具有该权限。收权语句使用 REVOKE,在T-SQL 中该语句的简化语法格式如下:

sql 复制代码
REVOKE [ALL [PRIVILEGES]] | <permission> [,...n] 
ON 
	[OBJECT ::][schema_name].object_name [(column[,...n])] 
	{| FROM | TO} <database_principal> [,...n] 
	[CASCADE] [AS <role_name>]

角色

在数据库中,为便于对用户及权限进行管理,可以将 一组具有相同权限的用户组织在一起,这一组具有相同权限的用户就称为角色(Role)。 角色类似干 Windows 操作系统安全体系中组的概念。 在实际工作中,有大量的用户其权限是一样的,如果让数据库管理员在每次创建完用户后都对每个用户分别授权,则是一件非常麻烦的事情。 但如果把其有相同权限的用户集中在角色中进行管理,则会方便很多。

为一个角色进行权限管理就相当于对该角色中的所有成员进行操作。可以为有相同权限的一类用户建立一个角色,然后为角色授予合适的权限。使用角色的好处是系统管理员只需对权限的种类进行划分,然后将不同的权限授予不同的角色,而不必关心有哪些具体的用户。而且当角色中的成员发生变化时,比如添加成员或删除成员,系统管理员都无须做任何关于权限的操作。

在 SQL Server 2008 中,角色分为预定义的系统角色和用户定义角色两种。同时,根据角色 作用范围的不同,系统角色又分为服务器级角色(称为固定服务器角色)和数据库级角色(称为固定数据库角色)。用户定义的角色均是数据库级角色。

固定服务器角色

固定服务器角色的作用域属于服务器范围,这些角色具有完成特定服务器级管理活动的权 限。用户不能添加、删除或更改固定服务器角色。可以将登录账户添加到固定服务器角色中,使其成为服务器角色中的成员,从而具有服务器角色的权限。固定服务器角色中的每个成员都具有向其所属角色添加其他登录账户的权限。

固定服务器角色 描述
bulkadmin 具有执行 BULK INSERT 语句的权限。需要说明的是,即使某个用户被加到了 bulkadmin 角色中,他也只具有执行 BULK INSERT 语句的权限,而没有访问需要执行该语句的表的权限,这意味着,除了要把用户加到 bulkadmin 角色中外,还需要授予用户在 执行 BULK INSERT 语句的表上具有 INSERT 权限。此外,还需要保证用户在 BULK INSERT 语句所引用的表上具有恰当的 SELECT 权限
dbcreator 具有创建、修改、删除和还原数据库的权限
diskadmin 具有管理磁盘文件( 数据被指派给哪个文件组、附加和分离数据库等)的权限
processadmin 具有管理运行在 SQL Server 中的进程的权限,这个角色可以根据需要终止长时间运行的进程
securityadmin 对于专门管理登录账户、读取错误日志以及执行 CREATE DATABASE 权限的账户来说,这个角色是非常便捷的。该角色是能够处理大多数的日常事务,但没有系统管理员的超级权限
serveradmin 该角色具有设置服务器级别的配置选项和关闭服务器的权限
setupadmin 该角色的权限仅局限于添加和删除能接服务器
sysadmin 系统管理员角色。具有在服务器及数据库上执行任何操作的权限。需要注意的是,Windows的 Administralors 组被自动映射为 sysadmin 角色中的成员,即 Administrators 组中的所有成员都对 SQL Server具有系统管理员权限

除了表列出的固定服务器角色外,还有一个系统预定义服务器角色 public。每个 SQL Server 名都是 public 服务器角色中的成员。如果未向某个服务器主体授予或拒绝对某个安全对象的特定权限,则该用户将具有授予 public 角色的权限。

固定数据库角色

固定数据库角色是定义在数据库级别上的,而且存在于每个数据库中。用户不能添加、删除或更改固定数据库角色,但可以将数据库用户添加到固定数据库角色中,使其成为数据库角色中的成员,从而具有数据库角色的权限。固定数据库角色的成员来自每个数据库中的用户。固定数据库角色为管理数据库一级的权限提供了方便。

固定数据库角色 描述
db_accessadmin 具有添加或删除数据库用户的权限
db_backupoperator 具有备份数据库、备份日志的权限
db_datareader 具有 SELECT(查询)数据库中所有用户数据的权限
db_datawriter 具有 INSERT(插入)、DELETE(更改) 和 UPDATE(删除)数据库中所有用户数据的权限
db_ddladmin 具有执行数据定义语言(DDL)的权限
db_denydatareader 不允许具有查询数据库中所有用户数据的权限,等同于对所有的表和视图授予了 DENY SELECT 权限
db_denydatawriter 不允许具有 INSERT(插入)、DELETE(更改) 和 UDPATE(删除) 数据库中所有用户数据的权限
db_owner 具有在数据库中进行全部操作的权限,包括配置、维护数据库及删除数据库
db_securityadmin 具有管理数据库角色、角色成员以及数据库中的语句和对象的权限

例:

在SQLServer2008某数据库中,有表T(A,B)和S(A,C)。现在依次执行如下SQL命令:

①create role R1; //添加用户角色R1

②create user U1; //添加用户U1

③grant INSERT on T to R1; //授权用户R1在表上T具有insert(插入)权限

④sp_addrolemember 'R1', 'U1'; //将用户U1添加到R1角色中

⑤Ssp_addrolemember 'db_datareader', 'U1'; //将用户U1添加到db_datareader角色中

⑥deny SELECT on T to R1; //不允许角色R1在表上T上具有查询的功能

db_datareader 是系统自带的角色,它本身拥有对所有用户表(T表和S表)的 SELECT 权限

结果:U1能够查询和插入S表数据,但不能够查询T表数据。

Oracle的安全管理

Oracle的安全控制机制可分为数据库级的安全控制、表级、行级和列级的安全:控制。数据库级的安全性通过用户身份认证和授予用户相应系统权限来保证,而表级、行:级、列级的安全性是通过授予或回收对象特权保证的。

Oracle数据库中的用户按其操作权限大小可分DBA用户和普通用户。

对数据库性能监控的主要内容包括:数据缓冲区的命中率、库缓冲、用户锁、锁与等待、回滚段、临时段使用情况、索引的使用情况、等待事件和共享池等。

相关推荐
ynm11110 小时前
2026.7.19(3)【栅栏密码】传统知识+古典密码
安全·网络安全·buuctf
王维同学12 小时前
进程模块枚举、映像身份与线程启动地址关联
c++·windows·安全
吴声子夜歌14 小时前
网络安全——概述(一)
安全·web安全
airobotcn16 小时前
空地一体化巡检机器人系统落地实战指南
安全·机器人·无人机·智慧园区·巡逻
愚公搬代码17 小时前
【愚公系列】《Web应用安全》003-测试环境的搭建
前端·安全
大模型搬砖师17 小时前
高校科研管理上 AI:科研处、课题组、信息中心的三方分歧怎么调和
人工智能·安全
智脑API18 小时前
CCSwitch Claude Code 国内怎么接入?Windows、VS Code 配置与安全使用教程
安全·vs code·ccswitch
MartinYeung518 小时前
[论文学习]ProAct:针对LLM越狱的主动防禦框架
网络·学习·安全
发量惊人的中年网工19 小时前
中小企业网络管理进阶:从设备堆叠到统一管理
服务器·网络·安全·网络安全·php·制造