MySQL权限管理 破解登录数据库密码

权限管理

mysql库下的授权表及其放行权限的范围

 1、mysql.user 

  针对所有数据、所有库下所有表、以及表下的所有字段()

 2、msyql.db 

  只针对某一数据库下的所有表,以及表下的所有字段()

 3、tables_priv 

  只针对某一张表、以及该表下的所有字段()

 4、columns_priv 

  只针对某一个字段()

例如:如下图,权限表放行权限的范围

mysql.user:针对库db1,db2及其包含的所有
db:只针对库例如db1,及其db1包含的所有
tables_priv:只针对db1.table1,及其该表包含的所有
columns_prive:只针对db1.table1.column1,只放行该字段(列)

在这里插入图片描述

权限相关操作

创建\查询\删除用户

创建用户语法

create user '用户名'@'主机' identified by '密码';

create user 'yang'@'1.1.1.1' identified by '123';
create user 'yang'@'192.168.1.%' identified by '123';
create user 'yang'@'%' identified by '123';

查询用户

mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1       |
|      | db04      |
| root | db04      |
|      | localhost |
| root | localhost |
+------+-----------+

删除用户

mysql> drop user root@'::1';
Query OK, 0 rows affected (0.01 sec)

mysql> drop user ''@db04;
Query OK, 0 rows affected (0.00 sec)

mysql> drop user 'root'@db04;
Query OK, 0 rows affected (0.00 sec)

mysql> drop user ''@localhost;
Query OK, 0 rows affected (0.00 sec)

修改密码

# 方式1
mysqladmin -uroot -p123 password '1'

# 方式2
update mysql.user set password=password('123') where user='root' and host='localhost';

# 方式3
set password=password('1');   修改当前用户的密码

# 方式4
grant all on *.* to 'root'@'localhost' identified by '123';

授权

MySQL 赋予用户权限命令的简单格式可概括为:

grant 权限 on 数据库对象 to 用户

注意:grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。

查看帮助

mysql> help grant

权限:对文件夹,对文件,对文件某一字段的权限

常用权限有:select, insert, update, delete
all可以代表除了grant之外的所有权限

 # MySQL 的 权限,分别可以作用在多个层次上

- 1、所有库的所有表

- 2、单库下的所有表(最常用的授权级别)

- 3、单表下的所有列

- 4、单列权限:企业里称单列授权为 脱敏,即脱离敏感信息,涉及到敏感信息一定要脱敏
例如
授予vip账号对某一表下所有列的查询权限
而授予非vip账号对某一表下的某一列的查询权限
  • 5、针对存储过程的权限

  • 6、针对函数的权限

举例如下

#(1)针对所有库的所有表:*.* (*.*->mysql.user)除了grant权限
grant select on *.* to 'egon'@'%' identified by '123'; 
egon用户对所有库下面的所有表的所有字段(列)有select权限
#查看
select * from mysql.user\G

#(2)针对某一数据库:db.* (db.*->mysql.db)
grant select on db1.* to 'yang'@'%' identified by '123'; 
yang用户对db1库下面的所有表有select权限
# 查看
select * from mysql.db\G


#(3)针对某一个表:db1.t1 (db1.t1->mysql.tables_priv)
grant select on db1.t1 to 'jack'@'%' identified by '123';  
jack用户只能对db1库下面的t1表有select权限
# 查看
select * from mysql.tables_priv\G


#(4)针对某一个字段(列):db1.t3(id)(mysql.tables_priv)
grant select on db1.t3(id) to 'lili'@'%' identified by '123'; 
lili 用户只对db1库下t3表的id列有select 权限

# 查看
select * from mysql.columns_priv\G
mysql> select * from t3;
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | egon1 |   18 |
|    2 | egon2 |   19 |
|    3 | egon3 |   29 |
+------+-------+------+

#注:update权限依赖select权限

grant select (id,name),update (age) on db1.t3 to 'egon4'@'localhost' identified by '123'; 
#可以在tables_priv和columns_priv中看到相应的权限
mysql> select * from tables_priv where user='egon4'\G
*************************** 1. row ***************************
       Host: localhost
         Db: db1
       User: egon4
 Table_name: t3
    Grantor: root@localhost
  Timestamp: 0000-00-00 00:00:00
 Table_priv:
