MySQL学习(二):MySQL权限与安全

来源:互联网 发布:家用脱毛仪 知乎 编辑:程序博客网 时间:2024/05/08 17:26

一、权限表

MySQL 服务器通过权限表来控制用户对数据库的访问,权限表存放在 mysql 数据库中,由mysql_install_db 脚本初始化。存储账户权限信息表主要有: user 、 db 、 host 、 tables_priv 、columns_priv和procs_priv。

一)、user表

  • user 表是 MySQL 中最重要 的一个权限衰,记录允许连接到服务器的账号信息,里面的权限是全局级的。
    • 例如 : 一个用户在 user 表中被授予了 DELETE 权限,则该用户可以删除 MySQL服务器上所有数据库中的任何记录 。
  • MySQL 5.6 中 user 表有 42 个字段,这些字段可以分为 4 类,分别是用户列权限列安全列资源控制列
    这里写图片描述
    这里写图片描述

1、用户列

  • user 表的用户列包括 Host 、 User 、 Password ,分别表示主机名、用户名和密码。 User和 Host 为 User 表的联合主键 。

2、权限列

  • 权限列的字段决定了用户的权限,描述了在全局范围内允许对数据和数据库进行的操作。
    • 包括查询权限、修改权限等普通权限,还包括了关闭服务器、超级权限和加载用户等高级权限。
    • 普通权限用于操作数据库;高级权限用于数据库管理。
  • user 表中对应的权限是针对所有用户数据库的。这些字段值的类型为 ENUM ,可以取的值只能为 Y 和 N。
    • Y 表示该用户有对应的权限; N 表示用户没有对应的权限。
    • user 表的结构中字段的值默认都是 N。
    • 如果要修改权限,可以使用 GRANT 语句或 UPDATE语句更改 user 表的这些字段来修改用户对应的权限。

3、安全列

  • 安全列只有 6 个字段,其中两个是 ss l 相关的, 2 个是 x509 相关的,另外 2 个是授权插件相关的 。
    • ssl 用于加密。
    • X509 标准可用于标识用户。
    • Plugin 字段标识可以用于验证用户身份的插件,如果该字段为空,服务器使用内建授权验证机制验证用户身份。

4、资源控制列

  • 资源控制列的字段用来限制用户使用的资源,包含 4 个字段,分别为:
    • max_questions——用户每小时九许执行的查询操作次数。
    • max_updates一一用户每小时九许执行的更新操作次数。
    • max_connections——用户每小时九许执行的连接操作次数。
    • max_user_connections——用户允许同时建立的连接次数。
      • 一个小时内用户查询或者连接数量超过资源控制限制,用户将被锁定,直到下一个小时,才可以在此执行对应的操作。可以使用 GRANT 语句更新这些字段的值。

二)、db表和host表

  • db 表和 host 表是 MySQL 数据中非常重要的权限表。
    • db 表中存储了用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库。
    • host 表中存储了某个主机对数据库的操作权限,配合 db 权限表对给定主机上数据库级操作权限做更细致的控制。
      • 这个权限表不受GRANT 和 REVOKE 语旬的影响。
  • db 表比较常用, host 表一般很少使用。 它们的字段大致可以分为两类:用户列权限列
    这里写图片描述

这里写图片描述
这里写图片描述

1、用户列

  • db 表用户列有 3 个字段,分别是 Host 、 User 、 Db ,标识从某个主机连接某个用户对某个数据库的操作权限,这 3 个字段的组合构成了 db 表的主键。
  • host 表不存储用户名称,用户列只有 2 个字段,分别是 Host 和 Db,表示从某个主机连接的用户对某个数据库的操作权限,其主键包括 Host 和 Db 两个字段。
  • host 很少用到, 一般情况下 db 表就可以满足权限控制需求了。

2、权限列

  • db 表和 host 表的权限列大致相同,表中 create_ routine_priv 和 alter_routine_priv 这两个字段表明用户是否有创建和修改存储过程的权限。
    • user 表中的权限是针对所有数据库的 , 如果希望用户只对某个数据库有操作权限,那么需要将 user 表中对应的权限设置为 N , 然后在 db 表中设置对应数据库的操作权限。

