五: Mysql权限管理

# 权限管理

关于MySQL的权限简单的理解就是MySQL允许你做你权力以内的事情,不可以越界。比如只允许你执行SELECT操
作, 那么你就不能执行UPDATE操作。只允许你从某台机器上连接MySQL,那么你就不能从除那台机器以外的其他
机器连接MySQL.

1 权限列表

MySQL到底都有哪些权限呢?

mysql> show privileges;

image-20220124225328308

(1) CREATE和DROP权限 ,可以创建新的数据库和表,或删除(移掉)已有的数据库和表。如果将 MySQL数据库中的DROP权限授予某用户,用户就可以删除MySQL访问权限保存的数据库。

(2) SELECT、INSERT、UPDATE和DELETE权限 允许在一个数据库现有的表上实施操作。

(3) SELECT权限 只有在它们真正从一个表中检索行时才被用到。

(4) INDEX权限 允许创建或删除索引,INDEX适用于已 有的表。如果具有某个表的CREATE权限,就可以在CREATE TABLE语句中包括索引定义。

(5) ALTER权 限 可以使用ALTER TABLE来更改表的结构和重新命名表。

(6) CREATE ROUTINE权限 用来创建保存的 程序(函数和程序),ALTER ROUTINE权限用来更改和删除保存的程序, EXECUTE权限 用来执行保存的 程序。

(7) GRANT权限 允许授权给其他用户,可用于数据库、表和保存的程序。

(8) FILE权限 使用 户可以使用LOAD DATA INFILE和SELECT ... INTO OUTFILE语句读或写服务器上的文件,任何被授予FILE权 限的用户都能读或写MySQL服务器上的任何文件(说明用户可以读任何数据库目录下的文件,因为服务 器可以访问这些文件)。

权限分布 可能的设置的权限
表权限 SELECT INSERT UPDATE DELETE CREATE DROP GRANT References Index Alter
列权限 SELECT INSERT UPDATE References
过程权限 Execute 'Alter Routine' Grant

2. 授予权限的原则

权限控制主要是出于安全因素,因此需要遵循以下几个 经验原则 :

1、只授予能 满足需要的最小权限 ,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可 以了,不要给用户赋予update、insert或者delete权限。

2、创建用户的时候 限制用户的登录主机 ,一般是限制成指定IP或者内网IP段。

3、为每个用户 设置满足密码复杂度的密码

4、 定期清理不需要的用户 ,回收权限或者删除用户。

3 授予权限

给用户授权的方式有 2 种,分别是通过把 角色赋予用户给用户授权 和 直接给用户授权 。用户是数据库的 使用者,我们可以通过给用户授予访问数据库中资源的权限,来控制使用者对数据库的访问,消除安全 隐患。

授权命令:

GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’];

该权限如果发现没有该用户,则会直接新建一个用户。

比如:

1.给li4用户用本地命令行方式,授予atguigudb这个库下的所有表的插删改查的权限

GRANT SELECT,INSERT,DELETE,UPDATE ON atguigudb.* TO li4@localhost ;

2.授予通过网络方式登录的joe用户 ,对所有库所有表的全部权限,密码设为123。注意这里唯独不包 括grant的权限

GRANT ALL PRIVILEGES ON *.* TO joe@'%' IDENTIFIED BY '123';
  • ALL PRIVILEGES 是表示所有权限,你也可以使用SELECT、UPDATE等权限.
  • ON用来指定权限针对哪些库和表。
  • .中前面的*号用来指定数据库名,后面的*号用来指定表名。这里的*表示所有的。
  • TO表示将权限赋予某个用户。
  • li4@'localhost' 表示li4用户,@后面接限制的主机,可以是Ip、Ip段、域名以及%,%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%, 允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。
  • IDENTIFIED BY 指定用户的登录密码。

如果需要授予包括GRANT的权限,添加参数WITH GRANT OPTION这个选项即可,表示该用户可以将自己拥有的权限授权给别人。经常有人在创建操作用户时候不指定WITH GRANT OPTION 选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授仅。

可以使用GRANT重复给用户添加权限,权限叠加, 比如你先给用 户添加一个SELECT权限,然后又给用户添加一个INSERT 权限,那么该用户就同时拥有了SELECT和INSERT 权限了

我们在开发应用的时候,经常会遇到一种需求,就是要根据用户的不同,对数据进行横向和纵向的 分组。

  • 所谓横向的分组,就是指用户可以接触到的数据的范围,比如可以看到哪些表的数据;

  • 所谓纵向的分组,就是指用户对接触到的数据能访问到什么程度,比如能看、能改,甚至是 删除。

4. 查看权限

查看当前用户权限

SHOW GRANTS;
# 或
SHOW GRANTS FOR CURRENT_USER;
# 或
SHOW GRANTS FOR CURRENT_USER();

查看某用户的全局权限

SHOW GRANTS FOR 'user'@'主机地址' ;

5. 收回权限

收回权限就是取消已经赋予用户的某些权限。收回用户不必要的权限可以在一定程度上保证系统的安全 性。MySQL中使用 REVOKE语句 取消用户的某些权限。使用REVOKE收回权限之后,用户账户的记录将从 db、host、tables_priv和columns_priv表中删除,但是用户账户记录仍然在user表中保存(删除user表中 的账户记录使用DROP USER语句)。

注意:在将用户账户从user表删除之前,应该收回相应用户的所有权限。

  • 收回权限命令

    REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;
    
  • 举例

    #收回全库全表的所有权限
    REVOKE ALL PRIVILEGES ON *.* FROM joe@'%';
    
    #收回mysql库下的所有表的插删改查权限
    REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM joe@localhost;
    

    注意: 须用户重新登录后才能生效

总结:

有一些程序员喜欢使用Root超级用户来访问数据库,完全把 权限控制 放在应用层面实现。这样当然也是可以的。

但建议大家,尽量使用数据库自己的角色和用户机制来控制访问权限,不要轻易使用Root账号。因为Root账号密码放在代码里面不安全,一旦泄露,数据库就会完全失去保护。
而且,MySQL的权限控制功能十分完善,应该尽量利用,可以提高效率,而且安全可靠。

posted @ 2022-04-22 17:22  哈哈丶丶  阅读(200)  评论(0编辑  收藏  举报