ITPub博客

首页 > 数据库 > MySQL > MySQL 5.7 初始密码和密码复杂度问题

MySQL 5.7 初始密码和密码复杂度问题

原创 MySQL 作者:神谕丶 时间:2016-04-08 17:43:01 0 删除 编辑
〇 环境:
CentOS 6.5 64bit  (文末有Debian/Ubuntu deb包的密码问题)

mysql-server版本:5.7.11



〇 
背景:

mysql 5.7以后,安全性大幅度上升,用习惯了老版本
的用户刚使用会有一些不适。
如,默认安装后初始密码不为空;
或找不到初始密码在哪;

再比如,设置新密码会报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。
其主要实现方式主要是通过【validate_password】插件实现。

mysql安装之后,通常需要初始化datadir等。

如果根据安装方式的不同,通过service mysqld start来第一次启动数据库的话,会初始化数据库。
并默认安装验证密码插件(默认安装为
新特性,5.6中安装方法见下
  1. Initializing MySQL database: [ OK ]
  2. Installing validate password plugin: [ OK ]
  3. Starting mysqld: [ OK ]
实际上该步骤初始化方式是通过mysqld --initialize来实现。



〇 初始密码:
在5.7.6以后的版本,如5.7.11,默认初始的密码是在errlog中。
查看配置文件或者通过ps -ef|grep error=可以知道errlog默认位置。
  1. # ps -ef | grep error=
  2. mysql 2387 2189 0 23:10 pts/0 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
  3. root 2464 1131 0 23:28 pts/0 00:00:00 grep error=

通过查errlog中的信息,可以得知初始密码如下:
  1. # cat /var/log/mysqld.log | grep "temporary password"
  2. 2016-04-08T15:10:00.920194Z 1 [Note] A temporary password is generated for root@localhost: yP(DO;EM&2CY

故通过

  1. mysql -uroot -p'yP(DO;EM&2CY'
即可登入

并且第一次使用随机生成的密码登录后,必须第一步做密码修改操作,否则会抛出:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.




〇 密码复杂度:
修改当前登入mysql用户密码和老版本中一样:
  1. mysql> SET PASSWORD=PASSWORD('Root1234@');
  2. Query OK, 0 rows affected, 1 warning (0.00 sec)
  3. mysql> FLUSH PRIVILEGES;
  4. Query OK, 0 rows affected (0.00 sec)
若使用老版本的SET PASSWORD=PASSWORD('')方式来修改密码的话,也会抛出警告:
大致意思是这种方式将会在未来版本中移除,

  1. Warning 1287 'SET PASSWORD = PASSWORD('')' is deprecated and will be removed in a future release. Please use SET PASSWORD = '' instead

新的修改方式是:(不需要flush privileges;)
  1. mysql> SET password='Root1234@';

当然,官方还建议使用如下方式来修改密码

  1. ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

同时,密码“过于简单”时也会报错:

  1. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。

这个validate_password密码强度审计插件决定了你设置的密码是否“过于简单”。
  1. mysql> SHOW VARIABLES LIKE 'vali%';
  2. +--------------------------------------+--------+
  3. | Variable_name                        | Value  |
  4. +--------------------------------------+--------+
  5. | validate_password_dictionary_file    |        |
  6. | validate_password_length             | 8      |
  7. | validate_password_mixed_case_count   | 1      |
  8. | validate_password_number_count       | 1      |
  9. | validate_password_policy             | MEDIUM |
  10. | validate_password_special_char_count | 1      |
  11. +--------------------------------------+--------+
  12. 6 rows in set (0.00 sec)

5.7初始化后,默认会安装这个插件,若没有安装,则SHOW VARIABLES LIKE 'vali%'则会返回空。
对应参数的value值也为默认值,以下是这些值的解释
  1.  validate_password_length 8 # 密码的最小长度,此处为8。
  2.  validate_password_mixed_case_count 1 # 至少要包含小写或大写字母的个数,此处为1。
  3.  validate_password_number_count 1 # 至少要包含的数字的个数,此处为1。
  4.  validate_password_policy MEDIUM # 强度等级,其中其值可设置为0、1、2。分别对应:
  5.                            【0/LOW】:只检查长度。
  6.                            【1/MEDIUM】:在0等级的基础上多检查数字、大小写、特殊字符。
  7.                            【2/STRONG】:在1等级的基础上多检查特殊字符字典文件,此处为1。
  8.  validate_password_special_char_count 1 # 至少要包含的个数字符的个数,此处为1。

想要关闭这个插件,则在配置文件中加入以下并重启mysqld即可:
[mysqld]
validate_password=off

或者
UNINSTALL PLUGIN validate_password;
即可

重启mysqld后通过SHOW PLUGINS;可以查到:
  1. +-------------------+----------+-------------------+----------------------+-----+
  2. | validate_password | DISABLED | VALIDATE PASSWORD | validate_password.so | GPL |
  3. +-------------------+----------+-------------------+----------------------+-----+



〇 5.7.6及之前的版本:

而在5.7.6之前的版本,初始化方式也不一样,故默认初始化密码存放的位置也不一样:
  1. bin/mysql_install_db --basedir=/usr --datadir=/var/lib/mysql --user=root
  2. [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
其中,在5.7.6后续版本中,mysql_install_db已经被废弃,而后续版本将通过mysqld --initialize 来初始化。

在5.6.8以后的版本,如果是通过mysql_install_db脚本来初始化,配合--random-passwords选项,则密码会在/root/.mysql_secret中,如

  1. cat /root/.mysql_secret
  2. # Password set for user 'root@localhost' at 2016-04-08 16:13:51
  3. yP(DO;EM&2CY





〇 5.6版本中的validate_password插件

当然,mysql 5.6也可以安装这个插件,安装起来十分简单:

修改配置文件:
[mysqld]
plugin-load=validate_password.so
然后在mysql中安装:
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';



〇 5.7版本初始化时不设置初始密码,并不安装validate_password插件
当然在一些实验机环境中,可能不需要这样做,mysql5.7也提供了不安装该插件并不生成随机密码的操作。
只需要在初始化时指定--initialize-insecure即可,比如:
  1. mysqld --initialize-insecure --datadir=/var/lib/mysql --basedir=/usr --user=mysql
此时,SHOW VARIABLES LIKE 'vali%';也会为空,因为该插件没有被安装。



〇 关于5.7中 
mysqld 其他选项参数
可以用如下命令去查看

  1. mysqld --verbose --help | grep password

〇 Debian/Ubuntu 包安装的密码问题
在通过deb包安装的时候,会被询问指定root密码,如果设置为空,会输出:
 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.



〇 参考文档:

MySQL 5.6 Reference Manual / Security / Security Plugins / The Password Validation Plugin  
MySQL 5.7 Reference Manual / Initializing the Data Directory Manually Using mysqld




作者微信公众号(持续更新)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29773961/viewspace-2077579/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
微信公众号:fantasy-life-

注册时间:2014-07-28

  • 博文量
    159
  • 访问量
    970493