三)、tables_priv 表和 columns_priv 表

  • tables_priv 表用来对表设置操作权限 。
    • 有 8 个字段 ,分别 是 Host 、 Db, User 、 Table_name 、 Gran tor 、 Timestamp 、Table_priv 和 Column_priv ,各个字段说明如下:
      • Host 、 Db 、 User 和 Table name 4 个字段分别表示主机名、数据库名、用户名和表名。
      • Grantor 表示修改该记录的用户 。
      • Timestamp 字段表示修改该记录的时间 。
      • Table_priv 表示对表的操作权限包括 Select 、 Insert 、 Update 、 Delete 、 Create 、 Drop 、Grant 、 References 、 Index 和 Alter 等 。
      • Column_priv 字段表示对表中的列的操作权民包括 Select Insert Update 和 References。
  • columns_priv 表用来对表的某 一 列设置权限。
    • Columns_priv 表只有 7 个字段,分别是 Host 、 Db 、 User 、 Table_name 、 Column_name 、Timestamp 、 Column_priv。
      • Column_name 用 来指定对哪些数据列具有操作权限 。

四)、procs_priv 表

  • 对存储过程和存储函数设置操作权限。
    • 包含 8 个字段,分别是 Host、Db、User、Routine_name、 Routine_type、Grantor、Proc_priv 和 Timestamp ,各个字段的说明如下:
      • Host 、 Db 和 User 字段分别表示主机名、数据库名和用户名。 Routine_name 表示存储过程或函数的名称。
      • Routine_type 表示存储过程或函数的类型。 Routine_type 字段有两个值,分别是FUNCTION 和 PROCEDURE 。
        • FUNCTION 表示这是一个函数; PROCEDURE 表示这是一个存储过程。
      • Grantor 是插入或修改该记录的用户。
      • Proc_priv 表示拥有的权限,包括 Execute 、 Alter Routine 、 Grant 3 种。
      • Column_priv 字段表示对表中的列的操作权民包括 Select Insert Update 和 References。
      • Timestamp 表示记录更新时间。

二、 账户管理

MySQL 提供许多语句用来管理用户账号,这些语句可以用来管理包括登录和退出 MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。 MySQL 数据库的安全性,需要通过账户管理来保证。

一)、登录和退出 MySQL 服务器

1、MySQL 命令

  • MySQL 命令的常用参数如下:
    • -h 主机名,可以使用该参数指定主机名或 ip,如果不指定,默认是 localhost。
    • -u 用户名,可以使用该参数指定用户名。
    • -p 密码,可以使用该参数指定登录密码。如果该参数后面有一段字段,则该段字符串将作为用户的密码直接登录。如果后面没有内容,则登录的时候会提示输入密码。
    • -P 端口号,该参数后面接 MySQL 服务器的端口号, 默认为 3306 。
    • 数据库名,可以在命令的最后指定数据库名。
    • -e 执行 SQL 语句 。 如果指定了该参数,将在登录后执行-e 后面的命令或 SQL 语句并退出。

2、MySQL 命令例子

  • eg1:使用 root 用户登录到本地 MySQL 服务器的 test 库中,命令如下:
MySQL -h localhost -u root -p test
  • eg2: 使用 root 用户登录到本地 MySQL 服务器的 mysq l 数据库中,同时执行一条查询语句。命令如下:
MySQL -h localhost -u root -p mysql - e ” DESC person;”

二)、新建普通用户

  • 在 MySQL 数据库中,有两种方式创建新用户 :
    • 使用 CREATE USERGRANT 语句。
    • 直接操作 MySQL 授权表 。
      • 最好的方法是使用 GRANT 语句,因为这样更精确 , 错误少。

1、使用 CREATE USER 语句创建新用户

  • CREATE USER 语句的基本语法格式如下:
