天天看点

数据库系统原理学习笔记十七(安全性与访问控制)

1.安全性与访问控制

  数据库的安全性是指保护数据库以防止不合法的使用而造成数据泄露、更改或破坏,所以安全性对于任何一个DBMS来说都是至关重要的。

  MYSQL关键字中和数据库安全性相关的是:WITH GRANT OPTION。

  分为:

    1)身份验证

    2)数据库用户权限确认

2.用户账号管理

  2.1 root用户

  1)查询数据库用户

SELECT user FROM mysql.user;
           

  2)创建新用户

  · 创建用户时,只指定了用户名,而没有指定主机名,那么主机名会默认是“%”,其表示一组主机。

  · 要使用CREATE USER语句,必须拥有MYSQL中mysql数据库的INSERT权限或全局CREATE USER权限。

  · 创建用户时会在系统自身的mysql数据库的user表中增加一条新纪录。如果创建的帐号已经存在,则语句执行会出现错误。

  · 如果两个用户具有相同的用户和不同的主机名,MYSQL会将其视为不同的用户,并允许为这两个用户分配不同的权限集合。

  · 如果创建用户时没有指定口令,MYSQL允许用户不使用口令登录系统。从安全角度考虑,不推荐使用这种做法。

  · 新创建的用户权限很少。可以登录到MYSQL,只允许进行不需要权限的操作。比如使用SHOW语句查询所有存储引擎和字符集的列表等。

## 创建新用户
CREATE USER user[IDENTIFIED BY [PASSWORD]’password’]
## user 指定创建用户账号--格式:[email protected]_name
## IDENTIFIED BY 可选项,指定用户账号对应的口令
## PASSWORD 可选项,指定散列口令
## password 指定用户账号的口令

## 示例1:给localhost创建一个lisi的用户
create user 'lisi'@'localhost';
## 示例2:给localhost创建一个zhaosi的用户,并指定密码为:123
create user 'zhaosi'@'localhost' identified by '123';
## 示例3:给localhost创建一个zhaoyun的用户,指定密码为:123,并对密码123使用PASSWORD()函数加密返回的散列值
SELECT PASSWORD('123')
create user 'zhaoyun'@'localhost' identified by '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257';
           

  3)使用DROP USER语句删除用户账号

  ·  DROP USER 语句可以用于删除一个或多个MYSQL帐户并消除其权限。

  · 要使用DROP USER语句,必须拥有MYSQL中的mysql数据库的DELETE权限或全局CREATE USER

  · 在DROP USER语句的使用中,如果没有明确地给出账户的主机名,则该主机名默认是%

  · 用户的删除不会影响他们之前所创建的表、索引或其他数据库对象,这是因为MYSQL并没有记录是谁创建了这些对象。

## 使用DROP USER语句删除用户账号
DROP USER user [,user]…
## user 用户名
## 示例:删除本地的zhaosi用户
DROP USER 'zhaosi'@'localhost';
           

  4)使用RENAME USER语句修改用户账号

  · 可以修改一个或多个已经存在的MYSQL用户账号,多个账号用逗号分开。

  · 要使用RENAME USER语句,必须拥有MYSQL中的mysql数据库的UPDATE权限或全局CREATE USER 权限。

  · 倘若系统中旧帐户不存在或者新账户已存在,则语句执行会出现错误。

## 使用RENAME USER语句修改用户账号
RENAME USER old_user TO new_user [,old_user TO new_user] 
## old_user 指定系统中已经存在的用户账号
## new_user 指定新的用户账号
## 示例:将zhaosi改成zhangfei
RENAME USER 'lisi'@'localhost' TO 'zhangfei'@'localhost';
           

  5)使用SET PASSWORD语句修改用户登录口令

