文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

年底了,你的数据库密码安全吗

2024-12-03 14:23

关注

 

[[374055]]

1.密码复杂度策略设置

MySQL 系统自带有 validate_password 插件,此插件可以验证密码强度,未达到规定强度的密码则不允许被设置。MySQL 5.7 及 8.0 版本默认情况下貌似都不启用该插件,这也使得我们可以随意设置密码,比如设置为 123、123456等。如果我们想从根源上规范密码强度,可以启用该插件,下面一起来看下如何通过此插件来设置密码复杂度策略。

1)查看是否已安装此插件

进入 MySQL 命令行,通过 show plugins 或者查看 validate_password 相关参数可以判断是否已安装此插件。若没有相关参数则代表未安装此插件

 

  1. # 安装前检查 为空则说明未安装此插件 
  2. mysql> show variables like 'validate%'
  3. Empty set (0.00 sec) 

2)安装 validate_password 插件

 

  1. # 通过 INSTALL PLUGIN 命令可安装此插件 
  2. # 每个平台的文件名后缀都不同 对于 Unix 和类 Unix 系统,为.so,对于 Windows 为.dll 
  3. mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so'
  4. Query OK, 0 rows affected, 1 warning (0.28 sec) 
  5.  
  6. # 查看 validate_password 相关参数 
  7. mysql> show variables like 'validate%'
  8. +--------------------------------------+--------+ 
  9. | Variable_name                        | Value  | 
  10. +--------------------------------------+--------+ 
  11. | validate_password_check_user_name    | ON     | 
  12. | validate_password_dictionary_file    |        | 
  13. | validate_password_length             | 8      | 
  14. | validate_password_mixed_case_count   | 1      | 
  15. | validate_password_number_count       | 1      | 
  16. | validate_password_policy             | MEDIUM | 
  17. | validate_password_special_char_count | 1      | 
  18. +--------------------------------------+--------+ 
  19. rows in set (0.00 sec) 

3)密码强度相关参数解释

安装 validate_password 插件后,多了一些密码强度相关参数,这些参数从字面意思上也很容易看懂,下面简单解释下几个重点参数。

validate_password_policy

代表的密码策略,默认是MEDIUM 可配置的值有以下:

0 or LOW 仅需需符合密码长度(由参数validate_password_length指定)

1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符

2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中

validate_password_dictionary_file

用于配置密码的字典文件,当validate_password_policy设置为STRONG时可以配置密码字典文件,字典文件中存在的密码不得使用。

validate_password_length

用来设置密码的最小长度,默认值是8

validate_password_mixed_case_count

当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写字母的数量,默认是1最小是0;默认是至少拥有一个小写和一个大写字母。

validate_password_number_count

当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默认1最小是0

validate_password_special_char_count

当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的特殊字符的个数,默认1最小是0

4)密码复杂度策略具体设置

学习完以上参数,我们就可以根据自身情况来具体设置密码复杂度策略了,比如我想让密码至少 10 位且包含大小写字母、数字、特殊字符,则可以这样设置。

 

  1. # 设置密码长度至少10位 
  2. mysql> set global validate_password_length = 10; 
  3. Query OK, 0 rows affected (0.00 sec) 
  4.  
  5. mysql> show variables like 'validate%';                                                                                    
  6. +--------------------------------------+--------+ 
  7. | Variable_name                        | Value  | 
  8. +--------------------------------------+--------+ 
  9. | validate_password_check_user_name    | ON     | 
  10. | validate_password_dictionary_file    |        | 
  11. | validate_password_length             | 10     | 
  12. | validate_password_mixed_case_count   | 1      | 
  13. | validate_password_number_count       | 1      | 
  14. | validate_password_policy             | MEDIUM | 
  15. | validate_password_special_char_count | 1      | 
  16. +--------------------------------------+--------+ 
  17. rows in set (0.00 sec) 
  18.  
  19. # 若想永久生效,建议将以下参数写入配置文件 
  20. [mysqld] 
  21. plugin-load = validate_password.so 
  22. validate_password_length = 10 
  23. validate_password_policy = 1 
  24. validate-password = FORCE_PLUS_PERMANENT 

5)测试密码复杂度

密码复杂度策略只对生效后的操作有效,比如说你之前有个账号,密码是 123 ,则该账号还是可以继续使用的,不过若再次更改密码则需满足复杂度策略。下面我们来测试下密码复杂度策略的具体效果。

 

  1. # 新建用户设置密码 
  2. mysql> create user 'testuser'@'%' identified by '123'
  3. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 
  4. mysql> create user 'testuser'@'%' identified by 'ab123'
  5. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 
  6. mysql> create user 'testuser'@'%' identified by 'Ab@123'
  7. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 
  8. mysql> create user 'testuser'@'%' identified by 'Bsdf@5467672'
  9. Query OK, 0 rows affected (0.01 sec) 
  10.  
  11. # 更改密码 
  12. mysql> alter user 'testuser'@'%' identified by 'dfgf3435'
  13. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 
  14. mysql> alter user 'testuser'@'%' identified by 'dBsdf@5467672'
  15. Query OK, 0 rows affected (0.01 sec) 

2.设置密码自动过期

