Linux-MySQL权限管理

1.MySQL服务器登录方式

1.1本地登录MySQL服务器

复制代码
mysql -uroot -p'Root@123'

1.2MySQL免交互访问

mysql -h <IP或主机名> -P <端口> -u <用户名> -p <密码> -D <指定数据库> -e "<SQL语句>"

复制代码
mysql -uroot -p'Root@123' -h localhost -P 3306 -e"SELECT * FROM user.user1;"

2.创建用户

2.1使用CREATE USER语句创建用户

CREATE USER <用户名>@<IP/主机名> IDENTIFIED BY "用户密码";
注意:服务端与客户端都需要关闭防火墙,启动MySQL服务

|-----------------------|--------------|
| localhost | 只允许本地登录 |
| % | 允许任意主机登录(默认) |
| 192.168.189.% | 允许任意指定网段登录 |
| 192.168.189.137(固定IP) | 允许固定IP登录 |
[地址常用选项]

服务端创建用户
复制代码
-创建jack用户,指定由任意IP登录服务端MySQL
注意:不写默认%
CREATE USER jack@'%' IDENTIFIED BY 'Jack@123'; 

-创建tom用户,指定由192.168.189网段登录服务端MySQL
CREATE USER tom@'192.168.189.%' IDENTIFIED BY 'Tom@1234';    

-创建tony用户,指定由192.168.189.137固定IP登录服务端MySQL
CREATE USER tony@'192.168.189.137' IDENTIFIED BY 'Tony@123';

SELECT user,host FROM mysql.user;    -查看已创建用户信息
客户端登录
复制代码
-使用jack用户登录服务端MySQL
mysql -ujack -p'Jack@123' -h 192.168.189.138

-使用tom用户登录服务端MySQL
mysql -utom -p'Tom@1234' -h 192.168.189.138

-使用tony用户登录服务端MySQL
mysql -utony -p'Tont@1234' -h 192.168.189.138

3.权限操作

3.1权限级别

|--------------|-------------------|-----------------------------|
| 级别 | 权限说明 | 示例 |
| *.* | 任何数据库下的任何数据表 | *.* |
| 数据库名.* | 指定数据库下的任何数据表 | user.* |
| 数据库名.表名 | 指定数据库下的指定表 | user.student |
| 数据库名.表名(字段名) | 指定数据库下的指定表下的指定字段名 | SELECT (id) ON user.stduent |
[权限级别]

3.2授予权限-GRANT

GRANT <权限名> ON <数据库名.表名> TO <用户名@'IP/主机名'>

GRANT ALL ON <数据库名.表名> TO <用户名@'IP/主机名'> -授予所有权限

GRANT <权限名> ON <数据库名.表名> TO <用户名@'IP/主机名'> WITH GRANT OPTION -授予授权权限
注意:<用户>@<IP/主机名>必须与创建时的一致

复制代码
GRANT SELECT ON *.* TO jack@'%';    -授予jack用户任意库下任意表的查找权限

GRANT SELECT ON mysql.* TO tom@'192.168.189.%';    -授予tom用户mysql库下的所有表的查询权限

GRANT SELECT(user,host) ON mysql.user TO tony@'192.168.189.137';    -授予tony用户mysql库下user表下的user,host字段查找权限

GRANT SELECT ON *.* TO jack@'%' WITH GRANT OPTION;    -授予jack授予权限权限

3.3查看权限-SHOW GRANTS

SHOW GRANTS\G -查看当前用户权限

SHOW GRANT FOR <用户名>@<IP/主机名>\G 查看其他用户权限

3.4回收权限-REVOKE

REVOKE <权限名> ON <数据库.表名> FROM <用户名@'IP/主机名'>

REVOKE ALL ON <数据库.表名> FROM <用户名@'IP/主机名'> -回收所有权限

REVOKE GRANT OPTION ON <数据库.表名> FROM <用户名@'IP/主机名'> -回收授予权限权限(需单独回收,不包含在ALL中)

4.权限控制机制(了解)

|--------------------|-----------|
| mysql.user | 用户账户和全局权限 |
| mysql.db | 数据库级别权限 |
| mysql.tables_priv | 表级权限 |
| mysql.columns_priv | 列级权限 |
[MySQL权限表]

jack用户具有全局的SELECT权限
tom用户不具备全局SELECT权限,但具有对mysql库下所有表的SELECT权限

4.1权限验证流程

|-------------------------------------------------------------------------------------------------------------------------|
| 1.检查mysql.user全局表 * 如果 Select_priv = 'Y':拥有所有库所有表的 SELECT 权限,不再检查其他表 * 如果 Select_priv = 'N':继续检查 db 表 |
| 2.检查mysql.db库级别表 * 如果找到对应记录且 Select_priv = 'Y':拥有指定数据库的所有表 SELECT 权限 * 如果没有找到或 Select_priv = 'N':继续检查 tables_priv 表 |
| 3.检查mysql.tables_priv表级别表 * 如果 Table_priv 包含 'Select':拥有该表所有列的 SELECT 权限 * 如果不包含:继续检查 columns_priv 表 |
| 4.检查mysql.colimns_priv表 * 如果 Column_priv 包含 'Select':拥有指定列的 SELECT 权限 * 如果不包含:没有 SELECT 权限 |
[权限验证流程-以SELECT为例]

5.密码管理-ALTER USER

5.1修改当前用户密码

ALTER USER USER() IDENTIFIED BY '新密码'

5.2修改其他用户密码

ALTER USER <用户名>@<IP/主机名> IDENTIFIED BY '新密码'

5.3密码策略级别(了解)略

5.4破解MySQL密码-skip-grant-tables模式

复制代码
# 1. 停止MySQL服务
sudo systemctl stop mysql

# 2. 以安全模式启动MySQL(跳过权限验证)
sudo mysqld_safe --skip-grant-tables --skip-networking &

# 3. 无需密码登录MySQL
mysql -u root

# 4. 在MySQL命令行中执行以下命令
# MySQL 5.7.6+ 版本:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

# MySQL 5.7.5及以下版本:
UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

# 5. 退出MySQL
EXIT;

# 6. 重启MySQL服务
sudo systemctl restart mysql

6.删除用户-DROP USER

DROP USER <用户名>@<IP/主机名>

7.使用角色管理用户权限

7.1创建角色

CREATE ROLE '角色1','角色2','角色3'

7.2给角色权限

GRANT <权限名> ON <数据库名.表名> TO <'角色'>

7.3将角色分配给用户

GRANT <'角色'> TO <用户名>@<IP/主机名>

7.4设置默认登录角色

SET DEFAULT ROLE <'角色'> TO <用户名>@<IP/主机名>

7.5登录查看当前用户所扮演的角色

SELECT CURRENT_ROLE()

7.6撤销ROLE和权限

7.6.1角色移除用户

REVOKE <'角色名'> FROM <用户名>@<IP/主机名>

7.6.2移除角色权限

REVOKE <权限名> ON <数据库名.数据表名> FROM <'角色名'>

7.6.3删除角色

DROP ROLE <'角色名'>

8.以上操作如果刷新不出来可以使用以下命令

复制代码
flush privileges;    -刷新
相关推荐
甲鱼9292 小时前
MySQL 实战手记:日志管理与主从复制搭建全指南
运维
随风飘的云5 小时前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
Johny_Zhao16 小时前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
chlk1232 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑2 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件2 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒2 天前
OpenClaw 多 Agent 配置实战指南
运维
深紫色的三北六号3 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash3 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI3 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github