CREATE USER user_specification    [, user_specification] ...user_specification:    user@host    [        IDENTIFIED BY [PASSWORD] 'password'        | IDENTIFIED WITH auth_plugin [AS 'auth_string']    ]
 - user 表示创建的用户的名称;  - host 表示允许登录的用户主机名称 ; -  IDENTIFIED BY 表示用来设置用户的密码 ; - [PASSWORD]表示使用哈希值设置密码,该参数可选 ; -  IDENTIFIED WITH 语句为用户指定一个身份验证插件; - auth_plugin 是插件的名称,插件的名称可以是一个带单引号的字符串,或者带引号的字符串; - auth_string 是可边的字符串参数,该参数将传递给身份验证插件,由该插件解释该参数的意义 。

- 使用 CREATE USER 语旬的用户,必须有全局的 CREATE USER 权限或 MySQL 数据库的 INSERT 权限。

  • eg:使用 CREATE USER 创建一个用户,用户名是 andy,密码是6666 , 主机名是 localhost,命令如下 :
CREATE USER 'andy'@'localhost' IDENTIFIED BY '6666';# 获取密码的哈希值SELECT password('6666');  

这里写图片描述

2、使用 GRANT 语句创建新用户

  • CREATE USER 语句创建的新用户没有任何权限,还需要使用 GRANT 语句赋予用户权限。
  • GRANT 语句不仅可以创建新用户,还可以在创建的同时对用户授权。
    • 使用 GRANT 语句创建新用户时必须有 GRANT 权限 。
      • 使用 GRANT 语句创建新用户时必须有 GRANT 权限 。
      • GRANT 语旬的基本语法格式如下 :
GRANT privileges ON db.tableTO user@host [IDENTIFIED BY 'password') [, user [IDENTIFIED BY 'password']][WITH GRANT OPTION) ;
 - privileges 表示赋予用户的权限类型; -  db.table 表示用户的权限所作用的数据库中的表: IDENTIFIED BY 关键字用来设置密码; - ’password,表示用户密码; -  WITH GRANT OPTION为可选参数,表示对新建立的用户赋予 GRANT 权限,即该用户可以对其他用户赋予权限。
  • eg: 使用 GRANT 语句创建一个新的用户 zhang,密码为 123456,并授于用户对所有数据表的 SELECT 和UPDATE 权限。 GRANT 语句及其执行结果如下:
mysql> flush privileges;Query OK, 0 rows affectedmysql> GRANT SELECT, UPDATE ON *.* TO 'zhang'@'localhost' IDENTIFIED BY '123456';Query OK, 0 rows affected
- # 执行上面语句之前,先执行:**flush privileges;**,否则报错:1290 - The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement;
mysql> SELECT Host,User,Select_priv,Update_priv FROM mysql.user where user='zhang';+-----------+-------+-------------+-------------+| Host      | User  | Select_priv | Update_priv |+-----------+-------+-------------+-------------+| localhost | zhang | Y           | Y           |+-----------+-------+-------------+-------------+1 row in set

3、直接操作 MySQL 用户表

  • 可以使用 INSERT 语句向 user 表中直接插入一条记录来创建一个新的用户。
    • 使用 INSERT 语句必须拥有对 mysql.user 表的 INSERT 权限。
      • 使用 INSERT语句创建新用户 的基本语法格式如下:
INSERT INTO mysql.user(Host, User, Password, [privilegelist)) VALUES ('host','username', PASSWORD('password'), privilegevaluelist);
 - Host 、 User 、 Password 分别为 user 表 中的主机、用 户 名称和密码字段; -  privilegelist 表示用户 的权限,可以有多个权限; -  PASSWORD()函数为密码加密函数 ; -  privilegevaluelist 为对应的权限的值,只能取‘Y’或者’N 。
  • eg:使用 INSERT 创建一个新账户 , 其用户名称为 li, 主机名称为 localhost,密码为666666 , INSERT 语句如下:
