参考链接:

1.概述

1.1.主机

Host:主机名,双主键之一,值为%时表示匹配所有主机。User:用户名,双主键之一。Password:密码名。

Host User Password
% domain_check *55B565DA3839E5955A68EA96EB735
localhost domain_check *55B565DA3839E5955A68EA96EB735
127.0.0.1 domain_check *55B565DA3839E5955A68EA96EB735
126.26.98.25 domain_check *55B565DA3839E5955A68EA96EB735
localhost
::1 root *26C378D308851D5C717C13623EFD6
localhost root *26C378D308851D5C717C13623EFD6
127.0.0.1 root *26C378D308851D5C717C13623EFD6
  • (root,%),表示可以远程登录,并且是除服务器外的其他任何终端,%表示任意IP都可登录。
  • (root,localhost), 表示可以本地登录,即可以在服务器上登陆,localhost则只允许本地登录。
  • (root,127.0.0.1 ),表示可以本机登陆,即可以在服务器上登陆
  • (root,sv01),表示主机名为sv1可以登陆,sv01具体指的哪台机器,可以在cat /etc/hostname查看
  • (root,::1) , 表示本机可以登陆, 看密码都是相同嘛,具体::1代表意义,待查

1.2.加密插件

推荐使用:caching_sha2_password>sha256_password>mysql_native_password

加密插件:执行本地身份验证的插件;在MySQL中引入可插入身份验证之前使用的基于密码哈希方法的身份验证。

参考链接:

  1. mysql_native_password
    • 基于本机密码哈希方法实现身份验证。
    • 基于较旧的(4.1之前的)密码哈希方法实现本机身份验证(现已弃用)。
    • 新帐户默认使用本机身份验证 ,除非在服务器启动时在配置文件设置 —default-authentication-plugin 选项。
  2. sha256_password
    • 使用SHA-256密码哈希执行身份验证的插件。
    • 该插件为用户帐户密码实现SHA-256哈希,与本地身份验证相比,这是更强大的加密。
    • “ sha256 ”是指插件用于加密的256位摘要长度。
    • “ sha2 ” 更笼统地指SHA-2类加密算法,其中256位加密是其中的一种实例。
  3. caching_sha2_password
    • 实现SHA-256身份验证(如sha256_password),但是在服务器端使用缓存以获得更好的性能,并具有其他功能以提高适用性。

1.3.密码过期策略

不用设置,麻烦。

参考策略:

1.4.用户权限

