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, 密码为123456
CREATE USER new_user1 IDENTIFIED BY '123456';
-- 重命名用户
-- 将new_user1重命名为new_user
RENAME 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数据库的所有表上使用SELECT
GRANT 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;