MySQL服务器的安全基础是:用户应该对需要的数据具有适当的访问权,既不能多也不能少。管理员需要给用户提供他们所需的访问权,且仅提供用户所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。
MySQL用户账号和信息存储在名为mysql的数据库中。mysql数据库有一个名为user的表,它包含所有用户账号。user 表有一个名为user的列,它存储用户登录名。一般不需要直接访问mysql数据库和表,需要直接访问它的时机之一是在需要获得所有用户账号列表时。

  1. USE mysql; # 使用mysql数据库
  2. SELECT user FROM user;

用户创建与授权

https://www.cnblogs.com/zhongyehai/p/10695659.html

创建用户账号

  1. -- 创建一个新用户,名为: new_user1 密码为123456
  2. CREATE USER new_user1 IDENTIFIED BY '123456';
  3. -- 重命名用户
  4. -- new_user1重命名为new_user
  5. RENAME USER new_user1 TO new_user;
  6. -- 查看当前登录的用户和主机
  7. -- 需要一定的权限
  8. select user,host from mysql.user;

IDENTIFIED BY指定的口令为纯文本,MySQL 将在保存到user表之前对其进行加密。为了作为散列值指定口令,使用IDENTIFIED BY PASSWORD
GRANT语句也可以创建用户账号,但一般来说CREATE USER是最清楚和最简单的句子。 此外,也可以通过直接插入行到user表来增加用户,不过为安全起见,一般不建议这样做。MySQL用来存储用户账号信息的表(以及表模式等)极为重要,对它们的任何毁坏都可能严重地伤害到MySQL服务器。因此,相对于直接处理来说,最好是用标记和函数来处理这些表。
仅MySQL 5或之后的版本支持RENAME USER。 为了在以前版本的MySQL中重命名一个用户,可使用UPDATE直接更新msql中的user表。

设置访问权限

在创建用户账号后接着必须分配访问权限。以未授权的用户登录时, show databases;命令只能看到information_schema数据库。未授权用户能登录MySQL,但不能看到数据,不能执行任何数据库操作。MySQL的权限用用户名和主机名结合定义(user@host)。如果不指定主机名,则使用默认的主机名%(授予用户访问权限而不管主机名)。

  1. -- 查看用户new_user已拥有的权限。下面的结果表示没有任何权限。
  2. SHOW GRANTS FOR new_user;
  3. +--------------------------------------+
  4. | Grants for new_user@% |
  5. +--------------------------------------+
  6. | GRANT USAGE ON *.* TO 'new_user'@'%' |
  7. +--------------------------------------+

使用GRANT语句设置权限时需要给出以下信息:

  • 要授予的权限;
  • 被授予访问权限的数据库或表;
  • 用户名。

    1. -- 允许用户在crashcourse数据库的所有表上使用SELECT
    2. GRANT SELECT ON crashcourse.* TO new_user;
    3. -- 可通过列出各权限并用逗号分隔,将多条 GRANT语句串在一起
    4. GRANT SELECT, INSERT ON crashcourse.* TO new_user;
    5. show grants for new_user;
    6. +---------------------------------------------------+
    7. | Grants for new_user@% |
    8. +---------------------------------------------------+
    9. | GRANT USAGE ON *.* TO 'new_user'@'%' |
    10. | GRANT SELECT ON `crashcourse`.* TO 'new_user'@'%' |
    11. +---------------------------------------------------+
    12. -- REVOKEGRANT的反操作。
    13. -- 问题: 如果在new_user登录后撤销了其部分权限,但已登录的new_user还能继续操作库/表?
    14. REVOKE SELECT ON crashcourse.* FROM new_user;

    GRANT和REVOKE可在几个层次上控制访问权限:

  • 整个服务器,使用GRANT ALL和REVOKE ALL

  • 整个数据库,使用ON database.*
  • 特定的表,使用ON database.table
  • 特定的列;
  • 特定的存储过程。 | 可以授予或撤销的每个权限 | | | —- | —- | | 权限 | 说明 | | ALL | 除GRANT OPTION外的所有权限 | | ALTER | 使用ALTER TABLE | | ALTER ROUTINE | 使用ALTER PROCEDURE 和 DROP PROCEDURE | | CREATE | 使用CREATE TABLE | | CREATE ROUTINE | 使用CREATE PROCEDURE | | CREATE TEMPORARY TABLES | 使用CREATE TEMPORARY TABLE | | CREATE USER | 使用 CREATE USER,DROP USER, RENAME USER和REVOKE ALL PRIVILEGES | | CREATE VIEW | 使用CREATE VIEW | | DELETE | 使用DELETE | | DROP | 使用DROP TABLE | | EXCUTE | 使用CALL和存储过程 | | FILE | 使用SELECT INTO OUTFILE和LOAD DATA INFILE | | GRANT OPTION | 使用GRANT和REVOKE | | INDEX | 使用CREATE INDEX 和DROP INDEX | | INSERT | 使用INSERT | | LOCK TABLES | 使用LOCK TABLES | | PROCESS | 使用SHOW FULL PROCESSLIST | | RELOAD | 使用FLUSH | | REPLICATION CLIENT | 服务器位置的访问 | | REPLICATION SLAVE | 由复制从属使用 | | SELECT | 使用SELECT | | SHOW DATABASES | 使用SHOW DATABASES | | SHOW VIEW | 使用SHOW CREATE VIEW | | SHUTDOWN | 使用mysqladmin shutdown(用来关闭MySQL) | | SUPER | 使用CHANGE MASTER、KILL、LOGS、PURGE、MASTER和SET GLOBAL。还允许mysqladmin调试登录 | | UPDATE | 使用UPDATE | | USAGE | 无权限访问 |

更改用户登录密码

为了更改用户口令可使用SET PASSWORD语句,新口令必须通过Password函数加密。

  1. -- 指定用户new_user:更改用户new_user的密码
  2. SET PASSWORD FOR new_user = Password('pwd123456');
  3. -- 不指定用户: 更改当前登录用户的密码
  4. SET PASSWORD = Password('pwd147258');

删除用户

自MySQL 5以来,DROP USER删除用户账号和所有相关的账号权限。在MySQL 5以前,DROP USER只能用来删除用户账号,不能删除相关的权限。因此,如果使用旧版本的MySQL,需要先用REVOKE删除与账号相关的权限,然后再用DROP USER删除账号。

  1. -- 删除名为new_user的用户
  2. DROP USER new_user;