数据库安全性控制

非法使用数据库的情况
 用户编写一段合法程序绕过DBMS及其授权机制,通过操作系统直接
存取,修改或备份数据库中的数据
 直接或编写应用程序执行非授权操作
 通过多次合法查询数据库从中推导出一些保密数据

  1. 自主存取控制(Discretionary Access Control ,简称DAC)
    C2级(受控访问保护 Controlled Access Protection )
    用户对不同的数据对象有不同的存取权限
    不同的用户对同一对象也有不同的权限
    用户还可将其拥有的存取权限转授给其他用户
  2. 强制存取控制(Mandatory Access Control,简称 MAC)
    B1级(标记安全保护 Labeled Security Protection)
    每一个数据对象被标以一定的密级(敏感度标记)
    每一个用户也被授予某一个级别的许可证
    对于任意一个对象,只有具有合法许可证的用户才可以存取

通过 SQL 的GRANT 语句和REVOKE 语句实现

  • 用户权限组成
  • 数据对象
  • 操作类型
  • 定义用户存取权限:定义用户可以在哪些数据库对象上进行哪
    些类型的操作
    定义存取权限称为授权

授权与回收

  1. GRANT
GRANT <权限>[,<权限>]...
ON [对象类型] <对象名>  -- 

> * | *.* | db_name.* | db_name.tbl_name | tbl_name

TO <用户或角色>[,<用户或角色>]...
**[WITH GRANT OPTION];**

语义:将对指定操作对象的指定操作权限授予指定的用户
例:GRANT SELECT, INSERT, UPDATE ON . TO u1;

创建数据库用户:
CREATE USER ‘username’@‘host’ IDENTIFIED BY ‘password’;
例:
CREATE USER ‘U1’@‘localhost’ IDENTIFIED BY ‘123456’;
CREATE USER ‘U2’ @‘192.168.0.1’ IDENTIFIED BY ‘123456’;
CREATE USER ‘U3’@’%.’ IDENTIFIED BY '123456’;
从域中的任意主机登陆
%通配符

host:指定该用户在哪个主机上可以登录
username:将创建的用户名
password:该用户的登录密码,可以为空

WITH GRANT OPTION子句:
指定:可以再授予
没有指定:不能传播
不允许循环授权
被授权者不能把权限再授回给授权者或其祖先

[例1] 把查询Student表权限授给用户U1
GRANT SELECT ON Student TO U1;
[例2] 把对Student表的全部权限授予用户U2和U3
GRANT ALL ON Student TO U2,U3;
[例3] 把对表SC的查询权限授予所有用户
GRANT SELECT ON SC TO PUBLIC;
[例4] 把查询Student表和修改学生学号的权限授给用户U4
GRANT UPDATE(Sno), SELECT ON Student TO U4;
对属性列的授权时必须明确指出相应属性列名

  1. REVOKE
    授予的权限可以由数据库管理员或其他授权者用REVOKE语句
    收回
    REVOKE语句的一般格式为:
REVOKE <权限>[,<权限>]...
ON [对象类型] <对象名>
FROM <用户或角色>[,<用户或角色>];

数据库角色

通常,MySQL数据库拥有多个相同权限集合的用户。向多个用户授予和撤销权限需要单独更改每个用户的权限,非常耗时。
MySQL提供了一个名为role的新对象,它是被命名的一组与数据库操作相关的权限。
如果要向多个用户授予相同的权限集,应:

  1. 创建新的角色。
  2. 授予角色权限。
  3. 授予用户角色。

数据库角色语法:

CREATE ROLE 'app_developer','app_read','app_write';

GRANT ALL ON app_db.* TO 'app_developer’;
GRANT SELECT ON app_db.* TO 'app_read’;
GRANT INSERT, UPDATE, DELETE ON app_db.* TO 'app_write';

CREATE USER 'dev1'@'localhost' IDENTIFIED BY 'dev1pass’;
CREATE USER 'read_user1'@'localhost' IDENTIFIED BY 'read_user1pass’;
CREATE USER 'read_user2'@'localhost' IDENTIFIED BY 'read_user2pass’;
CREATE USER 'rw_user1'@'localhost' IDENTIFIED BY 'rw_user1pass';

GRANT 'app_developer' TO 'dev1'@'localhost’;
GRANT 'app_read' TO 'read_user1'@'localhost', 'read_user2'@'localhost’;
GRANT 'app_read','app_write' TO 'rw_user1'@'localhost';