MySQL支持用户名@白名单
的方式连接,有以下几种方式:
链接方式 | 描述 | 备注 |
---|---|---|
wordpress@'10.0.0.%' |
只允许10网段连接 | 常用 |
wordpress@'%' |
所有地址 | |
wordpress@'10.0.0.200' |
只允许某一个地址链接 | |
wordpress@'localhost' |
只允许本地连接 | |
wordpress@'db03' |
只允许别名是db03 连接 |
|
wordpress@'10.0.0.5%' |
只允许IP地址末尾51~59 的连接 |
|
wordpress@'10.0.0/255.255.254.0' |
只允许254这个网段的连接 |
白名单用户管理操作:
mysql> create user zhangkai@'localhost' identified by '123'; Query OK, 0 rows affected (0.00 sec) mysql> select user,host from mysql.user; +---------------+-----------+ | user | host | +---------------+-----------+ | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | | zhangkai | localhost | +---------------+-----------+ 4 rows in set (0.00 sec) mysql> alter user zhangkai@'localhost' identified by '1234'; Query OK, 0 rows affected (0.00 sec) mysql> drop user zhangkai@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> select user,host from mysql.user; +---------------+-----------+ | user | host | +---------------+-----------+ | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-----------+ 3 rows in set (0.00 sec)
上面示例演示了白名单用户的增删改查的操作。不过这个白名单用户仅能用来登录到MySQL,权限有限!
ALL: SELECT,INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE ALL : 以上所有权限,一般是普通管理员拥有的 with grant option:超级管理员才具备的,给别的用户授权的功能
mysql> grant all on database_name.* to zhangkai@'localhost' identified by '123'; -- grant:授权命令 -- all:权限 -- on:为什么对象设置权限 -- database_name.*:database_name库下的所有表;需要注意的是,database_name库如果不存在,该语句也能执行 -- zhangkai@'localhost':指定的用户 -- 修改权限还是使用grant命令来做,grant命令可以反复使用
一般的,应用用户的权限应该是有限的,常用的也就是select insert update delete
。
PS:在MySQL8.0之后,grant
命令有了新特性:
grant
命令不再支持创建用户,也不支持修改密码也就是,以后创建用户和授权操作要分开来做。
另外,权限范围有几种写法:
权限 | 描述 | 备注 |
---|---|---|
*.* |
所有库下的所有表,使用与管理员用户 | |
wordpress.* |
指定库下的所有表,适用于开发和应用用户 | |
wordpress.t1 |
指定库下的指定表,用的不多 |
-- 查看用户权限 show grants for zhangkai@'localhost'; -- 回收权限 revoke delete,drop on database@table from zhangkai@'localhost';
关于查看用户权限,需要补充一些内容
create user root@'%' identified by '123'
创建的用户,仅能用来登录MySQL,别的啥也干不了。mysql> show grants for root@'192.168.85.%'; +---------------------------------------------+ | Grants for root@192.168.85.% | +---------------------------------------------+ | GRANT USAGE ON *.* TO 'root'@'192.168.85.%' | +---------------------------------------------+ 1 row in set (0.00 sec)
正如上例的关键字USAGE
表示该用户只有登录MySQL权限。想要别的权限,需要自己用有grant
权限的账号为该账号授权,因为这个账号此时也没有授权这个权限
WITH GRANT OPTION
,当你查看权限时,发现账号拥有ALL
权限外,还有WITH GRANT OPTION
权限。mysql> show grants for root@'localhost'; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+ 2 rows in set (0.00 sec)
WITH GRANT OPTION
表示该用户可以将自己拥有的权限授权给别人。
注意,如果在授权时没有加WITH GRANT OPTION
参数,就表示该账户的权限只能自己用,而不能赋予别人,所以你在授权时要考虑好加不加WITH GRANT OPTION
参数。
grant all on *.* to root@'%' identified by '123'; grant all on *.* to root@'%' identified by '123' with grant option;
也就是,上面两条命令你要事情况而选择
解决思路是:
mysqld_safe
模式启动,即关闭MySQL的用户密码验证模块,也就是不加载授权表,然后禁止远程连接,仅能通过本地socket链接
流程:
[root@cs mysql]# systemctl stop mysqld [root@cs mysql]# mysqld_safe --skip-grant-tables --skip-networking & [root@cs mysql]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.20 MySQL Community Server (GPL) Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> alter user root@'localhost' identified by '123'; Query OK, 0 rows affected (0.00 sec) mysql> exit; Bye [root@cs mysql]# pkill mysqld [root@cs mysql]# systemctl start mysqld
相关参数解释
--skip-grant-tables
:关闭授权表,这样就可以无验证登录了。--skip-networking
:关闭TCP/IP,该参数的目的是只能本地通过socket连接登录,保证修改密码时的安全性。&
是后台执行。flush privileges
操作是因为修改密码还是要使用授权表,但是由于mysqld_safe
模式启动授权表没有从磁盘加载到内存,所以直接执行alter
命令会失败,所以要使用flush privileges
命令将授权表加载到内存中,才能修改密码成功