一说

前情提示

系统:

MySQL5.6权限相关,赋予某用户,某数据库,某主机,某具体权限。

前情提示

MySQL5.6;阿里云/腾讯云;

以下在5.6,8.0.20测试均可;

题外话

为啥写这个?一劳永逸不香吗?说实在的,我也不知道。但是我身边的数据库比特币勒索时间已经有两起了。最奇怪的是都是亚马逊MySQL服务器。

使用root登录MySQL

  1. 先用xshell等工具远程登录服务器。
  2. 用root用户登录MySQL。
1
2
mysql -u root -p
输入密码

查询有哪些用户:select user,host from mysql.user;

在这里插入图片描述

创建超级远程登录用户

此账号,指定IP,可以操作所有数据库。

创建数据库

1
2
3
#create database mytest1 character set utf8;
create database `mytest1` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
#create database `mytest1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

创建用户并授权

1
2
3
4
5
CREATE USER 'dev-super'@'localhost' IDENTIFIED BY 'Www.pusdn.com';
GRANT ALL PRIVILEGES ON *.* TO 'dev-super'@'localhost';
CREATE USER 'dev-super'@'36.113.10.210' IDENTIFIED BY 'Www.pusdn.com';
GRANT ALL PRIVILEGES ON *.* TO 'dev-super'@'36.113.10.210';
FLUSH PRIVILEGES;

创建新用户

1
2
3
4
5
#CREATE USER 'mytest1'@'localhost' IDENTIFIED BY 'Www.pusdn.com';

其中 '%'代表对使用所有主机都可以访问;
'localhost' 代表只有本机才能访问,也可指定固定IP主机才能访问,格式为 '192.222.1.33'
这个时候访问mysql,是除了默认生成的两个数据库,看不到任何其它的数据库。

修改ROOT密码

1
2
3
4
5
6
7
if m_version.find('5.7') == 0  or m_version.find('8.0') == 0 or m_version.find('10.4.') != -1:
panelMysql.panelMysql().execute("UPDATE mysql.user SET authentication_string='' WHERE user='root'")
panelMysql.panelMysql().execute("ALTER USER 'root'@'localhost' IDENTIFIED BY '%s'" % password)
panelMysql.panelMysql().execute("ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY '%s'" % password)
else:
result = mysql_obj.execute("update mysql.user set Password=password('" + password + "') where User='root'")
mysql_obj.execute("flush privileges")

修改用户密码

1
2
3
4
5
6
7
8
高版本5.7,8.0:
update mysql.user set authentication_string='' where User='username';
ALTER USER `username`@`localhost` IDENTIFIED BY 'newpassword';
ALTER USER `username`@`host` IDENTIFIED BY 'newpassword';
flush privileges;
低版本:
update mysql.user set Password=password('newpassword') where User='username'
flush privileges;

备份

1
/www/server/mysql/bin/mysqldump --default-character-set="+ public.get_database_character(name) +" --force --opt \"" + name + "\" | gzip > " + backupName

查看用户信息

1
2
3
4
select distinct * from (select user.Host,user.User,db.Db,user.Password,user.Drop_priv,user.Grant_priv,user.Alter_priv from db inner JOIN user on db.user=user.user) as it where user='xxxx';

select * from mysql.user where user = 'dev-super'\G
select user,host from mysql.user where user = 'dev-super';

删除用户

1
2
3
4
5
6
7
drop user 'dev-super'@'36.113.10.210';
drop user 'dev-super'@'localhost';
flush privileges;

#此删除不会删除权限相关
#Delete FROM mysql.user Where User='dev-super';
#flush privileges;

创建开发者远程账号

多个指定IP,指定数据库,所有权限。如果可以的话,可以更细分数据库权限。

我实在想不通,为啥有很多大厂出现出现删库,按理说权限分工不应该很明确吗?而且都有备份!另一方面,程序员素质也是要有的。

创建数据库

1
create database `xjgys` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

创建用户并授权

1
2
3
4
5
CREATE USER 'dev-xjgys'@'localhost' IDENTIFIED BY 'Www.pusdn.com';
GRANT ALL PRIVILEGES ON xjgys.* TO 'dev-xjgys'@'localhost';
CREATE USER 'dev-xjgys'@'36.113.10.210' IDENTIFIED BY 'Www.pusdn.com';
GRANT ALL PRIVILEGES ON xjgys.* TO 'dev-xjgys'@'36.113.10.210';
FLUSH PRIVILEGES;

云控制台端口限制

腾讯云:

出站默认全部。

入站,这里主要限制下3306指定IP访问。

在这里插入图片描述

阿里云:

通过Navicat客户端操作

使用dev-super,远程登录,新建库,新建用户,赋予权限。

在这里插入图片描述

1
2
3
4
5
6
7
8
全表:
CREATE USER `wclz`@`36.113.10.210` IDENTIFIED BY 'Wocaleiga$$_';

GRANT Alter, Alter Routine, Create, Create Routine, Create Temporary Tables, Create View, Delete, Drop, Event, Execute, Grant Option, Index, Insert, Lock Tables, References, Select, Show View, Trigger, Update ON `wclz`.* TO `wclz`@`36.113.10.210`;

单表:
CREATE USER `wclg`@`36.113.10.210` IDENTIFIED BY 'Wocaleiga$$_';
GRANT Create ON TABLE `wclz`.`student` TO `wclg`@`36.113.10.210`;

猜想:

1
2
3
4
5
简单说下,with grant options可能会赋予server权限,即创建其他子账号,这里采用shell,127,root进行创建。Navicat登录账号dev-super没有server权限。
即在创建用户,如下:
CREATE USER 'dev-super'@'36.113.10.210' IDENTIFIED BY 'Www.pusdn.com';
GRANT ALL PRIVILEGES ON *.* TO 'dev-super'@'36.113.10.210' WITH GRANT OPTION;
FLUSH PRIVILEGES;

在这里插入图片描述

增加日志

额外:

腾讯云安全组设置:https://cloud.tencent.com/document/product/213/34601

其他问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
无法创建表或者设计表,提示access denied,you need at least one of the process privileges for this operation.

drop user 'dev-ccga'@'localhost';
drop user 'dev-ccga'@'36.113.33.86';
drop user 'dev-ccga'@'219.143.174.166';
drop user 'dev-ccga'@'1.202.112.96';
FLUSH PRIVILEGES;



show grants for 'dev-ccga'@'localhost';

小问题解决:
GRANT Process ON *.* TO `dev-ccga`@`219.143.174.166`;
FLUSH PRIVILEGES;