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;    -刷新
相关推荐
石像鬼₧魂石2 小时前
Kali Linux 内网渗透:深度工程实施手册
linux·运维·服务器
独自破碎E3 小时前
MySQL中如何进行SQL调优?
数据库·sql·mysql
LXY_BUAA3 小时前
《source insight》添加对.s文件的支持
linux
fai厅的秃头姐!3 小时前
01-python基础-day02Linux基础
linux
好评1243 小时前
git常见操作及问题
linux·git
运维螺丝钉3 小时前
docker安装应用
运维·docker·容器
以太浮标3 小时前
华为eNSP模拟器综合实验之- 路由表RIB和转发表FIB的关联解析
运维·网络·华为·信息与通信
不会代码的小猴3 小时前
Linux环境编程第一天笔记
linux·笔记
optimistic_chen3 小时前
【Docker入门】cgroups 资源控制
linux·运维·ubuntu·docker·容器·cgroup