mysql> use mysql;Database changedmysql> INSERT INTO user(Host,User,Password) VALUES('localhost', 'li', PASSWORD('666666'));Query OK, 1 row affectedmysql> SELECT host,user,password FROM user;+-----------+-------+-------------------------------------------+| host      | user  | password                                  |+-----------+-------+-------------------------------------------+| localhost | root  | *1C738264F2C278FEDAACE6544BF970DE6776BCFE || 127.0.0.1 | root  | *1C738264F2C278FEDAACE6544BF970DE6776BCFE || ::1       | root  | *1C738264F2C278FEDAACE6544BF970DE6776BCFE || localhost |       | *1C738264F2C278FEDAACE6544BF970DE6776BCFE || localhost | zhang | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 || localhost | li    | *B2B366CA5C4697F31D4C55D61F0B17E70E5664EC |+-----------+-------+-------------------------------------------+6 rows in set

三)、删除普通用户

  • 可以使用 DROP USER 语句删除用户。
  • 可以直接通过 DELETE从 mysql.user 表中删除对应的记录来删除用户。

1、使用 DROP USER 语句删除用户

  • DROP USER 语句语法如下:
# 用于删除一个或多个 MySQL 账户DROP USER user [, user];
  • 要使用 DROP USER,必须拥有MySQL 数据库的全局 C阻ATE USER 权限或 DELETE 权限。
  • 使用与 GRANT 或 REVOKE 相同的格式为每个账户命名;
  • 使用 DROP USER, 可以删除一个账户和其权限,操作如下:
mysql> DROP USER 'andy'@'localhost';Query OK, 0 rows affected

2、使用 DELETE 语句删除用户

  • DELETE 语句基本语法格式如下 :
DELETE FROM mysql.user WHERE host='hostname' and user='username';
  • eg:使用 DELETE 删除用户’li’@’localhost’, DELETE 语句如下:
mysql> DELETE FROM mysql.user WHERE host='localhost' and user='li';Query OK, 1 row affected

四)、root 用户修改自己的密码

  • 可以使用 DROP USER 语句删除用户。
  • 可以直接通过 DELETE从 mysql.user 表中删除对应的记录来删除用户。

1、使用 mysqladmin 命令在命令行指定新密码

  • DROP USER 语句语法如下:
mysqladmin -u username -h localhost -p password "newpwd";
 - username 为要修改密码的用户名称,在这里指定为 root 用户; - 参数-h 指需要修改的、对应哪个主机用户的密码,该参数可以不写,默认是 localhost;  - -p 表示输入当前密码; - password为关键字,后面双引号内的内容“ newpwd”为新设置的密码。

- eg: 使用 mysqladmin 将 root 用户的密码修改为“ 6666 ”,在 Windows 的命令行窗口中执行命令如下 :

mysqladmin -u root -p password "6666";

2、修改 mysql 数据库的 user 表

  • 使用 UPDATA 语句修改 root 用户密码的语句如下:
UPDATE mysql.user SET Password=PASSWORD("rootpwd") WHERE User="root" AND Host="localhost";

3、使用 SET 语句修改 root 用户的密码

  • 使用 SET 语句修改自身密码的语法结构如下:
SET PASSWORD=PASSWORD("rootpwd");

五)、 root 用户修改普通用户密码

  • 可以使用 DROP USER 语句删除用户。
  • 可以直接通过 DELETE从 mysql.user 表中删除对应的记录来删除用户。

1、使用 mysqladmin 命令在命令行指定新密码

  • DROP USER 语句语法如下:
mysqladmin -u username -h localhost -p password "newpwd";
 - username 为要修改密码的用户名称,在这里指定为 root 用户; - 参数-h 指需要修改的、对应哪个主机用户的密码,该参数可以不写,默认是 localhost;  - -p 表示输入当前密码; - password为关键字,后面双引号内的内容“ newpwd”为新设置的密码。

- eg: 使用 mysqladmin 将 root 用户的密码修改为“ 6666 ”,在 Windows 的命令行窗口中执行命令如下 :

mysqladmin -u root -p password "6666";

2、修改 mysql 数据库的 user 表

  • 使用 UPDATE 语句修改 root 用户密码的语句如下:
UPDATE mysql.user SET Password=PASSWORD("rootpwd") WHERE User="root" AND Host="localhost";