Column_priv: Select,Update
row in set (0.00 sec)

mysql> select * from columns_priv where user='egon4'\G
*************************** 1. row ***************************
       Host: localhost
         Db: db1
       User: egon4
 Table_name: t3
Column_name: id
  Timestamp: 0000-00-00 00:00:00
Column_priv: Select
*************************** 2. row ***************************
       Host: localhost
         Db: db1
       User: egon4
 Table_name: t3
Column_name: name
  Timestamp: 0000-00-00 00:00:00
Column_priv: Select
*************************** 3. row ***************************
       Host: localhost
         Db: db1
       User: egon4
 Table_name: t3
Column_name: age
  Timestamp: 0000-00-00 00:00:00
Column_priv: Update
rows in set (0.00 sec)

#(5)作用在存储过程(procedure)上:
# execute:执行权限
use db1;

delimiter //
create procedure p1()
BEGIN
    select * from blog;
    INSERT into blog(name,sub_time) values("xxx",now());
END //
delimiter ;

show procedure status; -- 查看到db1下有一个名为p1的存储过程 

grant execute on procedure db1.p1 to 'dba'@'localhost';


#(6)作用在函数上:
delimiter //
create function f1(
    i1 int,
    i2 int)
returns int
BEGIN
    declare num int;
    set num = i1 + i2;
    return(num);
END //
delimiter ;

show function status; -- 查看到db1下有一个名为f1的函数

grant execute on function db1.f1 to 'dba'@'localhost';

测试:
[root@localhost ~]# mysql -udba -p
mysql> select db1.f1(1,2);

all可以代表除了grant之外的所有权限,可以用with带上grant,授权一个超级管理员

grant all on *.* to yang@'%' identified by '123' with grant option;
查看mysql.user表中可以查到egon用户的grant权限也被设置为Y
#查看
select * from mysql.user\G

查看授权

#1.授权:
mysql> grant all on *.* to root@'%' identified by '123';

#2.查看用户权限
查看当前用户(自己)权限:
mysql> show grants;

查看其他 MySQL 用户权限:
mysql> show grants for root@'%';

回收权限

revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:

grant  all on *.* to   dba@localhost;
revoke all on *.* from dba@localhost;
revoke select on db1.* from 'egon'@'%';

扩展授权

max_queries_per_hour:一个用户每小时可发出的查询数量
max_updates_per_hour:一个用户每小时可发出的更新数量
max_connections_per_hour:一个用户每小时可连接到服务器的次数
max_user_connections:允许同时连接数量

mysql> grant all on *.* to test@'%' identified by '123' with max_user_connections 2;
# 同时只能远程连接2个进来
# 测试:
mysql -utest -p123 -h192.168.15.100

不要用-hlocalhost,它代表通过本地套接字链接

针对不同角色权限分配

针对普通用户

grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。

grant select on testdb.* to common_user@'%'
grant insert on testdb.* to common_user@'%'
grant update on testdb.* to common_user@'%'
grant delete on testdb.* to common_user@'%'

或者,用一条 MySQL 命令来替代:

grant select, insert, update, delete on testdb.* to common_user@'%'
针对开发人员

grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限,具体操作如下

1、grant 创建、修改、删除 MySQL 数据表结构权限。

grant create on testdb.* to developer@'192.168.0.%';
grant alter  on testdb.* to developer@'192.168.0.%';
grant drop   on testdb.* to developer@'192.168.0.%';

2、grant 操作 MySQL 外键权限。

grant references on testdb.* to developer@'192.168.0.%';  #外键权限references

3、grant 操作 MySQL 临时表权限。

grant create temporary tables on testdb.* to developer@'192.168.0.%'; #临时表权限temporary

4、grant 操作 MySQL 索引权限。

grant index on testdb.* to developer@'192.168.0.%';    #普通索引权限index

5、grant 操作 MySQL 视图、查看视图源代码 权限。

grant create view on testdb.* to developer@'192.168.0.%';

grant show view on testdb.* to developer@'192.168.0.%';

6、grant 操作 MySQL 存储过程、函数 权限。

grant create routine on testdb.* to developer@'192.168.0.%'; -- now, can show procedure status

grant alter  routine on testdb.* to developer@'192.168.0.%'; -- now, you can drop a procedure

