1. 数据库安全性概述
数据库存在的不安全因素:
-
非授权用户对数据库的恶意存取和破坏;
-
数据库中重要或敏感的数据被泄露;
-
安全环境的脆弱性。
数据库的安全性与计算机系统的安全性,包括计算机硬件、操作系统、网络系统等的安全性是紧密联系的。操作系统安全的脆弱,网络协议安全保障的不足等都会造成数据库安全性的破坏。
数据库的安全性:
-
指保护数据库,防止不合法的使用,以免数据的泄露、更改或破坏。
数据库的完整性与安全性的区别:
-
安全性:保护数据以防止非法用户故意造成的破坏,确保合法用户做其想做的事情。
-
完整性:保护数据以防止合法用户无意中造成的破坏,确保用户所做的事情是正确的。
为了保护数据库,防止故意的破坏,可以在从低到高的5个级别上设置各种安全措施:
-
物理控制:计算机系统的机房和设备应加以保护,通过加锁或专门监护等防止系统场地被非法进入,从而进行物理破坏。
-
法律保护:通过立法、规章制度防止授权用户以非法的形式将其访问数据库的权限转授给非法者。
-
操作系统支持:无论数据库系统是多么安全,操作系统的安全弱点均可能成为人侵数据库的手段,应防止未经授权的用户从S处着手访问数据库。
-
网络管理:由于大多数DBMS都允许用户通过网络进行远程访问,所以网络软件内部的安全性是很重要的。
-
DBMS实现:DBMS的安全机制的职责是检查用户的身份是否合法及使用数据库的权限是否正确。
要实现数据库安全,DBMS必须提供下列支持:
-
安全策略说明。
即安全性说明语言。如支持授权的SQL语言。
-
安全策略管理。
即安全约束目录的存储结构、存取控制方法和维护机制。
-
安全性检查。
执行“授权”及其检验,认可“他能做他想做的事情吗?”。
-
用户识别。
即标识和确认用户,确定“他就是他说的那个人吗?”。
现代 DBMS 一般采用“自主”(discretionary)和“强制”(mandatory)两种存取控制方法来解决安全性问题。
在自主存取控制方法中,每个用户对各个数据对象被授予不同的存取权力(authority)或特权(privilege),哪些用户对哪些数据对象有哪些存取权力都按存取控制方案执行,但并不完全固定。
在强制存取控制方法中,所有的数据对象被标定一个密级,所有的用户也被授予一个许可证级别。
对于任一数据对象,凡具有相应许可证级别的用户就可以存取,否则不能。
2. 数据库安全性控制
计算机系统的安全模型:
-
当用户进入计算机系统时,系统首先根据输入的用户标识(如用户名)进行身份的鉴定,只有合法的用户才准许进入系统。
-
对已进入计算机系统的用户,DBMS还要进行存取控制,只允许用户在所授予的权限之内进行合法的操作。
-
操作系统应能保证数据库中的数据必须由DBMS访问,而不允许用户越过DBMS,直接通过操作系统或其他方式访问。
-
数据最后通过加密的方式存储到数据库中,即便非法者得到了已加密的数据,也无法识别数据内容。
数据库安全技术:用户标识与鉴别、存取控制、视图、审计、数据加密。
2.1 用户标识与鉴别
最常用的鉴别方法:
即用什么来标识一个用户,又怎样去识别它。
用户的个人特征识别:
-
使用每个人所具有的个人特征,如声音、指纹、签名等来识别用户是当前最有效的方法,但是有以下两个问题必须解决。
-
专门设备:要能准确地记录、存储和存取这些个人特征。
-
识别算法:要能较准确地识别出每个人的声音、指纹或签名。这里关键问是要让“合法者被拒绝”和”非法者被接受”的误判率达到应用环境可接受的程度。百分之百正确(即误判率为零)几乎是不可能的。
-
-
另外,其实代价也不得不考虑,这不仅是经济上的代价,还包括识别算法执行的时同和空间代价。它影响整个安全子系统的代价/性能比。
用户的特有物品识别:
-
让每一用户持有一个他特有的物件,例如磁卡、钥匙等。在识别时,将其插人一个“阅读器”,它读取其面上的磁条中的信息。该方法是目前一些安全系统中较常用的一种方法、但用在数据库系统中要考虑以下两点。
-
需要专门的阅读装置。
-
要求有从阅读器抽取信息及与DBMS接口的软件
-
-
该方法的优点是比个人特征识别更简单、有效,代价/性能比更好;缺点是用户容易忘记带磁卡或钥匙等,也可能丢失甚至被别人窃取。
用户的自定义识别:
-
使用只有用户自己知道的定义内容来识别用户是最常用的一种方法一般用口令或密码,有时用只有用户自己能给出正确答案的一组问题,有时还可以两者兼用。在使用这类方法时要注意以下几点。
-
标识的有效性:口令、密码或问题答案要尽可能准确地标识每一个用户;
-
内容的简易性:口令或密码要长短适中,问答过程不要太烦琐
-
本身的安全性:为了防止口令、密码或问题答案的泄露或失窃,应经常改变
-
-
实现这种方法需要专门的软件来进行用户名或用户ID及其口令的登记、维护与检验等,但它不需要专门的硬件设备,较之以上的方法这是其优点。
-
其主要的缺点是口令、密码或问题答案容易被人窃取,因此还可以用更复杂的方法。
例如,每个用户都预先约定好一个计算过程或函数,在鉴别用户身份时,系统提供一个随机数,用户根据自己预先约定的计算过程或函数进行计算,而系统根据用户的计算结果是否正确进一步鉴定用户身份。
2.2 存储控制策略
定义用户权限,并将用户权限登记到数据字典中:
-
权限:用户对某一数据对象的操作权力。
-
某个用户应该具有何种权限是个管理问题和政策问题而不是技术问题。
-
DBMS系统必须提供适当的语言来定义用户权限,这些定义经过编译后存放在数据字典中,被称做安全规则或授权规则。
-
使用代码:
GRANT SELECT ON dept TO user1@localhost;
合法权限检查:
-
当用户发出存取数据库的操作请求后,DBMS查找数据字典,根据安全规则进行合法权限检查,若用户的操作请求超出了定义的权限,系统将拒绝执行此操作。
-
以user1用户登录数据库:
SELECT * FROM department;
自主存取控制(DAC):
-
在自主存取控制方法中,用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户还可将其拥有的存取权限转授给其他用户。
-
因此,自主存取控制非常灵活。
强制存取控制(MAC):
-
在强制存取控制方法中,每一个数据库对象被标以一定的密级,每一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有合法许可证的用户才可以存取。
-
因此,强制存取控制相对比较严格。
2.3 自主存取控制
用户使用数据库的方式称为”授权“。权限有两种,即访问数据权限和修改数据库结构的权限。
权限类型:
-
自主存取控制的权限类型分为两种,即角色权限和数据库对象权限。
-
角色权限:给角色授权,并为用户分配角色,用户的权限为其角色权限之和。角色权限由 DBA 授予。
-
数据库对象权限:不同的数据库对象,可提供给用户不同的操作。该权限由DBA或该对象的拥有者(Owner)授予用户。
-
角色的授权与取消:
-
授权命令的语法如下:
GRANT <角色类型> [,<角色类型>] T0 <用户> [IDENTIFIED BY <ロ令>] <角色类型>::= Connect|Resource|DBA
Connect
表示该用户可连接到DBMS;Resource
表示用户可访问数据库资源;DBA
表示该用户为数据库管理员;IDENTIFIED BY
用于为用户设置一个初始口令。
-
取消命令的语法如下:
REVOKE <角色管理>[,<角色管理>] FROM <用户>
数据库对象的授权与取消:
-
授权命令的语法如下:
GRANT <权限> 0N <表名> TO <用户>[,<用户>] [WITH GRANT OPTION] <权限>::= ALL PRIVILEGES|SELECT|INSERT|DELETE|UPDATE[ (<列名>[ ,<列名>])]
WITH GRANT OPTION
表示得到授权的用户,可将其获得的权限转授给其他用户;ALL PRIVILEGES
表示所有的操作权限。
-
取消命令的语法如下:
REVOKE <权限> ON <表名> EROM <用户>[,<用户>]
数据库对象除了表以外,还有其他对象,例如视图等,但由于表的授权最具典型意义,而且表的授权也最复杂,所以此处只以表的授权为例来说明数据库对象的授权语法其他对象的授权语法与之类似,只是在权限上不同。
2.4 强制存取控制
控制思路:
-
为每个数据对象(文件、记录或字段等)赋予一定的密级。
系统运行时,采用两条简单规则:
-
用户只能查看比它级别低或同级的数据;
-
用户只能修改和它同级的数据。
强制存取控制是对数据本身进行密级标记,无论数据如何复制,标记与数据都是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提供了更高级别的安全性。
强制存取控制的优点是系统能执行“信息流控制”。前面介绍的授权方法,允许凡有权查看保密数据的用户就可以把这种数据复制到非保密的文件中,造成无权用户也可以接触保密的数据。强制存取控制可以避免这种非法的信息流动。
3. 视图机制
视图机制指通过视图用户只能查看和修改他所能看到的数据。
视图+授权常用的安全性控制方法。
示例:
# 建立视图score_db。CREATE VIEW score_db ASSELECT * FROM score WHERE cname=’数据库’; # 为用户授予操作视图的权限。GRANT SELECT ON score_dbTO 王莎;
4. 安全级别与审计跟踪
4.1 安全级别
TCSEC/TDI将系统安全性分为4等7级:
-
D级。
最低安全级别。
保留D级的目的是为了将一切不符合更高标准的系统,统统归于D级。
-
C1级。
实现数据的所有权与使用权的分离,进行自主存取控制DAC,保护或限制用户权限的传播。
-
C2级。
提供受控的存取保护。
即将C1级的自主存取控制进一步细化,通过身份注册、审计和资源隔离以支持“责任”说明。
-
B1级。
标记安全保护。
即对每一客体和主体分别标以一定的密级和安全证等级,实施强制存取控制MAC以及审计等安全机制。
-
B2级。
建立安全策略的形式化模型,并能识别和消除隐通道。
-
B3级。
提供审计和系统恢复过程,且指定安全管理员(通常是DBA)。
-
A1级。
验证设计,提供B3级保护的同时给出系统的形式化设计说明和验证,以确信各安全保护真正实现。、
即安全机制是可靠的,且对安全机制能实现指定的安全策略给出数学证明。
4.2 审计跟踪
-
审计功能把用户对数据库的所有操作自动记录下来放入“审计日志”中,称为审计跟踪。
-
审计员可以利用审计日志监控数据库中的各种行为,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。
-
还可以通过对审计日志分析,对潜在的威胁提前采取措施加以防范。
-
审计通常是很费时间和空间的,所以DBMS往往都将其作为可选特征,审计功能一般主要用于安全性要求较高的部门。
5. 数据加密
数据加密是防止数据库中数据在存储和传输中失密的有效手段。
加密的基本思想是根据一定的算法将原始数据(称为明文)变换为不可直接识别的格式(称为密文),从而使得不知道解密算法的人无法获知数据的内容。
由于数据加密与解密也是比较费时的操作,而且数据加密与解密程序会占用大量系统资源,因此数据加密功能通常也作为可选特征。
6. 统计数据库的安全性
统计数据库查询的仅仅是某些记录的统计值,例如求记录数、和、平均值等,不允许用户查询单个记录的信息。
-
例如:人口调查数据库,它包含大量的记录,但其目的只是向公众提供统计、汇总信息,而不是提供单个记录的内容。
在统计数据库中,虽然不允许用户查询单个记录的信息,但是用户可以通过处理足够多的汇总信息来分析出单个记录的信息,这就给统计数据库的安全性带来严重的威胁。
7. MySQL的安全设置
7.1 用户管理
MySQL的用户包括root用户和普通用户。
-
root用户是超级管理员,拥有对整个MySQL服务器完全控制的权限。
-
普通用户只能拥有赋予给它的权限。
为了防止非授权用户对数据库进行存取,DBA可以创建登录用户、修改用户信息和删除用户。
创建登录用户:
CREATE USER 用户 [IDENTIFIED BY [PASSWORD] '密码'][,用户 [IDENTIFIED BY [PASSWORD] '密码']]…;
-
用户的格式:
用户名@
主机名;没有指定主机名,则主机名默认为“%
”,表示一组主机;localhost
表示本地主机。 -
IDENTIFIED BY
子句指定创建用户时的密码。
示例:创建用户TEMPUSER,其口令为test。
CREATE USER tempuser@localhost IDENTIFIED BY 'temp';
示例:创建的新用户的详细信息自动保存在系统数据库mysql的user表中。
USE mysql; SELECT * FROM user WHERE user='tempuser';
修改用户密码:
SET PASSWORD FOR 用户='新密码';
示例:修改用户账号tempuser的密码为123456。
SET PASSWORD FOR tempuser@localhost='123456';
修改用户名:
RENAME USER 旧用户名 TO 新用户名[,旧用户名 TO 新用户名][,…];
示例:修改普通用户tempuser的用户名为temp_U。
RENAME USER tempuser@localhost TO temp_U@localhost;
删除用户:
DROP USER 用户名[,…];
示例:删除用户temp_U。
DROP USER temp_U@localhost; USE mysql; SELECT * FROM user WHERE user='temp_U' and host='localhost';
7.2 权限管理
授予权限。
授予MySQL字段级别权限:
GRANT 权限名称(列名[,列名,…])[, 权限名称(列名[,列名,…]),…]ON TABLE 数据库名.表名或视图名TO 用户[,用户,…];
-
Column_priv权限表提供的权限名称:
示例:为用户column_user授予对emp表中列的操作权限。
CREATE USER column_user@localhost IDENTIFIED BY 'password'; GRANT SELECT(ename,sal,empno),UPDATE(sal) ON TABLE scott1.emp TO column_user@localhost; SELECT * FROM mysql.columns_priv;
授予MySQL表级别权限:
GRANT 权限名称[, 权限名称,…]ON TABLE 数据库名.表名或数据库名.视图名TO 用户[,用户,…];
示例:为用户table_user授予对emp表的操作权限。
CREATE USER table_user@localhost IDENTIFIED BY 'password'; GRANT ALTER,SELECT,INSERT(empno,ename) ON TABLE scott1.empTO table_user@localhost; SELECT * FROM mysql.tables_privWHERE host='localhost' and user='table_user';
授予MySQL存储程序级别权限:
GRANT 权限名称[, 权限名称,…]ON FUNCTION|PROCEDURE 数据库名.函数名 | 数据库名.存储过程名TO 用户[,用户,…];
示例:为用户proc_user授予存储过程的操作权限。
CREATE USER proc_user@localhost IDENTIFIED BY 'password'; GRANT EXECUTE ON PROCEDURE scott1.emp_p TO proc_user@localhost; GRANT ALTER ROUTINE,EXECUTE ON FUNCTION scott1.sum_fnTO proc_user@localhost; SELECT * FROM mysql.procs_priv;
授予MySQL数据库级别权限:
GRANT 权限名称[, 权限名称,…] ON 数据库名.*TO 用户[,用户,…];
示例:为用户database_user授予对scott1数据库的操作权限。
CREATE USER database_user@localhost IDENTIFIED BY 'password'; GRANT GRANT CREATE,SELECT,DROPON scott1.*TO database_user@localhost; SELECT * FROM mysql.db WHERE host='localhost' and db='scott1';
授予MySQL服务器管理员级别权限:
GRANT 权限名称[, 权限名称,…] ON *.* TO 用户[,用户,…];
示例:为用户server_user授予对所有数据库的操作权限。
CREATE USER server_user@localhost IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.*TO server_user@localhost; SELECT * FROM mysql.userWHERE host='localhost' and user='server_user';
权限的转移:
WITH GRANT OPTION
-
如果使用了WITH GRANT OPTION子句,则表示TO子句中的所有用户都具有把自己所拥有的权限授予给其他用户的权利。
示例:创建新用户u1和u2,为u1赋予对dept表增删改查的权限,并且u1能够将所拥有的权限再赋予给u2。
CREATE USER u1@localhost IDENTIFIED BY '123'; CREATE USER u2@localhost IDENTIFIED BY '456'; GRANT SELECT,INSERT,UPDATE,DELETE ON company.deptTO u1@localhostWITH GRANT OPTION;
撤销权限:
撤消所有权限:
REVOKE ALL PRIVILEGES,GRANT OPTIONFROM 用户[,用户,…];
示例:撤消用户column_user@localhost的所有权限。
REVOKE ALL PRIVILEGES,GRANT OPTIONFROM column_user@localhost;
撤消指定权限:
REVOKE 权限名称[(列名[,列名,…])][,权限名称[(列名[,列名,…])],…]ON *.* | 数据库名.* | 数据库名.表名或视图名FROM 用户[,用户,…];
示例:撤消用户database_user@localhost的CREAT和DROP权限。
REVOKE CREATE,DROP ON scott1.*FROM database_user@localhost; SELECT * FROM mysql.dbWHERE host='localhost' and user='database_user';
7.3 角色管理
角色是具有名称的一组相关权限的组合,即将不同的权限集合在一起就形成了角色。
角色的优势:
-
当为用户授予角色时,相当于为用户授予了多种权限。
-
避免了向用户逐一授权,从而简化了用户权限的管理。
创建角色:
CREATE ROLE 角色名;
-
角色格式:
'角色名'@'主机名'。
示例:分别在本地主机上创建应用程序角色app、运维人员角色ops、开发人员读角色dev_read、开发人员写角色dev_write。
CREATE ROLE 'app'@'localhost','ops'@'localhost','dev_read'@'localhost','dev_write'@'localhost'; SELECT * FROM mysql.userWHERE host='localhost' and user IN('app','ops','dev_read','dev_write');
授予角色权限:
示例:分别授予角色app数据读写权限、角色ops访问数据库权限、角色dev_read读取权限、角色dev_write写权限。
GRANT SELECT,INSERT,UPDATE,DELETEON SCOTT1.* TO 'app'@'localhost'; GRANT ALL PRIVILEGESON SCOTT1.* TO 'ops'@'localhost'; GRANT SELECT ON SCOTT1.* TO 'dev_read'@'localhost'; GRANT INSERT,UPDATE,DELETEON SCOTT1.* TO 'dev_write'@'localhost';
授予用户角色:
GRANT 角色[,角色, ...] TO 用户[,用户, ...]
示例:分别将角色授予新用户app01、ops01、dev01、dev02、dev03。
GRANT 'app'@'localhost' TO 'app01'@'localhost'; GRANT 'ops'@'localhost' TO 'ops01'@'localhost'; GRANT 'dev_read'@'localhost' TO 'dev01'@'localhost'; GRANT 'dev_read'@'localhost','dev_write'@'localhost'TO 'dev02'@'localhost','dev03'@'localhost';
用户在使用据夜色权限前必须先激活角色,设置语句如下:
SET GLOBAL activate_all_roles_on_login = ON
撤销用户角色:
REVOKE 角色[,角色,…] FROM 用户[,用户,…];
示例:撤消用户app01的角色app。
REVOKE 'app'@'localhost' FROM 'app01'@'localhost'; SHOW GRANTS FOR 'app01'@'localhost' USING 'app'@'localhost';
删除角色:
DROP ROLE 角色[,角色,…];
示例:删除角色app和ops。
DROP ROLE 'app'@'localhost','ops'@'localhost';