在MySQL的日常管理中,密码安全直接关系到数据库的使用,DBA应该在密码管理上特别重视。
密码面临的风险
用户使用密码时,会面临如下风险:
- 使用多种攻击技术,包括社会工程和密钥记录来发现密码
- 利用社会工程猜测密码
- 在系统表或文件中找到密码
注:社会工程意为利用人们在社会中的各种行为、心理、活动等,配上信息技术手段,来获取黑客想要的各种信息。
针对以上风险,MySQL的DBA可以利用如下方法进行防范,降低风险。
- 启用密码过期策略,限制密码暴露
- 启用“validate_password”组件,强制使用复杂度高的“强密码”,防止被攻击者轻易猜测
- MySQL的密码存储在“mysql.user”表中,需要防止不具备管理员权限的用户读取该表,并需要对该表空间文件在操作系统上进行加密
攻击者推导密码的方法
密码在通常情况下通过哈希算法进行处理,但攻击者仍可以通过如下方法推导出密码。
- 蛮力破解算法:通过使用不同的哈希算法将字符进行组合,以匹配密码使用的算法
- 字典攻击:使用字典中的字符执行哈希操作,当用户使用安全性不高的密码时,该方法能够快速推导出密码
- 彩虹表:由重复哈希和简化密码的长链中的第一个和最后一个哈希组成,当攻击者通过相同的算法链运行目标密码哈希,并找到与之匹配的算法链时,攻击者可以通过重播该链来推导密码
MySQL的密码验证组件
MySQL提供了密码验证组件,用以提高密码的安全性。该组件的安装文件名为“component_validate_password.so”保存在“plugin_dir”变量指定的路径下。组件安装成功后,该组件提供几个变量,通过对变量进行设置,以达到不同级别的密码安全要求。
validate_password.policy:强制开启验证密码,默认值为1(MEDIUM),检查密码的长度、数字、小写/大写和特殊字符。如果设置为2(STRONG)需要额外检查字典文件(与字典中的字符匹配将无法作为密码使用),并需要通过"validate_password.dictionary_file“变量指定字典文件。
validate_password.check_user_name:用于检查密码中是否包含用户名,默认情况下开启。
用户可以动态配置变量值,例如,
代码语言:javascript复制mysql> SET GLOBAL validate_password.policy = 2;
mysql> SET GLOBAL validate_password.length = 12;
也可以将变量值写入配置文件,持久化保存。
与之相关联的变量可以通过SHOW语句查看:
代码语言:javascript复制mysql> SHOW VARIABLES LIKE 'validate_password.%';
------------------------------------------------- --------
| Variable_name | Value |
------------------------------------------------- --------
| validate_password.changed_characters_percentage | 0 |
| 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 |
------------------------------------------------- --------
MySQL用户除了使用上述的密码验证组件强化密码,还可以考虑从以下两方面增加密码的安全性:
- 为root用户设置强密码
- 为全部用户的密码指定使用期限,通过”default_password_lifetime“进行配置