参考链接:

  1. usage
    • 连接(登陆)权限,建立一个用户,就会自动授予其usage权限(默认授予)。
    • grant usage on *.* to 'p1'@'localhost' identified by '123';
    • 该权限只能用于数据库登陆,不能执行任何操作;且usage权限不能被回收,也即REVOKE用户并不能删除用户。
  2. select
    • 必须有select的权限,才可以使用select table
    • grant select on pyt.* to 'p1'@'localhost';
    • select * from shop;
  3. create
    • 必须有create的权限,才可以使用create table
    • grant create on pyt.* to 'p1'@'localhost';
  4. create routine
    • 必须具有create routine的权限,才可以使用{create |alter|drop} {procedure|function}
    • grant create routine on pyt.* to 'p1'@'localhost';
    • 当授予create routine时,自动授予EXECUTE, ALTER ROUTINE权限给它的创建者:
    • show grants for 'p1'@'localhost';
  5. create temporary tables(注意这里是tables,不是table)
    1. 必须有create temporary tables的权限,才可以使用create temporary tables.
    2. grant create temporary tables on pyt.* to 'p1'@'localhost';
    3. mysql -h localhost -u p1 -p pyt
    4. create temporary table tt1(id int);
  6. create view
    1. 必须有create view的权限,才可以使用create view
    2. grant create view on pyt.* to 'p1'@'localhost';
    3. create view v_shop as select price from shop;
  7. create user
    1. 要使用CREATE USER,必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。
    2. grant create user on *.* to 'p1'@'localhost';
    3. grant insert on *.* to p1@localhost;
  8. insert
    1. 必须有insert的权限,才可以使用insert into ….. values….
  9. alter
    1. 必须有alter的权限,才可以使用alter table
    2. alter table shop modify dealer char(15);
  10. alter routine
    1. 必须具有alter routine的权限,才可以使用{alter |drop} {procedure|function}
    2. grant alter routine on pyt.* to 'p1'@'localhost';
    3. drop procedure pro_shop;->Query OK, 0 rows affected (0.00 sec)
    4. revoke alter routine on pyt.* from 'p1'@'localhost';
    5. mysql -h localhost -u p1 -p pyt
    6. drop procedure pro_shop;->ERROR 1370 (42000): alter routine command denied to user ‘p1′@’localhost’ for routine ‘pyt.pro_shop’
  11. update
    1. 必须有update的权限,才可以使用update table
    2. update shop set price=3.5 where article=0001 and dealer='A';
  12. delete
    1. 必须有delete的权限,才可以使用delete from ….where….(删除表中的记录)
  13. drop
    1. 必须有drop的权限,才可以使用drop database db_name; drop table tab_name;
    2. drop view vi_name;
    3. drop index in_name;
  14. show database
    1. 通过show database只能看到你拥有的某些权限的数据库,除非你拥有全局SHOW DATABASES权限。
    2. 对于p1@localhost用户来说,没有对mysql数据库的权限,所以以此身份登陆查询时,无法看到mysql数据库:
  15. show view
    1. 必须拥有show view权限,才能执行show create view。
    2. grant show view on pyt.* to p1@localhost;
    3. show create view v_shop;
  16. index
    1. 必须拥有index权限,才能执行[create |drop] index
    2. grant index on pyt.* to p1@localhost;
    3. create index ix_shop on shop(article);
    4. drop index ix_shop on shop;
  17. excute
    1. 执行存在的Functions,Procedures
    2. call pro_shop1(0001,@a);
    3. select @a;
  18. lock tables
    1. 必须拥有lock tables权限,才可以使用lock tables
    2. grant lock tables on pyt.* to p1@localhost;
    3. lock tables a1 read;
    4. unlock tables;
  19. references
    1. 有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。
  20. reload
    1. 必须拥有reload权限,才可以执行flush [tables | logs | privileges]
    2. grant reload on pyt.* to p1@localhost;->ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
    3. grant reload on *.* to 'p1'@'localhost';->Query OK, 0 rows affected (0.00 sec)
    4. flush tables;
  21. replication client
    1. 拥有此权限可以查询master server、slave server状态。
    2. show master status;->ERROR 1227 (42000): Access denied; you need the SUPER,REPLICATION CLIENT privilege for this operation
    3. grant Replication client on *.* to p1@localhost;
    4. grant super on *.* to p1@localhost;
    5. show master status;
    6. show slave status;
  22. replication slave
    1. 拥有此权限可以查看从服务器,从主服务器读取二进制日志。
    2. show slave hosts;->ERROR 1227 (42000): Access denied; you need the REPLICATION SLAVE privilege for this operation
    3. show binlog events;->ERROR 1227 (42000): Access denied; you need the REPLICATION SLAVE privilege for this operation
    4. grant replication slave on *.* to p1@localhost;
    5. show slave hosts;->Empty set (0.00 sec)
    6. show binlog events;
  23. Shutdown
    1. 关闭MySQL:mysqladmin shutdown
    2. 重新连接:
      1. mysql -uss -p ->ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
      2. cd /u01/mysql/bin
      3. ./mysqld_safe &
      4. mysql
  24. grant option
    1. 拥有grant option,就可以将自己拥有的权限授予其他用户(仅限于自己已经拥有的权限)
    2. grant Grant option on pyt.* to p1@localhost;
    3. grant select on pyt.* to p2@localhost;
  25. file
    1. 拥有file权限才可以执行 select ..into outfile和load data infile…操作
    2. 但是不要把file, process, super权限授予管理员以外的账号,这样存在严重的安全隐患。
    3. grant file on *.* to p1@localhost;
    4. load data infile ‘/home/mysql/pet.txt’ into table pet;
  26. super
    1. 这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。
    2. grant super on *.* to p1@localhost;
    3. purge master logs before 'mysql-bin.000006';
  27. process
    1. 通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。
    2. 默认情况下,每个用户都可以执行SHOW PROCESSLIST命令,但是只能查询本用户的进程。
    3. show processlist;

另外,
管理权限(如 super, process, file等)不能够指定某个数据库,on后面必须跟.
mysql> grant super on pyt. to p1@localhost;
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
mysql> grant super on
.* to p1@localhost;
Query OK, 0 rows affected (0.01 sec)

2.实践

2.1.创建只能管理某表的用户

  1. create database halodb character set utf8mb4 collate utf8mb4_bin;
  2. CREATE USER `halodb`@`%` IDENTIFIED WITH sha256_password BY 'halodb';
  3. GRANT Alter, Alter Routine, Create, Create Routine, Create Temporary Tables, Create View, Delete, Drop, Event, Execute, Index, Insert, Lock Tables, References, Select, Show View, Trigger, Update ON `halodb`.* TO `halodb`@`%`;
  4. GRANT Process ON *.* TO `halodb`@`%`;
  5. # GRANT Select ON TABLE `mysql`.`user` TO `halodb`@`%`;
  6. # GRANT Show View ON TABLE `mysql`.`user` TO `halodb`@`%`;
  7. # GRANT Select, Show View ON TABLE `mysql`.`user` TO `halodb`@`%`;
  8. # GRANT Select ON *.* TO `halodb`@`%`;

2.3.一个用户多IP

因为用户表中host和user共同组成主键,所以多IP只要多几条记录即可:
image.png

2.2.宝塔创建库