MySQL——安全性机制之权限管理

    权限管理主要是对登录到MySQL的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中,不合理的权限规划会给MySQL服务器带来安全隐患。 
    MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT、INSERT、UPDATE和DELETE权限。

1.  MySQL  的各种权限

    账户权限信息被存储在  MySQL  数据库的  user、db、host、tables_priv、column_priv   和  procs_priv  表中。MySQL  启动时,服务器将这些数据库表中的权限信息的内容读入内存。
 
    GRANT  和  REVOKE  语句所涉及的权限的名称如下:


MySQL——安全性机制之权限管理_第1张图片


MySQL——安全性机制之权限管理_第2张图片


     (1)CREATE  和  DROP权限,可以创建新数据库和表,或删除已有数据库和表。 
     (2)SELECT、INSERT、UPDATE  和  DELETE  权限,允许在数据库表上进行操作 
  (3)INDEX  权限允许创建或删除索引 ,适用于已有的表。·
  (4)ALTER,使用  ALTER  TABBLE  允许更改表的结构和重命名表 
  (5)CREATE ROUTINE,创建保存的函数和程序   ALTER  ROUTINE  权限用来更改和删除保存的程序,EXECUTE  权限用来执行保存的程序。
  (6)GRANT,允许授权给其他用户 

  (7)FILE  权限可以使用  LOAD  DATA   INFILE  和  SELECT  ...   INTO  OUTFILE  语句读或写服务器上的文件,任何被授予FILE 权限的用户都能读或写  MySQL  服务器上的任何文件(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)。FILE 权限允许用户在  MySQL  服务器具有写权限的目录下创建新文件,但不能覆盖已有文件。

    其余的权限用于管理性操作,通过  mysqladmin  程序或  SQL  语句实施。下表列出了不同权限允许执行的  mysqladmin  命令。

不同权限下可以使用的mysqladmin命令
权限 权限拥有者允许执行的命令
reload flush-hosts, flush-logs, fiush-privileges, flush-status, flush- tables, flush-threads,refresh,reload
shutdown shutdown
process processlist
super kill
  •  reload  命令告诉服务器将授权表重新读入内存; flush-privileges 是  reload  的同义词;refresh 命令清空所有表并关闭/打开记录文件,其他  fiush-xx  命令执行类似  refresh 的功能,但是范围更有限,并且在某些情况下可能更好用,例知,如果只是想清空记录文件,fiush-logs  是比  refresh  更好的选择。
  • shutdown  命令可以关掉服务器。只能从  mysqladmin  发出命令。
  • processlist  命令显示在服务器内执行的线程的信息 ( 即其他账户相关的客户端执行的语句)。kill  命令可以关掉服务器线程。用户可以显示或关掉自己的线程,但是需要  PROCESS  权限来显示或关掉其他用户和  SUPER  权展启动的线程。
  • kil  l向令可以终止其他用户或更改服务器的操作方式。

总的来说,只授予权限给需要他们的那些用户。


2.  授权

    授权就是为某个用户授予权限。在  MySQL  中可以使用 GRANT 语句为用户授予权限。授予的权限可以分为多个层级: 

  (1)全局层级 

 全局权限适用于一个给定服务器中的所有数据库,权限存储在  mysql.user  表中,

   GRANT  ALL  ON  *.*  和  REVOKE   ALL   ON   *.*  只授予和撤销全局权限。 

  (2)数据库层级 

 数据库权限用于一个给定数据库中的所有目标。这些权限存储在   mysql.db  和  mysql.host  表中。

    GRANT   ALL   ON  db_name.*  和  REVOKE ALL ON   db_name.*  只授予和撤销数据库权限

  (3)表层级 

 表权限适用于一个给定表中的所有列。这些权限存储在   mysql.tables_priv 表中。

    GRANT   ALL   ON db_name.tbl_name   和  REVOKE   ALL ON   db_name.tbl_name  只授予和撤销表权限

  (4)列层级 

 列权限适用于一个给定表中的单一列。这些权限存储在  mysql.columns_priv  表中。当使用  REVOKE  时,必须指定与被授权列相同的列。

   (5)子程序层级

    CREATE   ROUTINE、 ALTER ROUTINE、EXECUTE  和  GRANT  权限适用于已存储的子程序,这些权限可以被授于全局层级和数据库层级。而且,除了  CREATE ROUTINE  之外,这些权限还可以被授予子程序层级,井存储在  mysql.procs_priv 表中。

    在  MySOL 中,必须是拥有  GRANT  权限的用户才可以执行  GRANT  语句。要使用  GRANT 或 REVOKE,必须拥有GRANT  OPTION  权限。

    GRANT  语法如下:

    GRANT  pri_type    [  ( columns ) ]  [ , pri_type    [  ( columns ) ] ]  ...  
    ON   [  object_type ]   table1, table2, ...  ,  tablen
    TO   user   [  IDENTIFIED   BY   [ PASSWORD ]  'password' ]
    [  ,   user   [  IDENTIFIED   BY   [ PASSWORD ]  'password' ]  ] ...

        [  WITH  GRANT  OPTION]
    object_type = TABLE   |   FUNCTION   |   PROCEDURE

    GRANT  OPTION  取值

    |  MAX_QUERIES_PER_HOUR   count
    |  MAX_UPDATES_PER_HOUR  count
    |  MAX_CONNECTIONS_PER_HOUR   count
    |  MAX_USER_CONNECTIONS   count


    priv_type  参数表示权限类型: columns 参数表示权限作用于哪些列上,不指定该参数则表示作用于整个表;   table1, table2, ...  ,  tablen  表示授予权限的列所在的表;  object_type指定授权作用的对象类型包括  TABLE(表)、FUNCTION(函数) 和PROCEDURE(存储过程),当从旧版本的  MySQL  升级时,要使用  object_type 子句,必须升级授权表; user 参数表示用户账户,由用户名和主机名构成,形式是   ”'username@hostname' " ;  IDENTIFIED  BY  参数用于设置密码。
    WITH  关键字后可以跟一个或多个  GRANT OPTION 。  GRANT OPTION的取值有5个,意义如下:

  • GRANT OPTION  将自己的权限赋予其他用户。
  • MAX_QUERIES_PER_HOUR   count  设置每个小时可以执行  count  次查询。
  • MAX_UPDATES_PER_HOUR  count  设置每小时可以执行  count  次更新。
  • MAX_CONNECTIONS_PER_HOUR   count  设置每小时可以建立  count  个连接。
  • MAX_USER_CONNECTIONS   count  设置单个用户可以同时建立  count  个连接。

    【例】使用  GRANT  语句创建一个新的用户  zth  密码为  zth。用户  zth  对所有的数据有查询、插入权限,并授子  GRANT权限。GRANT 语句及其执行结果如下:

