作者:杨涛涛

资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。

本文起源:原创投稿

*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


引言

引言

这里来介绍下MySQL 8.0 版本自带的新密码验证策略。

注释

咱们十分相熟这样的模式: 用户想更改本人明码,须要提供原来明码或者追加手机验证码才能够, 这种模式在MySQL数据库里始终不存在。在MySQL 8.0 之前的版本,普通用户能够间接更改本人明码,不须要旧明码验证,也不须要知会管理员,比方用户ytt_admin 须要更改明码,在MySQL 5.7 下间接敲alter user 命令即可:

root@ytt-ubuntu:~# mysql -uytt_admin -proot1234 -P5734 -h ytt-ubuntu -e "alter user ytt_admin identified by 'root'"mysql: [Warning] Using a password on the command line interface can be insecure.
这样的明码更改行为其实不是很平安,假如有上面的场景呈现:
用户ytt_admin 登录到MySQL服务后,做了些日常操作,实现后遗记退出;此时刚好有一个居心叵测的用户ytt_fake 进入ytt_admin的登录环境,间接敲命令alter user 即可更改用户ytt_admin的明码,并且退出以后登录环境,用户ytt_admin本尊再次登录MySQL,就会提醒明码谬误,不容许登录,此时用户ytt_admin大脑必定是懵的。
为了避免这类不安全事件的产生,MySQL 8.0 公布了一系列明码验证策略。 这里介绍第一项:以后明码验证策略设置!
以后明码验证策略有两种办法来给到具体用户。
第一种,从管理员侧来设置单个用户的以后明码验证策略。

创立用户或者更改用户设置时应用子句: password require current(示意强制此用户满足以后明码验证策略) 。

mysql:(none)>create user ytt_admin identified by 'root123' password require current;Query OK, 0 rows affected (0.11 sec)

之后以用户ytt_admin 登录MySQL并且更改明码,提醒须要提供旧明码才行。

root@ytt-ubuntu:/home/ytt# mysql -h ytt-ubuntu -uytt_admin -proot123mysql: [Warning] Using a password on the command line interface can be insecure.Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 33Server version: 8.0.27 MySQL Community Server - GPLmysql:(none)>alter user ytt_admin identified by 'root';ERROR 3892 (HY000): Current password needs to be specified in the REPLACE clause in order to change it.

接下来,alter user 跟上子句replace 来让用户ytt_admin输出旧明码,胜利更改新密码。

mysql:(none)>alter user ytt_admin identified by 'root' replace 'root123';Query OK, 0 rows affected (0.00 sec)

如果有的场景下须要放弃MySQL旧版本的明码更改行为,管理员侧能够用子句: password require current optional 敞开新个性。

-- (optional 关键词可用default 代替,参考全局明码验证参数设置)mysql:(none)>alter user ytt_admin password require current optional;Query OK, 0 rows affected (0.04 sec)

来再次验证下用户ytt_admin更改明码的行为:又变更为不平安的MySQL旧版本平安行为。

mysql:(none)>alter user ytt_admin identified by 'root';Query OK, 0 rows affected (0.01 sec)
第二种,设置全局参数,来强制所有用户应用以后明码验证策略。

MySQL 8.0 新版本内置的参数password_require_current 定义一个全局明码策略,默认敞开。开启这个选项时,要求用户更改明码时必须提供旧明码。

开启全局参数:

mysql:(none)>set persist password_require_current=on;Query OK, 0 rows affected (0.00 sec)

创立另外一个新用户 ytt_usage:

mysql:(none)>create user ytt_usage identified by 'root123';Query OK, 0 rows affected (0.00 sec)

以用户ytt_usage登录MySQL更改本人明码: 间接回绝更改,须要提供旧明码。

root@ytt-ubuntu:~# mysql -uytt_usage -proot123 -h ytt-ubuntumysql: [Warning] Using a password on the command line interface can be insecure.Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 37Server version: 8.0.27 MySQL Community Server - GPL...mysql:(none)>alter user ytt_usage identified by 'root';ERROR 3892 (HY000): Current password needs to be specified in the REPLACE clause in order to change it.mysql:(none)>

replace 子句提供旧明码再次胜利更改新密码:

mysql:(none)>alter user ytt_usage identified by 'root' replace 'root123';Query OK, 0 rows affected (0.02 sec)

这里有一个须要留神的点:尽管全局参数开启,然而alter user 命令优先级更高,能够间接笼罩全局参数设置。上面是全局参数开启的环境下,用alter user命令来敞开用户ytt_usage的以后明码验证策略。

mysql:(none)>alter user ytt_usage password require current optional;Query OK, 0 rows affected (0.11 sec)

接下来用户ytt_usage 又复原为MySQL旧版本的平安行为:

mysql:(none)>alter user ytt_usage identified by 'rootnew';Query OK, 0 rows affected (0.11 sec)

还有另外一个子句: password require current default ,具体行为由全局参数password_require_current 的设置决定,全局参数敞开,这个子句复原MySQL旧版本平安行为;全局参数开启,这个子句应用MySQL 新版本平安行为。

mysql:(none)>alter user ytt_usage password require current default;Query OK, 0 rows affected (0.09 sec)

总结:

本文介绍的以后明码验证策略,使得MySQL 朝着更加平安的方向致力。