3、使用 SET 语句修改 root 用户的密码

  • 使用 SET 语句修改自身密码的语法结构如下:
SET PASSWORD=PASSWORD("rootpwd");

六)、root 用户修改普通用户密码

1、使用 SET 语句修改普通用户的密码

  • SET 语句语法如下:
SET PASSWORD FOR 'user'@'host' = PASSWORD("somepassword");
  • 如果使用普通用户修改,可省略 FOR 子句更改自己的密码 :
SET PASSWORD=PASSWORD("somepassword");

2、使用 UPDATE 语句修改普通用户的密码

  • 使用 UPDATE 语句修改普通用户密码的语句如下:
UPDATE mysql.user SET Password=PASSWORD("pwd") WHERE User="username" AND Host="localhost";

3、使用GRANT 语句修改普通用户的密码

  • 在全局级别使用 GRANT USAGE 语句(*.*)指定某个账户的密码而不影响账户当前的权限,使用 GRANT 语句修改密码,必须拥有 GRANT 权限。
  • 使用 SET 语句修改自身密码的语法结构如下:
GRANT USAGE ON *.* TO 'someuser'@'%' IDENTIFIED BY 'somepassword';

七)、普通用户修改密码

  • SET 语句修改自己密码的基本语法如下 :
SET PASSWORD = PASSWORD("newpassword");

八)、root 用户密码丢失的解决办法

1、使用–skip-grant-tables 选项启动 MySQL 服务

  • 以 skip-grant-tables 选项启动时, MySQL 服务器将不加载权限判断,任何用户都能访问数据库 。
  • Windows使用 mysqld 或 mysqld-nt 来启动 MySQL 服务进程。
  • 如果 MySQL 的 目录己经添加到环境变量中 ,可以直接使用 mysqld 、 mysqld-nt 命令启动 MySQL服务 。
mysqld --skip-grant-tables mysqld-nt --skip-grant-tables 
  • Linux 使用 mysqld_safe 来启动 MySQL 服务;也可以使用etc/init.d/mysql 命令来启动 MySQL 服务 。
mysqld_safe --skip-grant-tables user=mysqletc/init.d/mysql start-mysql --skip-grant-tables user=mysql

2、使用 root 用户登录,重新设置密码

  1. windows下,打开一个窗口:
net stop MySQLmysql --skip-grant-tables
  1. 打开另外一个命令行窗口,输入不加密码的登录命令。
mysql -u root
  1. 登录成功以后,可以使用 UPDATE 语句或者使用 mysqladmin 命令重新设置 root 密码。

3、加载权限表

  • 修改密码完成后,必须使用 FLUSH PRIVILEGES 语句加载权限表 。
  • 加载权限表后,新的密码才会生效,同时 MySQL 服务器开始权限验证
 FLUSH PRIVILEGES;

三、 权限管理

权限管理主要是对登录到 MySQL 的用户进行权限验证。MySQL 权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的 SELECT、 INSERT、 UPDATE 和 DELETE 权限。

一)、MySQL 的各种权限