mysql> GRANT SELECT, INSERT ON *.* TO  'zth'@'localhost'
    -> IDENTIFIED  BY 'zth'
    -> WITH  GRANT  OPTION;
Query OK, 0 rows affected, 1 warning (0.08 sec)

    使用  SELECT 语句查询用户  zth  的权限:

mysql> SELECT  Host,  User, Select_priv  ,  Insert_priv,   Grant_priv  FROM  mysql.user  where   user='zth';
+-----------+------+-------------+-------------+------------+
| Host      | User | Select_priv | Insert_priv | Grant_priv |
+-----------+------+-------------+-------------+------------+
| localhost | zth  | Y           | Y           | Y          |
+-----------+------+-------------+-------------+------------+

3.  收回权限

     收回权限就是取消已经赋予用户的某些权限。收回用户不必要的权限可以在一定程度上保证系统的安全性。MySQL 中使用REVOKE  语句取消用户的某些权限。使用  REVOKE  收回权限之后,用户账户的记录将从  db、host、tables_priv  和  columns_priv  表中删除,但是用户账号记录仍然在  user 表中保存  (删除 user 表中的账户记录,可以使用  DROP USER 语句)。

    在将用户账户从  user  表删除之前,应该收回相应用户的所有权限,REVOKE  语句有两种语法格式,第一种语法是收回所有用户的所有权限,此语法可以取消用户的所有全局层级、数据库层级、表层级和列层级的权限,其语法如下:

    REVOKE   ALL   PRIVILEGES ,  GRANT OPTION  

    FROM   'user'@'host'   [  , 'user'@'host'  ...   ] 

    REVOKE  语句必须和  FROM  语句一起使用,FROM  语句指明需要收回权限的账户。

    另一种为长格式的 REVOKE  语句,基本语法如下:

     REVOKE  pri_type    [  ( columns ) ]  [ , pri_type    [  ( columns ) ] ]  ...  

    ON   [  object_type ]   table1, table2, ...  ,  tablen

    FROM   'user'@'host'   [  , 'user'@'host'  ...   ] 

    该语法收回指定的权限,其中,priv_type  参数表示权限类型; columns  参数表示权限作用于哪些列上,如果不指定该参数,表示作用于整个表;   table1, table2, ...  ,  tablen  表示从哪个表中收回权限; 'user'@'host'  参数表示用户账户,由用户名和主机名构成。
    要使用  REVOKE  语句,必须拥有  mysq  l数据库的全局  CREATE USER  权限或  UPDATE  权限。


    【例】使用  REVOKE 语句取消用户  zth  的更新插入权限。REVOKE  语句及其执行结果如下:

mysql> REVOKE  INSERT ON  *.*  FROM  'zth'@'localhost';
Query OK, 0 rows affected (0.00 sec)

    使用  SELECT  语句查询用户 zth 的权限:

mysql> SELECT  Host,  User, Select_priv  ,  Insert_priv,   Grant_priv  FROM  mysql.user  where   user='zth';
+-----------+------+-------------+-------------+------------+
| Host      | User | Select_priv | Insert_priv | Grant_priv |
+-----------+------+-------------+-------------+------------+
| localhost | zth  | Y           | N           | Y          |
+-----------+------+-------------+-------------+------------+


4.  查看权限

    SHOW GRANTS  语句可以显示指定用户的权限信息。语法格式如下:

    SHOH GRANTS  FOR   'user'@'host';

    user  表示登录用户的名称,host 表示登录的主机名称或者 IP 地址。在使用该语句时,指定的用户名和主机名都要用单引号括起来,并使用@符号将两个名字分隔开。

    【例】使用  SHOW GRANTS  语句查询用户  zth 的权限信息。SHOW GRANTS  语句及其执行结果如下:

mysql> SHOW GRANTS  FOR  'zth'@'localhost';
+------------------------------------------------------------+
| Grants for zth@localhost                                   |
+------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'zth'@'localhost' WITH GRANT OPTION |
+------------------------------------------------------------+

    通过  SELECT  语句也可以查看  user 表中的各个权限字段以确定用户的权限信息,语法格式如下:

    SELECT  privileges_list    FROM  user   WHERE   user='username', host='  hostname';

    privileges_list  想要直看的权限字段,可以为  Select_priv 、Insert_priv  等。


MySQL 请求核实过程:

                              MySQL——安全性机制之权限管理_第3张图片

【注】参考于清华大学出版社《MySQL数据库应用案例课堂》2016年1月第1版

你可能感兴趣的:(MySQL)