MySQL服务器的安全基础是:用户应该对需要的数据具有适当的访问权,既不能多也不能少。管理员需要给用户提供他们所需的访问权,且仅提供用户所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。
MySQL用户账号和信息存储在名为mysql的数据库中。mysql数据库有一个名为user的表,它包含所有用户账号。user 表有一个名为user的列,它存储用户登录名。一般不需要直接访问mysql数据库和表,需要直接访问它的时机之一是在需要获得所有用户账号列表时。
USE mysql; # 使用mysql数据库SELECT user FROM user;
用户创建与授权
https://www.cnblogs.com/zhongyehai/p/10695659.html
创建用户账号
-- 创建一个新用户,名为: new_user1, 密码为123456CREATE USER new_user1 IDENTIFIED BY '123456';-- 重命名用户-- 将new_user1重命名为new_userRENAME USER new_user1 TO new_user;-- 查看当前登录的用户和主机-- 需要一定的权限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)。如果不指定主机名,则使用默认的主机名%(授予用户访问权限而不管主机名)。
-- 查看用户new_user已拥有的权限。下面的结果表示没有任何权限。SHOW GRANTS FOR new_user;+--------------------------------------+| Grants for new_user@% |+--------------------------------------+| GRANT USAGE ON *.* TO 'new_user'@'%' |+--------------------------------------+
使用GRANT语句设置权限时需要给出以下信息:
- 要授予的权限;
- 被授予访问权限的数据库或表;
用户名。
-- 允许用户在crashcourse数据库的所有表上使用SELECTGRANT SELECT ON crashcourse.* TO new_user;-- 可通过列出各权限并用逗号分隔,将多条 GRANT语句串在一起GRANT SELECT, INSERT ON crashcourse.* TO new_user;show grants for new_user;+---------------------------------------------------+| Grants for new_user@% |+---------------------------------------------------+| GRANT USAGE ON *.* TO 'new_user'@'%' || GRANT SELECT ON `crashcourse`.* TO 'new_user'@'%' |+---------------------------------------------------+-- REVOKE是GRANT的反操作。-- 问题: 如果在new_user登录后撤销了其部分权限,但已登录的new_user还能继续操作库/表?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函数加密。
-- 指定用户new_user:更改用户new_user的密码SET PASSWORD FOR new_user = Password('pwd123456');-- 不指定用户: 更改当前登录用户的密码SET PASSWORD = Password('pwd147258');
删除用户
自MySQL 5以来,DROP USER删除用户账号和所有相关的账号权限。在MySQL 5以前,DROP USER只能用来删除用户账号,不能删除相关的权限。因此,如果使用旧版本的MySQL,需要先用REVOKE删除与账号相关的权限,然后再用DROP USER删除账号。
-- 删除名为new_user的用户DROP USER new_user;