## 使用SET PASSWORD语句修改用户登录口令
SET PASSWORD [FOR user]= {PASSWORD(‘new_password’)|’encrypted password’}
## user 可选项,指定欲修改口令的用户
## PASSWORD(‘new_password’) 使用函数PASSWORD()设置新口令new_password
## encrypted password 表示已被函数PASSWORD()加密的口令值
## 示例:将lisi的密码修改成123
SET PASSWORD FOR 'zhengpengchuan'@'localhost'=PASSWORD('123');
           

 2.2 账号权限管理

  1)使用GRANT语句为用户授权

##使用GRANT语句为用户授权
GRANT priv_type [(column_list)] [,priv_type [(column_list)]] … ON [object_type] priv_level TO user_specification [,user_specification] … [WITH GRANT OPTION]
## priv_type 用于指定权限的名称
## column_list 用于指定权限要授予给表中哪些具体的列
## ON 用于指定权限授予的对象和级别
## object_type 用于指定权限授予的对象类型
## priv_level 用于指定权限的级别
## TO 用于设定用户的口令,以及指定被授予权限的用户user
## user_specification ----> user[IDENTIFIED BY [PASSWORD]’password’]
## WITH 可选项,用于实现权限的转移或限制
## 示例:授予用户 zhengpengchuan在数据库test的表class_info上拥有对class_id和class_name的SELECT权限
GRANT SELECT (class_id,class_name) ON test.class_info TO 'zhengpengchuan'@'localhost'

## 示例2:授予当前系统中一个不存在的用户liming和用户huang,要求创建这两个用户,并设置对应的系统登录口令,同时授予他们在数据库test的表class_info上拥有对class_id和class_name的SELECT和UPDATE权限
CREATE USER 'liming'@'localhost' identified by '123';
CREATE USER 'huan'@'localhost' identified by '123';
GRANT SELECT,UPDATE(class_id,class_name) ON test.class_info TO 'liming'@'localhost','huan'@'localhost';

## 示例3:授予当前系统中一个不存在的用户liming和用户huang,要求创建这两个用户,并设置对应的系统登录口令,同时授予他们在数据库test的表class_info上拥有SELECT和UPDATE的权限。
GRANT SELECT,UPDATE ON test.class_info TO 'liming'@'localhost' IDENTIFIED BY '123','huan'@'localhost' IDENTIFIED BY '456';

## 示例4: 授予系统中已存在的zhengpengchuan可以在数据库test中执行所有数据库操作的权限。
GRANT ALL ON test.* TO 'zhengpengchuan'@'localhost';

## 示例5:授予系统中已存在的zhengpengchaun拥有创建用户的权限
GRANT CREATE USER ON *.* TO 'zhengpengchuan'@'localhost';

## 权限的转移
## 授予当前系统中不存在的用户zhou在数据库test的表class_info上拥有SELECT和UPDATE的权限,并允许其可以将自身的这个权限授予给其他用户。
GRANT SELECT,UPDATE ON test.class_info TO 'zhou'@'localhost' IDENTIFIED BY '123' WITH GRANT OPTION;
           

  2)使用REVOKE语句撤销用户权限

  使用REVOKE语句撤销一个用户的权限时,必须拥有mysql数据库的全局create user权限和update权限。

## 使用REVOKE语句撤销用户权限
REVOKE priv_type [(column_list)] [,priv_type [(column_list)]] … ON [object_type] priv_level FROM user [,user] …
## 示例1:回收系统中已存在用户zhou在数据库test的表class_info上的SELECT权限;
REVOKE SELECT ON test.class_info FROM 'zhou'@'localhost';
           

  3)权限的级别

  列权限:SELECT、 INSERT和UPDATE

  表权限:SELECT、INSERT、DELETE、UPDATE、CREATE、ALTER、INDEX、DROP、ALL、REFERENCES

  数据库权限:除了可以指定为授予表权限时的所有值之外,还可以是下面这些值:CREATE VIEW、SHOW VIEW……

  用户权限(最有效率):除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:CREATE USER、SHOW DATABASES

今日心语:

  翻过一座山,还有更高的山。

继续阅读