安全排查

MySQL8:查看当前有多少用户以及权限如何

MariaDB也支持此SQL

SELECT user, host, plugin, authentication_string FROM mysql.user;

创建、授权、删除、查看用户权限

注意:所有操作都要执行 flush privileges; 以刷新权限,不然设置的权限操作会不起作用。

第一步:创建用户,成功返回OK

格式:CREATE USER 'username'@'host' IDENTIFIED BY 'password';

username:用户名
host:允许登录的IPV4地址,%代表不限制任何IP
passwor:密码

没有权限会提示:Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation

create user 'wordpress'@'%' IDENTIFIED BY 'wordpressPass';

-- 这里我设置的账号是wordpress,登录的host设置的是%,也就是允许所有人登录,密码是wordpressPass

第二步:对用户进行授权,成功返回OK

格式:GRANT privileges ON databaseName.tableName TO 'username'@'host'

privileges:权限的类型如SELECT,INSERT,UPDATE,Create,Drop等,如果要授予所的权限则使用all privileges
databaseName:库名。如果想全表用*
tableName: 表名。如果想全表 用* 
host:IPV4地址。如果想用全ip 用%代替

你可能会遇到:You are not allowed to create a user with GRANT; 这个意思就是不允许隐式创建用户。白话就是:没有这个用户。看看username存不存在,再看看username与host对不对应。

GRANT all privileges ON wp.* TO 'wordpress'@'%';
flush privileges;

-- 本SQL是给'wordpress'@'%'用户设置:拥有wp库中所有表的全部权限!

第三步:撤销权限,成功返回OK

格式:REVOKE privilege ON databasename.tablename FROM 'username'@'host';

如果'username'@'host'没有此权限,就会提示There is no such grant defined for user 'XXX' on host 'XXX'

REVOKE CREATE ON wp.* FROM 'wordpress'@'%';
flush privileges;
-- 本SQL是移除'wordpress'@'%'用户在wp库所有的Create能力。请保证用户具有此权限

第四步:删除用户:成功返回OK

格式:DROP USER 'username'@'host'; 

操作失败会提示:Operation DROP USER failed for 'zhangsan'@'%'

DROP USER 'wordpress'@'%';

-- 本SQL是删除'wordpress'@'%'用户

第五步:查看用户所拥有的权限

格式:show grants for 'username'@'host';
show grants for 'wordpress'@'%';
GRANT USAGE ON *.* TO `wordpress`@`%`      这个意思是可以使用所有表
GRANT ALL PRIVILEGES ON `wp`.* TO `wordpress`@`%`      这个意思是拥有ALL PRIVILEGES

查看X库可以被哪些用户拥有的权限

select * from mysql.db where Db="sys";
输出的内容太长,我只拿出重要的截图

Y代表有权限,N代表无权限

这个输出的意思是:zhangsan@localhost拥有sys表的查询、插入、更新、删除等权限。

开启XX账号 远程登录

方式一:直接修改user表,不推荐!

不推荐这个方式,这个方式会有隐藏问题,比如我原来是root@localhost,现在修改为root@192.168.1.1,mysql的user表只展示最新的账户也就是root@192.168.1.1,我将来要删除用户的时候,删除root@localhost也是可也删除的,尽管user表没有root@localhost(此时应该是drop user的触发器,会执行删除账号的所有权限)。如果不执行 drop user root@localhost就会造成原来root@localhost权限没有转给root@192.168.1.1。root@localhost原来的表还保留着root@localhost被删除前所拥有的权限。如果我们创建之前同名的账户,新账户就拥有老同名同host的权限了!造成:死去的记忆突然攻击我!

# 确定用户权限 格式show grants for 'username'@'host';
如:show grants for 'root'@'localhost';

# 使用mysql数据库
USE mysql;

# 设定用户zhangsan可以远程登录
update user set host='%' where user='zhansan';

# 给用户zhangsan所有权限
GRANT ALL privileges on *.* to 'zhannsan'@'%' ;
不允许使用GRANT命令隐式创建用户的。也就是说你当前可能没有zhansan用户或zhansan用户的host不为%,修改一下改用户的host字段即可!

# 最后要执行权限刷新
flush privileges;

方式二:创建新的账号,对新账号进行授权

创建新的账号,然后再对新账号进行授权!

GRANT本身拥有创建用户的权利,但是我们升级MySQL不同会造成语法不支持的场景,干脆拆开隐式创建账号的方式,一步步创建账号。

create user 'wordpress'@'%' IDENTIFIED BY 'wordpressPass';
GRANT all privileges ON wp.* TO 'wordpress'@'%';
flush privileges;

修改MySQL账号密码

修改密码(建议将 用户名 Host 用双引号引起来)

格式

第一步:选择数据库
use mysql;

第二步:执行修改命令
SET PASSWORD FOR "用户名"@"HOST" = password("新密码");  或者
SET PASSWORD FOR "用户名" @"HOST" = password("新密码"); 
 
或者
ALTER USER 'username'@'localhost' IDENTIFIED BY 'new_password';

请注意,如果您使用的是 MySQL 8.0.11 或更高版本,则需要使用以下命令:
ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';

第三步:执行刷新权限修改才会生效
flush privileges;

MySQL修改密码示例

示例:
use mysql;

SET PASSWORD FOR "zhangsan" @"localhost" = password("zhangsan123"); 
或者其他版本的修改密码语句

flush privileges;

Windows忘记MySQL密码补救(共4步)

第一步:暂停MySQL服务

第二步:修改配置文件

当Mysql服务为 已停止 前往修改配置文件:mysql.ini 文件

C:\ProgramData\MySQL\MySQL Server 5.7
注意:ProgramData 是隐藏文件夹。需要自行勾文件夹显示隐藏文件夹

打开此配置文件,找到[mysqlid] 在下面随便开启一行 填写

skip-grant-tables

第三步:启动mysql服务 并执行修改超管密码的命令

保存文件,去任务管理器 -启动mysql服务

使用命令行,输入

mysql -uroot -p
可以直接绕过Mysql的密码检测,直接登录Mysql CMD界面

选择Mysql表中mysql数据库

use mysql

执行代码

//Mysql 5.7 之前
update user  set Password=password('new-password') where user='root'

//Mysql 5.7(Mysql8 可能也会有变化)
update user  set authentication_string=password('new-password') where user='root'

//MariaDB
set password for 'USER'@'HOST'=password('new-password');

第四步:撤销修改的配置文件,重启mysql服务

去除Mysql.ini 中[mysqlid] 下追加的 skip-grant-tables

重启Mysql服务:

完成!重新登录Mysql 试试吧!

特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