1、MySQL 命令

  • 账户权限信息被存储在 MySQL 数据库的 user、 db 、 host、 tables_priv 、 columns_priv 和procs_priv 表中。
  • GRANT 和REVOKE语句所涉及的权限的名称、在授权表中每个权限的表列名称和每个权限有关的操作对象等。
    权限

  • CREATE 和 DROP 权限,可以创建新数据库和表, 或删除(移掉〉己有数据库和表。如果将 MySQL 数据库中的 DROP 权限授予某用户, 用户可以删掉 MySQL 访问权限保存的数据库。

  • SELECT 、 INSERT 、 UPDATE 和 DELETE 权限允许在一个数据库现有的表上实施操作 。
  • SELECT 权限只有在它们真正从一个表 中检索时才被用到。
  • INDEX 权限允许创建或删除索 引 , INDEX 适用于已有表。 如果具有某个表 的 CREATE权限, 可 以在 CREATE TABLE 语句中包括索引 定义 。
  • ALTER 权限,可以使用 ALTER TABLE 来更改表的结构和重新命名表。
  • CREATE ROUT时E 权限用来创建保存的程序(函数和程序) , ALTER ROUTINE 权限用来更改和删除保存的程序, EXECUTE 权限用来执行保存的程序。
  • GRANT 权限允许授权给其他用户。可用于数据库、表和保存的程序。
  • FILE 权限给予用户使用 LOAD DATA 时FILE 和 SELECT … INTO OUTFILE 语句读或写服务器上的文件,任何被授予 FILE 权限的用户都能读或写 MySQL 服务器上的任何文件。(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)。 FILE 权限允许用户在 MySQL 服务器具有写权限的目录下创建新文件,但不能覆盖已有文件。
  • 其余的权限用于管理性操作,它使用 mysqladmin 程序或 SQL 语句实施。

    2、授权

    • MySQL 中可以使用GRANT 语句为用户授予权限 。
    • 全局层级
      • 全局权限适用于一个给定服务器中的所有数据库。
      • 这些权限存储在 mysql.user 表中。
      • GRANT ALL ON *.* 和 REVOKE ALL ON *.*只授予和撤销全局权限。
  • 数据库层级
    • 适用于一个给定数据库中的所有目标。
    • 这些权限存储在 mysql.db 和 mysql.host表中。
    • GRANT ALL ON db_name.tbl_name 和 REVOKE ALL ON db_name.tbl_ name 只授予和撤销数据库权限。
  • 表层级
    • 适用于一个给定表中 的所有列 。
    • 这些权限存储在 mysql.talbes_priv 表中。
    • GRANT ALL ON db_name.和 REVOKE ALL ON db_name.*只授予和撤销数据库权限。
  • 列层级
    • 适用于一个给定表中 的单一列。
    • 这些权限存储在 mysql.columns_priv表中。
    • 当使用 REVOKE时,必须指定与被授权列相同的列。
  • 子程序层级
    • CREATE ROUTINE 、 ALTER ROUTINE 、 EXECUTE 和 GRANT 权限适用于己存储的子程序。
    • 这些权限可 以被授予为全局层级和数据库层级。
    • 除了 CREATE ROUTINE 外 ,这些权限可 以被授予子程序层级 , 并存储在 mysql.procs_priv 表中。
  • 要使用 GRANT 或 REVOKE,必须拥有 GRANT OPTION 权限 , 并且必须用于正在授予或撤销的权限 。 GRANT 的语法如下:
GRANT priv\_type [(columns) J [, priv_type [(columns )] ] ...ON [object_type] tablel , table2 , ... , tablenTO user [IDENTIFIED BY [PASSWORD)’ 'password '][, user [IDENTIFIED BY [PASSWORD]’ 'password']]...    [WITH GRANT OPTION]object type = TABLE | FUNCTION | PROCEDUREGRANT 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_tpye 子旬,必须升级授权表:
  • user 参数表示用户账户 , 由用户名和主机名构成, 形式是 “'usemame’@’Hostname’ ” :
  • IDENTIFIED BY 参数用于设置密码。
  • WITH 关键字后可以跟一个或多个 GRANT OPTION 。 GRANT OPTION 的取值有 5 个,意义如下 :
    • GRANT OPTION ,将自己的非又 fR赋予其他用户 。
    • MAX_QUERIES_PER_HOUR count,设直每个小时可以执行 count 次查询 。
    • MAX_ UPDATES_PER_HOUR count,设直每小时可以执行 count 次更新 。
    • MAX CONNECTIONS_PER_HOUR count,设直每小时可以建立 count 个连接 。
    • MAX_USER_CONNECTIONS count,设直羊个用户可以同时建立 count 个连接 。
  • eg:使用 GRANT 语句创建一个新的用户lily ,密码为“666666 " 。用户lily 对所布的数据有查询、插入权限,并授于 GRANT 权限 。
 GRANT SELECT, INSERT ON *.* TO 'lily'@'localhost'    IDENTIFIED BY '666666'    WITH GRANT OPTION;
  • eg:使用 SELECT 语句查询用户lily的权限:
SELECT Host,User,Select_priv,Insert_priv, Grant_priv FROM mysql.user where user='lily';+-----------+------+-------------+-------------+------------+| Host      | User | Select_priv | Insert_priv | Grant_priv |+-----------+------+-------------+-------------+------------+| localhost | lily | Y           | Y           | Y          |+-----------+------+-------------+-------------+------------+

2、收回权限

  • MySQL 中使用 REVOKE语句取消用户的某些权限。
  • 在将用户账户 从 user 表删除之前 , 应该收回相应用户 的所有权限,REVOKE语句有两种
    法格式:
    • 收回所有用户的所有权限,此语法用于取消对于己命名的用户的所有全局层级、数据库层级、表层级和列层级 的权限:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host'[, 'user'@'host' ...]
- 长格式的REVOKE语句:
REVOKE priv_type [(columns)] [, priv_type [(columns)])ON table1, table2 ,…, tablenFROM 'user'@'host'[, 'user'@'host' ...]
 -  priv_type 参数表示权限类型 :  - columns 参数表示权限作用于哪些列上 ,如果不指定该参数, 表示作用于整个表 : - 'user'@'host'参数表示用户账户 ,由用户名和主机名 构成 。

- 要使用 REVOKE 语旬,必须拥有 mysql 数据库的全局 CREATE USER 权限或 UPDATE权限。

  • eg:使用REVOKE 语句取消用户 lily 的更新权限 :
REVOKE INSERT ON*.* FROM 'lily'@'localhost';SELECT Host,User,Select_priv,Insert_priv, Grant_priv FROM mysql.user where user='lily';+-----------+------+-------------+-------------+------------+| Host      | User | Select_priv | Insert_priv | Grant_priv |+-----------+------+-------------+-------------+------------+| localhost | lily | Y           | N           | Y          |+-----------+------+-------------+-------------+------------+

3、查看权限

  • SHOW GRANTS 语句可以显示指定用户 的权限信息,
SHOW GRANTS FOR 'user'@'host';
  • eg:查看用户lily的权限:
SHOW GRANTS FOR 'lily'@'localhost';+--------------------------------------------------------------------------------------------------------------------------------+| Grants for lily@localhost                                                                                                      |+--------------------------------------------------------------------------------------------------------------------------------+| GRANT SELECT ON *.* TO 'lily'@'localhost' IDENTIFIED BY PASSWORD '*B2B366CA5C4697F31D4C55D61F0B17E70E5664EC' WITH GRANT OPTION |+--------------------------------------------------------------------------------------------------------------------------------+
  • 也可以通过 SELECT 语句查看 user 表中的各个权限字段以确定用户的权限信息 。

四、访问控制

当 MySQL 允许一个用户执行各种操作时,它将首先核实该用户向 MySQL 服务器发送的连接请求,然后确认用户的操作请求是否被允许。
- MySQL 的访问控制分为两个阶段:连接核实阶段和请求核实阶段 。

五、MySQL 的安全问题

一)、操作系统相关的安全问题

1、尽量避免以 root 用户运行 MySQL 服务器

2、尽量关闭不需要的服务

一)、数据库相关的安全问题

1、修改 root 用户口令和删除匿名账号

2、设置安全的密码

3、禁止远程连接数据库

4、不要把 FILE, PROCESS 或者 SUPER 权限授予管理员以外的账户

5、限制单个用户连接次数

6、REVOKE 命令的漏洞

六、使用 SSL 安全连接

SSL ( Secure Socket Layer)是 Netscape 公司所研发,利用 Encryption 技术可确保数据在网络传输过程中不被截取及窃听。该技术目前广泛应用于浏览器与服务器之间的身份认证和加密数据传输。

  • SSL 协议提供的服务主要包括如下:
    • 认证用户和服务器,确保数据友送到正确的客户机和服务器。
    • 加密数据以防止被窃取。
    • 维护数据的完整性,确保数据在传输的过程中不被改变。

七、综合管理用户权限(略)