前言:岁末将至,你的数据库是不是该大检查一下了?一般检查会重点关注密码安全问题,比如密码的复杂度设置、是否定期更改等,尤其是在进行保级评测时,评测机构会要求密码安全政策。其实MySQL系统本身是可以设置密码复杂度和自动过期策略的,这个可能用的比较少,大部分同学也不是很了解。在本文中,我们将学习如何设置数据库帐户密码复杂度和自动过期策略。1、密码复杂度策略设置MySQL系统自带validate_password插件,可以验证密码强度,不满足规定强度的密码不允许设置。MySQL5.7和8.0版本好像没有默认开启这个插件,这也让我们可以随意设置密码,比如123、123456等,如果我们想从root开始标准化密码强度,可以开启这个插件-在。我们来看看如何通过这个插件来设置密码复杂度策略。1)查看插件是否安装进入MySQL命令行,通过showingplugins或查看validate_password相关参数查看插件是否安装。如果没有相关参数,说明插件没有安装#如果安装前检查为空,说明插件没有安装mysql>showvariableslike'validate%';Emptyset(0.00sec)2)安装validate_password插件#这个插件可以通过INSTALLPLUGIN命令安装#every每个平台的文件名后缀是不同的。对于Unix和类Unix系统是.so,对于Windows是.dllmysql>INSTALLPLUGINvalidate_passwordSONAME'validate_password.so';QueryOK,0rowsaffected,1warning(0.28sec)#查看validate_password相关参数mysql>showvariableslike'validate%';+------------------------------------+--------+|Variable_name|Value|+----------------------------------------+--------+|validate_password_check_user_name|ON||validate_password_dictionary_file|||validate_password_length|8||validate_password_mixed_case_count|1||validate_password_number_count|1||validate_password_policy|MEDIUM||validate_password_special_char_count|1|+--------------------------------------+--------+7rowsinset(0.00sec)3)密码强度相关参数说明安装validate_password插件后,多了一些与密码强度相关的参数。这些参数从字面意思也很容易理解。下面简单介绍一下关键参数。1、validate_password_policy表示的密码策略,默认为MEDIUM。可配置值如下:0或LOW只需要满足密码长度(由参数validate_password_length指定)1或MEDIUM满足LOW策略,至少要满足一个数。小写字母、大写字母和特殊字符2或STRONG满足MEDIUM策略,密码不能存在于字典文件(dictionaryfile)中。不得使用文件中存在的密码。3、validate_password_length用于设置密码的最小长度,默认值为84,validate_password_mixed_case_count当validate_password_policy设置为MEDIUM或STRONG时,密码中大小写字母最少同时出现的个数,默认为1,最小值为0;默认至少是一个小写字母和一个大写字母。5.validate_password_number_count当validate_password_policy设置为MEDIUM或STRONG时,密码中至少有多少个数字,默认为1,最小为06,validate_password_special_char_count当validate_password_policy设置为MEDIUM或STRONG时,密码中特殊字符的个数至少,默认1Minimum为04)密码复杂度策略具体设置学习了以上参数后,我们就可以根据自己的情况设置密码复杂度策略了。例如,我希望密码至少为10个字符,包含大小写字母、数字和特殊字符。你可以这样设置。#设置密码长度至少为10mysql>setglobalvalidate_password_length=10;QueryOK,0rowsaffected(0.00sec)mysql>showvariableslike'validate%';+------------------------------------+--------+|Variable_name|Value|+--------------------------------------+--------+|validate_password_check_user_name|ON||validate_password_dictionary_file|||validate_password_length|10||validate_password_mixed_case_count|1||validate_password_number_count|1||validate_password_policy|MEDIUM||validate_password_special_char_count|1|+------------------------------------+--------+7rowsinset(0.00sec)#如果想永久生效,建议在配置文件中写入如下参数[mysqld]plugin-load=validate_password.sovalidate_password_length=10validate_password_policy=1validate-password=FORCE_PLUS_PERMANENT5)测试密码复杂度密码复杂度策略生效后才对操作有效。比如你之前有一个账号,密码是123,这个账号还是可以用的,但是如果再次修改密码,就需要满足复杂性策略。下面我们来测试一下密码复杂度策略的具体效果。#新建用户设置密码mysql>createuser'testuser'@'%'identifiedby'123';ERROR1819(HY000):Yourpassworddoesnotsatisfythecurrentpolicyrequirementsmysql>createuser'testuser'@'%'identifiedby'ab123';ERROR1819(HY000):Yourpassworddoesnotsatisfythecurrentpolicyrequirementsmysql>createuser'testuser'@'%'identifiedby'ab123';ERROR1819(HY000):Yourpassworddoesnotsatisfythecurrentpolicyrequirementsmysql>createuser'testuser'@'%'identifiedby'ab123';'@'%'identifiedby'Ab@123';ERROR1819(HY000):你的密码不满足当前策略要求mysql>createuser'testuser'@'%'identifiedby'Bsdf@5467672';QueryOK,0rowsaffected(0.01sec)#更改密码mysqluser>alteruser'test'@'%'identifiedby'dfgf3435';ERROR1819(HY000):你的密码不满足当前策略要求mysql>alteruser'testuser'@'%'identifiedby'dBsdf@5467672';QueryOK,0rowsaffected(0.01sec)2.设置除密码复杂度外的密码自动过期策略另外,我们还可以设置密码自动过期。比如密码每90天过期一次,必须修改密码才能继续使用,这样我们的数据库账号就更加安全了。我们来看看如何设置密码自动过期。单独设置一个账号密码的过期时间使用ALTERUSER语句使单个账号密码过期,也可以改变账号过期时间。#通过mysql.user系统表查看数据库账户状态mysql>selectuser,host,password_expired,password_lifetime,password_last_changed,account_lockedfrommysql.user;+----------------+---------+----------------+----------------+------------------------+----------------+|用户|主机|密码_已过期|密码_生命周期|密码_上次更改|account_locked|+----------------+------------+------------------+--------------------+------------------------+-----------------+|expuser|%|N|NULL|2021-01-0514:30:30|N||root|%|N|NULL|2020-10-3014:45:43|N||testuser|%|N|NULL|2021-01-0417:22:37|N||mysql.infoschema|localhost|N|NULL|2020-10-3014:37:09|Y||mysql.session|localhost|N|NULL|2020-10-3014:37:09|Y||mysql.sys|localhost|N|NULL|2020-10-3014:37:09|Y||root|localhost|N|NULL|2020-10-3014:38:55|N|+----------------+------------+---------------+--------------------+----------------------+----------------+7rowsinset(0.01sec)#使expuser账户密码立即过期mysql>ALTERUSER'expuser'@'%'密码到期;查询OK,0rowsaffected(0.00sec)mysql>selectuser,host,password_expired,password_lifetime,password_last_changed,account_lockedfrommysql.user;+----------------+------------+----------------+--------------------+-------------------+----------------+|用户|主机|密码过期|密码生命周期|密码上次更改|帐户锁定|+---------------+------------+----------------+-------------------+------------------------+----------------+|expuser|%|Y|NULL|2021-01-0514:30:30|N||root|%|N|NULL|2020-10-3014:45:43|N||testuser|%|N|NULL|2021-01-0417:22:37|N||mysql.infoschema|localhost|N|NULL|2020-10-3014:37:09|Y||mysql.session|localhost|N|NULL|2020-10-3014:37:09|Y||mysql.sys|localhost|N|NULL|2020-10-3014:37:09|Y||root|localhost|N|NULL|2020-10-3014:38:55|N|+----------------+------------+-------------------+--------------------+--------------------+----------------+7rowsinset(0.00sec)#修改账号密码永不过期mysql>ALTERUSER'expuser'@'%'PASSWORDEXPIRENEVER;QueryOK,0rowsaffected(0.01sec)#单独设置账号密码90天过期mysql>ALTERUSER'expuser'@'%'PASSWORDEXPIREINTERVAL90DAY;QueryOK,0rowsaffected(0.00sec)mysql>selectuser,host,password_expired,password_lifetime,password_last_changedfrommysqluser.account_lock;------------------+------------+----------------+------------------+------------------------+---------------+|user|host|password_expired|password_lifetime|password_last_changed|account_locked|+--------------------+-----------+----------------+--------------------+-----------------------+----------------+|expuser|%|N|90|2021-01-0514:41:28|N||root|%|N|NULL|2020-10-3014:45:43|N||testuser|%|N|NULL|2021-01-0417:22:37|N||mysql.infoschema|localhost|N|NULL|2020-10-3014:37:09|Y||mysql.session|localhost|N|NULL|2020-10-3014:37:09|Y||mysql.sys|localhost|N|NULL|2020-10-3014:37:09|Y||root|localhost|N|NULL|2020-10-3014:38:55|N|+----------------+------------+----------------+--------------------+------------------------+---------------+7rowsinset(0.00sec)#让这个账户使用默认密码过期全局策略mysql>ALTERUSER'expuser'@'%'PASSWORDEXPIREDEFAULT;QueryOK,0rowsaffected(0.01sec)mysql.usersystem该表记录了每个账户的相关信息。当password_expired字段的值为Y时,表示密码已经过期。使用过期密码仍可登录,但不能进行任何操作。如果执行操作,会提示:ERROR1820(HY000):YoumustresetyourpasswordusingALTERUSERstatementbeforeexecutingthisstatement.必须先修改密码才能正常操作。对于一个给定过期时间的账户,比如你设置过期90天,数据库系统会比较当前时间和上次修改密码的时间的差值,如果已经超过90天最后一次修改密码,账户密码将被标记为过期,必须在修改密码后进行操作。设置全局过期策略要构建全局密码自动过期策略,请使用default_password_lifetime系统变量。在5.7.11版本之前,default_password_lifetime的值为360(密码大概每年需要修改一次),之后的版本默认为0,表示密码不会过期。该参数的单位是天。比如我们可以将这个参数设置为90,表示全局密码自动过期策略为90天。#设置全局过期策略在添加配置文件前手动更改mysql>SETGLOBALdefault_password_lifetime=90;QueryOK,0rowsaffected(0.01sec)mysql>showvariableslike'default_password_lifetime';+----------------------------+--------+|变量名|值|+-----------------------+--------+|default_password_lifetime|90|+----------------------------+-------+1rowinset(0.00sec)#写配置文件使重启生效[mysqld]default_password_lifetime=90虽然可以通过设置为当前值来“重置”过期的密码,但是为了好的Policy考虑,最好选择不同的密码。摘要:本文主要介绍数据库密码的两种安全策略,密码复杂度加密码过期策略,多一种策略,多一种安心。请记住:安全不是小事。
