当前位置: 首页 > 科技观察

MySQL8.0用户和角色管理

时间:2023-03-19 22:55:44 科技观察

MySQL8.0新增了很多功能,包括用户管理中的角色管理,默认的密码加密方式也进行了调整,从之前的sha1改为sha2,并增加了5.7禁用用户和用户过期设置,这样对用户的管理和权限的管理也增加了用户的安全性。在MySQL8.0中,将MySQL库中表的文件合并到数据根目录下的mysql.ibd中(Mysql8.0Innodb引擎重构)。同时MySQL8.0可以使用SETPERSIST动态修改参数并保存在配置文件中(mysqld-auto.cnf,保存格式为JSON字符串)。重启后问题会恢复。查看MySQL8.0官方文档,通过官方示例查看新的管理方式。一、MySQL用户管理1.1.认证插件和密码加密方式的变化在MySQL8.0中,caching_sha2_password是默认的认证插件,取代了之前版本的mysql_native_password,默认的密码加密方式是sha2。如果需要保留之前版本的认证方式和密码加密方式,需要在配置文件中修改。暂不支持动态修改,需要重启生效:default_authentication_plugin=mysql_native_password。将8.0中已有的sha2密码修改为sha1模式:ALTERUSER'root'@'127.0.0.1'IDENTIFIEDBY'passowrd'PASSWORDEXPIRENEVER;#修改加密规则永不过期ALTERUSER'root'@'127.0.0.1'IDENTIFIEDBY'native_passwordBY'password';#更新用户的密码加密方式为上一版本FLUSHPRIVILEGES;#刷新权限1.2用户权限及修改密码用户权限MySQL8.0的版本与之前的有所不同。老版本的普通授权语句在8.0会报错:MySQL8.0之前的版本:GRANTALLON*.*TO`wangwei`@`127.0.0.1`IDENTIFIEDBY'passowrd'WITHGRANTOPTION;MySQL8.0版本:CREATEUSER`wangwei`@`127.0.0.1`IDENTIFIEDBY'passowrd';GRANTALLON*.*TO`wangwei`@`127.0.0.1`WITHGRANTOPTION;MySQL8.0创建带过期时间的用户:CREATEUSER`wangwei`@`127.0.0.1`IDENTIFIEDBY'wangwei'PASSWORDEXPIREINTERVAL90DAY;GRANTALLON*.*TO`wangwei`@`127.0.0.1`WITHGRANTOPTION;MySQL8.0修改用户密码:1.2、密码过期时间管理全局建立自动密码过期策略,请使用default_password_lifetime系统变量。它的默认值为0,即禁用自动密码过期。如果default_password_lifetime的值为正整数N,则表示允许的密码生存期,即密码必须每天更改N。可以在配置文件中添加:1:建立一个全局策略,密码有效期为六个月左右,请在服务器my.cnf文件中使用如下行启动服务器:[mysqld]default_password_lifetime=1802:建立全局策略,让密码永不过期,请设置default_password_lifetime为0:[mysqld]default_password_lifetime=0该参数可以动态设置和保存:SETPERSISTdefault_password_lifetime=180;SETPERSISTdefault_password_lifetime=0;创建和修改密码过期用户,具体账户过期时间设置示例:要求每90天更改一次密码:CREATEUSER'wangwei'@'localhost'PASSWORDEXPIREINTERVAL90DAY;ALTERUSER'wangwei'@'localhost'PASSWORDEXPIREINTERVAL90DAY;禁用密码过期:CREATEUSER'wangwei'@'localhost'PASSWORDEXPIRENEVER;ALTERUSER'wangwei'@'localhost'PASSWORDEXPIRENEVER;遵循全局过期策略:CREATEUSER'wangwei'@'localhost'PASSWORDEXPIREDEFAULT;ALTERUSER'wangwei'@'localhost'PASSWORDEXPIREDEFAULT;1.3MySQL用户密码重用策略设置MySQL允许限制以前密码的重用。可以根据密码更改的次数、经过的时间或两者来建立重用限制。帐户的密码历史由过去分配的密码组成。MySQL可以限制从该历史记录中选择新密码:如果一个帐户根据密码更改次数进行限制,则不能从指定数量的最近密码中选择新密码。例如密码最小更改次数设置为3,则新密码不能与最近3次密码相同。如果账户受时间限制,则不能从历史新密码中选择新密码,新密码不会早于指定的天数。例如,如果密码重用间隔设置为60,则新密码不能介于最近60天内选择的密码之间。注意:空密码不记录在密码历史中,可以随时重复使用。要在全局范围内建立密码重用策略,请使用password_history和password_reuse_interval系统变量。要在服务器启动时指定变量值,在服务器my.cnf文件中定义它们。示例:要禁止重复使用最近6个密码或密码超过365天的任何密码,请将这些行放入服务器my.cnf文件中:[mysqld]password_history=6password_reuse_interval=365要动态设置和保存配置,请使用以下命令语句:SETPERSISTpassword_history=6;SETPERSISTpassword_reuse_interval=365;2、MySQL8.0角色管理MySQL角色是一组指定的权限。与用户帐户一样,角色可以授予和撤销权限。用户帐户可以被授予角色,授予该帐户与每个角色关联的特权。如果用户被授予角色权限,则该用户具有该角色的权限。以下列表总结了MySQL提供的角色管理功能:CREATEROLE和DROPROLE创建和删除角色;GRANT和REVOKE为用户和角色分配和撤销权限;SHOWGRANTS显示用户和角色的权限和角色分配;SETDEFAULTROLE指定哪些帐户角色默认处于活动状态;SETROLE更改当前会话中的活动角色。CURRENT_ROLE()函数显示当前会话中的活动角色。2.1创建角色并授予用户角色权限考虑以下场景:应用程序使用名为app_db的数据库。与应用程序相关联的,可以是创建和维护应用程序的开发者和管理员帐户。开发人员需要对数据库的完全访问权限。有些用户只需要读权限,有些用户需要读/写权限。为了明确区分角色的权限,创建角色作为所需权限集的名称。通过授予适当的角色,可以轻松地为用户帐户授予所需的权限。要创建角色,请使用CREATEROLE:CREATEROLE'app_developer','app_read','app_write';角色名与用户帐号名非常相似,格式上由用户部分和主机部分组成。主机部分,如果省略,默认为%。用户和主机部分可以不加引号,除非它们包含特殊字符。与帐户名称不同,角色名称的用户部分不能为空。要为角色??分配权限,请使用与为用户分配权限相同的语法:GRANTALLONapp_db.*TO'app_developer';GRANTSELECTONapp_db.*TO'app_read';GRANTINSERT,UPDATE,DELETEONapp_db.*TO'app_write';CREATEROLE'app_developer','app_read','app_write';现在假设您最初需要一个开发者帐户、两个需要只读访问权限的用户和一个需要读/写访问权限的用户。使用CREATEUSER创建用户:CREATEUSER'dev1'@'localhost'IDENTIFIEDBY'dev1pass';CREATEUSER'read_user1'@'localhost'IDENTIFIEDBY'read_user1pass';CREATEUSER'read_user2'@'localhost'IDENTIFIEDBY'read_user2pass';CREATEUSER'rw_user1'@'localhost'IDENTIFIEDBY'rw_user1pass';要为每个用户分配所需的权限,您可以使用与刚才显示的相同形式的GRANT语句,但这需要枚举每个用户的个人权限。相反,使用允许授予角色而不是权限的GRANT替代语法:GRANT'app_developer'TO'dev1'@'localhost';GRANT'app_read'TO'read_user1'@'localhost','read_user2'@'localhost';GRANT'app_read','app_write'TO'rw_user1'@'localhost';结合角色需要的读写权限,在GRANT中授权rw_user1用户读写。GRANT授权角色的语法与授权用户不同:有一个ON来区分角色和用户的授权,ON是用来授权用户的,但是没有ON来分配角色.由于语法不同,您不能在同一语句中混合分配用户权限和角色。(允许为用户分配权限和角色,但必须使用单独的GRANT语句,且每条语句的语法必须与授权内容相匹配。)2.2检查角色权限验证分配给用户的权限,使用SHOW赠款。例如:mysql>SHOWGRANTSFOR'dev1'@'localhost';+---------------------------------------------+|Grantsfordev1@localhost|+---------------------------------------------+|GRANTUSAGEON*.*TO`dev1`@`localhost`||GRANT`app_developer`@`%`TO`dev1`@`本地主机`|+----------------------------------------------+但是,它显示的是每个授予的角色,而不是角色所代表的权限。如果要显示角色权限,加个USING显示:mysql>SHOWGRANTSFOR'dev1'@'localhost'USING'app_developer';+--------------------------------------------------------+|Grantsfordev1@localhost|+------------------------------------------------------+|GRANTUSAGEON*.*TO`dev1`@`localhost`||GRANTALLPRIVILEGESON`app_db`.*TO`dev1`@`localhost`||GRANT`app_developer`@`%`TO`dev1`@`localhost`|+--------------------------------------------------------+还要验证其他类型的用户:mysql>SHOWGRANTSFOR'read_user1'@'localhost'USING'app_read';+------------------------------------------------------+|Grantsforread_user1@localhost|+----------------------------------------------------+|GRANTUSAGEON*.*TO`read_user1`@`localhost`||GRANTSELECTON`app_db`.*TO`read_user1`@`localhost`||GRANT`app_read`@`%`TO`read_user1`@`localhost`|+----------------------------------------------------+mysql>SHOWGRANTSFOR'rw_user1'@'localhost'USING'app_read','app_write';+--------------------------------------------------------------------------------+|Grantsforrw_user1@localhost|+------------------------------------------------------------------------+|GRANTUSAGEON*.*TO`rw_user1`@`localhost`||GRANTSELECT,INSERT,UPDATE,DELETEON`app_db`.*TO`rw_user1`@`localhost`||GRANT`app_read`@`%`,`app_write`@`%`TO`rw_user1`@`localhost`|+--------------------------------------------------------------------------+2.3撤销角色或角色权限正如可以授权用户的角色一样,可以从帐户中撤销这些角色:REVOKEroleFROMuser;REVOKE可用于修改角色权限。这不仅会影响角色本身的权限,还会影响授予角色的任何用户权限。假设你想暂时让所有用户只读,使用REVOKE撤销app_write角色的修改权限:REVOKEINSERT,UPDATE,DELETEONapp_db.*FROM'app_write';碰巧,一个角色根本没有权限,你可以看到SHOWGRANTS(这个语句可以和角色一起使用,而不仅仅是查询用户权限):mysql>SHOWGRANTSFOR'app_write';+------------------------------------+|Grantsforapp_write@%|+------------------------------------+|GRANTUSAGEON*.*TO`app_write`@`%`|+---------------------------------+撤销角色的权限会影响该角色中任何用户的权限,因此rw_user1现在具有无表修改权限(INSERT、UPDATE和DELETE权限不再可用):mysql>SHOWGRANTSFOR'rw_user1'@'localhost'USING'app_read','app_write';+-----------------------------------------------------------------+|Grantsforrw_user1@localhost|+----------------------------------------------------------------+|GRANTUSAGEON*.*TO`rw_user1`@`localhost`||GRANTSELECTON`app_db`.*TO`rw_user1`@`localhost`||GRANT`app_read`@`%`,`app_write`@`%`TO`rw_user1`@`localhost`|+------------------------------------------------------------+实际上,rw_user1读/写用户已成为只读用户。对于被授予app_write角色的任何其他用户也会发生这种情况,说明使用该角色修改权限并不一定会修改个人帐户。要恢复对角色的修改权限,只需重新授予它们:GRANTINSERT,UPDATE,DELETEONapp_db.*TO'app_write';现在rw_user1再次具有修改权限,就像授予app_write角色的任何其他帐户一样。2.4删除角色要删除角色,使用DROPROLE:DROPROLE'app_read','app_write';删除角色将从授权它的每个帐户撤销该角色。2.5实践中的角色和用户假设一个遗留应用程序开发项目在MySQL中存在角色之前开始,因此与该项目关联的所有用户都被直接授予权限(而不是通过授予角色权限)。其中一个帐户是最初被授予如下权限的开发人员用户:CREATEUSER'old_app_dev'@'localhost'IDENTIFIEDBY'old_app_devpass';GRANTALLONold_app.*TO'old_app_dev'@'localhost';如果此开发人员离开项目,则如果需要将权限分配给其他用户,或者如果项目参与者的数量增加,则可能需要多个用户。以下是一些解决方法:不要使用角色:更改帐户密码,使原始开发人员无法使用它,并让新开发人员使用该帐户:ALTERUSER'old_app_dev'@'localhost'IDENTIFIEDBY'new_password';使用角色:锁定帐户以防止任何人使用它连接到服务器:ALTERUSER'old_app_dev'@'localhost'ACCOUNTLOCK;然后将帐户视为角色。为每个新开发项目的开发者,创建一个新账户,并授予它原来的开发者账户:CREATEUSER'new_app_dev1'@'localhost'IDENTIFIEDBY'new_password';将'old_app_dev'@'localhost'授予'new_app_dev1'@'localhost';这具有将原始开发者帐户权限分配给新帐户的效果。MySQL8.0的用户和角色管理越来越像Oracle。8.0的新特性很多,变化还是很大的。DBA需要不断学习和测试,更新对新版MySQL的认识,更好的运维MySQL数据库。未来,MySQL数据库自治化、数据库智能化是必然的发展趋势,对DBA来说是一种解放,也是一种挑战。同时,也非常感谢我的朋友,知名MySQL数据库专家吴炳熙先生百忙之中抽空校对本文。