grant execute        on testdb.* to developer@'192.168.0.%';
针对普通DBA

grant 普通 DBA 管理某个 MySQL 数据库的权限。

grant all privileges on testdb.* to dba@'localhost'

其中,关键字 “privileges” 可以省略。

针对高级DBA

grant 高级 DBA 管理 MySQL 中所有数据库的权限。

grant all on *.* to dba@'localhost'

在企业中权限的设定

#开发人员说:请给我开一个用户

#1.首先进行沟通
	1.你需要对哪些库、表进行操作
	2.你从哪里连接过来
	3.用户名有没有要求
	4.密码要求
	5.你要使用多长时间
	6.发邮件

#2.一般给开发创建用户权限,建议不给delete权限
grant select,update,delete,insert on *.* to egon@'10.0.0.%'' identified by '123';

#3.注意:
开发图方便想要root用户,这玩意,谁给谁背锅,自己斟酌,可以考虑让部门老大来给

两种登录数据库方式

mysql -uroot -p -h服务端的ip地址(走tcp协议)
mysql -uroot -p -S /var/lib/mysql/mysql.sock(通过套接字连接)

破解密码

linux平台

方法一:不推荐

[root@egon ~]# rm -rf /var/lib/mysql/mysql  # 所有授权信息全部丢失!!!
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql

方法二:启动时,跳过授权库

[root@egon ~]# vim /etc/my.cnf    #mysql主配置文件
[mysqld]
skip-grant-table

[root@egon ~]# systemctl restart mariadb

[root@egon ~]# mysql
MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> \q

[root@egon ~]# #打开/etc/my.cnf去掉skip-grant-table,然后重启
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql -u root -p123  # 以新密码登录

方法三:

# 1、先关闭数据库服务
方式一
systemctl stop mysql
方式二
mysqladmin -uroot -p123 -S /tmp/mysql.sock shutdown

# 2、跳过授权表启动mysql
mysqld_safe --skip-grant-tables --skip-networking &

ps:还需要跳过网络,否则在操作过程中很不安全

# 3、登录并修改密码
[root@egon ~]# mysql
MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> \q

# 4、重启服务
systemctl start mysql

# 5、用修改后的密码登录即可

windows平台

5.7版本mysql
方式一

#1 关闭mysql
#2 在cmd中执行:mysqld --skip-grant-tables
#3 在cmd中执行:mysql
#4 执行如下sql:
update mysql.user set authentication_string=password('') where user = 'root';
flush privileges;

#5 tskill mysqld #或taskkill -f /PID 7832
#6 重新启动mysql

方式二

#1. 关闭mysql,可以用tskill mysqld将其杀死
#2. 在解压目录下,新建mysql配置文件my.ini
#3. my.ini内容,指定
[mysqld]
skip-grant-tables

#4.启动mysqld
#5.在cmd里直接输入mysql登录,然后操作
update mysql.user set authentication_string=password('') where user='root and host='localhost';

flush privileges;

#6.注释my.ini中的skip-grant-tables,然后启动myqsld,然后就可以以新密码登录了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要为MySQL数据库用户授权登录密码,可以按照以下步骤进行操作: 1. 以管理员身份登录MySQL服务器。可以使用以下命令登录: ``` mysql -u root -p ``` 这将要求你输入管理员密码。 2. 登录成功后,使用以下命令授权用户可以通过密码登录: ``` ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; ``` 将 `username` 替换为要授权的用户名,`localhost` 替换为连接主机的地址,`password` 替换为该用户登录密码。 3. 如果你要授权的是管理员账号的密码,可以使用以下命令: ``` ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; ``` 将 `password` 替换为管理员账号的登录密码。 4. 授予用户访问和管理数据库权限。可以使用以下命令为用户授予权限: ``` GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost'; ``` 将 `database_name` 替换为要授权给用户数据库名称,`username` 替换为要授权的用户名,`localhost` 替换为连接主机的地址。 5. 刷新权限使更改生效: ``` FLUSH PRIVILEGES; ``` 这将确保授权立即生效。 请注意,以上命令假设你已经具有足够的权限来进行这些操作。如果你没有足够的权限,请联系具有管理员权限用户来执行这些操作。另外,授权用户权限应根据需要进行适当的调整,以确保安全性和最小权限原则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琴声浮或沉__听懂只一人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值