密码验证策略使DBA能够防止用户在他们不知道当前密码的情况下更改密码。
这什么时候会发生?如果用户在没有注销的情况下离开终端会话,并且恶意用户使用打开的会话更改原始用户的 MySQL 密码,则可能会发生此类更改。可以想象,这可能会带来灾难性的后果:
·在管理员重置帐户密码之前,原始用户现在无法访问 MySQL。 ·恶意用户可以访问 MySQL,直到可以实施密码重置,从而损害原始用户可以访问的任何数据。
账户级别的设置
密码确认策略可以全局指定,单独账户可以延迟全局策略,也可以针对单独账户进行设置,覆盖全局设置。
该策略是通过在执行create user、alter user命令时,指定password require选项来实现。
·如果账户被设置成password require current,那修改密码的话,必须要指定当前的密码
·如果账户被设置成password require current optional,修改密码的话,用户可以选择性地提供当前的密码,但不是必须
·如果账户被设置成password require current default,那全局参数password_require_current的值决定了是否对账户开启密码确认策略:
(1)如果开启了password_require_current,修改密码的时候,必须指定当前的密码
(2)如果没有开启password_require_current,修改密码的时候,是否指定当前的密码是可选的
如果账号设置不是password require current default,则帐户级别的设置优先于由password_require_current系统变量建立的全局策略。 否则,帐户将遵循password_require_current设置。
缺省情况下,密码确认是可选的,默认的系统变量password_require_current是关闭的;创建的用户没有指定password require选项的话,默认就是使用password require current default。
结合password_require_current系统变量和每个账户自身的设置来决定是否开启密码确认功能。
账号设置 | 系统变量password_require_current的设置 | 修改密码是否需要当前密码 |
---|---|---|
password require current | OFF | Yes |
password require current | ON | Yes |
password require current optional | OFF | No |
password require current optional | ON | No |
password require current default | OFF | No |
password require current default | ON | Yes |
比如,实现一个用户需求,修改密码时必须知道当前密码:
CREATE USER 'abce'@'localhost' PASSWORD REQUIRE CURRENT;
ALTER USER 'abce'@'localhost' PASSWORD REQUIRE CURRENT;
在账户级别指定后,会覆盖全局参数的设置。
全局设置
在配置文件中设置:
password_require_current = ON
对于运行中的实例,可以通过set设置:
mysql> SET PERSIST password_require_current = ON;
例外
特权用户可以修改任何账户的密码,而不需要指定当前的密码。
特权用户是指具有全局的create user、或具有update系统库mysql权限的任何用户。