除了设置密码复杂度策略外,我们还可以设置密码自动过期,比如说隔 90 天密码会过期必须修改密码后才能继续使用,这样我们的数据库账号就更加安全了。下面我们来看下如何设置密码自动过期。

单独设置某个账号密码过期时间

使用 ALTER USER 语句可以使单个账号密码过期,也可以更改账号过期时间。

 

  1. # 通过 mysql.user 系统表查看数据库账号状态 
  2. mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user
  3. +------------------+-----------+------------------+-------------------+-----------------------+----------------+ 
  4. user             | host      | password_expired | password_lifetime | password_last_changed | account_locked | 
  5. +------------------+-----------+------------------+-------------------+-----------------------+----------------+ 
  6. | expuser          | %         | N                |              NULL | 2021-01-05 14:30:30   | N              | 
  7. | root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              | 
  8. | testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | N              | 
  9. | mysql.infoschema | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              | 
  10. | mysql.session    | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              | 
  11. | mysql.sys        | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              | 
  12. | root             | localhost | N                |              NULL | 2020-10-30 14:38:55   | N              | 
  13. +------------------+-----------+------------------+-------------------+-----------------------+----------------+ 
  14. rows in set (0.01 sec) 
  15.  
  16. # 使 expuser 账号密码立即过期 
  17. mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE; 
  18. Query OK, 0 rows affected (0.00 sec) 
  19.  
  20. mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user
  21. +------------------+-----------+------------------+-------------------+-----------------------+----------------+ 
  22. user             | host      | password_expired | password_lifetime | password_last_changed | account_locked | 
  23. +------------------+-----------+------------------+-------------------+-----------------------+----------------+ 
  24. | expuser          | %         | Y                |              NULL | 2021-01-05 14:30:30   | N              | 
  25. | root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              | 
  26. | testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | N              | 
  27. | mysql.infoschema | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              | 
  28. | mysql.session    | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              | 
  29. | mysql.sys        | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              | 
  30. | root             | localhost | N                |              NULL | 2020-10-30 14:38:55   | N              | 
  31. +------------------+-----------+------------------+-------------------+-----------------------+----------------+ 
  32. rows in set (0.00 sec) 
  33.  
  34. # 修改账号密码永不过期 
  35. mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE NEVER; 
  36. Query OK, 0 rows affected (0.01 sec) 
  37.  
  38. # 单独设置该账号密码90天过期 
  39. mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE INTERVAL 90 DAY
  40. Query OK, 0 rows affected (0.00 sec) 
  41.  
  42. mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user
  43. +------------------+-----------+------------------+-------------------+-----------------------+----------------+ 
  44. user             | host      | password_expired | password_lifetime | password_last_changed | account_locked | 
  45. +------------------+-----------+------------------+-------------------+-----------------------+----------------+ 
  46. | expuser          | %         | N                |                90 | 2021-01-05 14:41:28   | N              | 
  47. | root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              | 
  48. | testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | N              | 
  49. | mysql.infoschema | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              | 
  50. | mysql.session    | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              | 
  51. | mysql.sys        | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              | 
  52. | root             | localhost | N                |              NULL | 2020-10-30 14:38:55   | N              | 
  53. +------------------+-----------+------------------+-------------------+-----------------------+----------------+ 
  54. rows in set (0.00 sec) 
  55.  
  56. # 让此账号使用默认的密码过期全局策略 
  57. mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE DEFAULT
  58. Query OK, 0 rows affected (0.01 sec) 

mysql.user 系统表记录着每个账号的相关信息,当 password_expired 字段值为 Y 时,代表此密码已过期,使用过期密码仍可以登录,但不能进行任何操作,进行操作会提示:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. 必须更改密码后才能进行正常操作。

对于给定过期时间的账号,比如说设置 90 天过期,数据库系统会比较当前时间与上次修改密码的时间差值,如果距离上次修改密码时间超过 90 天,则将此账号密码标记为过期,必须更改密码后才能进行操作。

设置全局过期策略

要构建全局密码自动过期策略,请使用 default_password_lifetime 系统变量。在 5.7.11 版本之前,默认的 default_password_lifetime 值为 360(密码大约每年必须更改一次),之后的版本默认值为 0,表示密码不会过期。此参数的单位是天,比如我们可以将此参数设置为 90 ,则表示全局密码自动过期策略是 90 天。

 

  1. # 设置全局过期策略 先手动更改再加入配置文件 
  2. mysql> SET GLOBAL default_password_lifetime = 90; 
  3. Query OK, 0 rows affected (0.01 sec) 
  4.  
  5. mysql> show variables like 'default_password_lifetime'
  6. +---------------------------+-------+ 
  7. | Variable_name             | Value | 
  8. +---------------------------+-------+ 
  9. | default_password_lifetime | 90    | 
  10. +---------------------------+-------+ 
  11. 1 row in set (0.00 sec) 
  12.  
  13. # 写入配置文件使得重启生效 
  14. [mysqld] 
  15. default_password_lifetime = 90 

尽管可以通过将过期的密码设置为当前值来“重置”它,但出于良好的 Policy 考虑,最好选择其他密码。

总结:

本篇文章主要介绍了关于数据库密码的两项安全策略,密码复杂度加上密码过期策略,多一份策略多一份安心。要记住:安全无小事。

来源:MySQL技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