聊聊Mysql8.0中新增的密码策略

MySQL 8.0 是 MySQL 数据库管理系统的一个重要版本更新,带来了众多显著的改进和新特性,极大地提升了数据库的性能、安全性和易用性。

而密码策略在数据库安全中起着关键作用,主要包括:

  1. 防止未经授权访问:通过强密码和复杂度要求,防止暴力破解和字典攻击。
  2. 增强密码管理:定期更换密码和限制密码重用,降低密码泄露风险。
  3. 应对内部威胁:减少内部人员因密码弱或重复使用带来的安全漏洞。
  4. 提高事件响应能力:通过密码锁定机制,防止多次失败登录尝试后的持续攻击。
  5. 合规性和监管要求:确保符合相关法规和标准,避免法律风险。
  6. 提升用户安全意识:促使用户养成良好的密码管理习惯,整体提升安全水平。

概述

那密码策略是什么呢?

密码策略是指一组规则和要求,旨在确保用户密码的复杂性和安全性,包括密码长度、复杂度、过期时间等。其重要性在于防止未经授权访问,减少密码泄露风险,确保合规性,并提高整体系统的安全性。

而在MySQL 8.0中,密码策略具有以下主要特点:

  1. 密码过期:允许配置密码有效期,强制用户定期更新密码。
  2. 密码历史:限制用户不能重复使用最近使用过的密码,增加密码更换的安全性。
  3. 密码重用限制:防止使用旧密码,提高安全性。
  4. 密码管理插件:通过插件实现更灵活的密码策略配置和管理。
  5. 账户锁定:多次失败的登录尝试后锁定账户,防止暴力破解。

密码策略配置详解

新增caching_sha2_password鉴权插件

caching_sha2_password鉴权插件是 MySQL 8.0 中用于用户认证的插件,具备以下特点:

  1. 更强加密:使用 SHA-256 算法,提高密码加密的安全性。
  2. 缓存机制:首次认证后缓存密码信息,加速后续连接的认证过程。
  3. 双重认证:支持非交互式和交互式认证,确保安全的同时提升性能。
  4. 防攻击能力:抵御彩虹表和暴力破解等常见密码攻击。

可以通过以下命令查看当前数据库默认的鉴权插件是什么。

sql 复制代码
show variables like 'default_authentication_plugin';

若是想查询各个用户的鉴权插件插件都是什么,则可以使用:

sql 复制代码
select user,host,plugin from mysql.user;

这里可以看到我将root用户的鉴权插件改回了5.7的mysql_native_password,是因为 在刚升级mysql8的时候,我们有小伙伴连不上mysql服务了。就是这个鉴权插件的问题,并且这只是个内部访问的测试环境,权衡之下将其改回了原来的mysql_native_password

可以使用如下命令修改

sql 复制代码
alter user 'root'@'%' identified with caching_sha2_password by '123456';

密码过期策略

我们可以设置在某个时间范围内将密码进行过期淘汰,可以通过全局的 default_password_lifetime 变量来进行设置,如果值为0表示,禁用密码淘汰策略,如果值为一个正数,表示在每N天必须要进行密码的修改。

可以通过如下命令来查看当前数据库的密码过期时间:

sql 复制代码
show variables like 'default_password_lifetime';

根据上文所说,这里的0就表示禁用了密码淘汰策略。

可以使用如下命令去修改这个值:

sql 复制代码
SET PERSIST default_password_lifetime = 180;

如果需要给某个特殊的用户设置密码过期时间,可以通过如下命令来实现:

我们先创建一个用户luke:

sql 复制代码
create user 'luke'@'%' password expire interval 90 day;

这时候查看用户的密码过期时间

sql 复制代码
select user,host,password_lifetime from mysql.user;

若是只想修改这一个用户的密码过期时间则使用如下命令:

sql 复制代码
alter user 'luke'@'%' password expire interval 180 day;

当然也可以禁用某个用户的密码过期策略

sql 复制代码
alter user 'luke'@'%' password expire never;

也可以指定某个用户使用全局的密码过期策略

sql 复制代码
alter user 'luke'@'%' password expire default;

密码历史和重用限制

在mysql8.0中允许对以前的密码重用进行限制,可以根据密码更改的次数和经过的时间同时建立重用限制。也就是说,前几次用过的密码不能用,多久时间内用过的密码不能用

这里有两个值,几次多久

几次

这个变量用于根据所需的最小密码更改次数来控制以前密码的重用

sql 复制代码
show variables like 'password_history';

这样修改,我们设置最近修改过三次的密码不能再次使用

sql 复制代码
SET PERSIST password_history = 3;

若是想修改某一个用户的值,可以这样:

sql 复制代码
alter user 'luke'@'%' password history 10;

多久

用于根据经过的时间控制以前密码的重用

sql 复制代码
show variables like 'password_reuse_interval';

修改的话是这样,假如我们设置180天内用过的密码不能再使用。

sql 复制代码
SET PERSIST password_reuse_interval = 180;

若是想修改某一个用户的值,可以这样:

sql 复制代码
alter user 'luke'@'%' password reuse interval 180 day;

最终我们可以得到这样的结果,限制最近10次修改的密码不能重复使用,并且180天内使用过的密码不能再次使用。

密码锁定机制

在mysql8.0中引入了账户锁定策略

比如我们限制从同一主机来源的连续错误连接次数为 10 次(这个值默认是100)

sql 复制代码
SET GLOBAL max_connect_errors = 10;

我们创建一个用户并设置锁定策略:当用户连续 5 次登录失败时,账户会被锁定 2 天。

sql 复制代码
CREATE USER 'luke2'@'%' IDENTIFIED BY '123456' FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 2;

我们尝试错误登录5次之后:

当然我们也可以修改策略:

sql 复制代码
ALTER USER 'luke2'@'%' FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 2;

也可以通过以下命令主动锁定某个用户:

sql 复制代码
ALTER USER 'luke'@'%' ACCOUNT LOCK;

这样,luke用户就登陆不了了。

当解锁后:

sql 复制代码
ALTER USER 'luke'@'%' ACCOUNT UNLOCK;

则又可以登录了

密码策略的最佳实践

定期更新密码

  • 用户应该定期更新密码,通常建议每 90 天至 180 天更新一次。
  • 定期更换密码可以降低密码泄露的风险,也就是他拿前朝的刀斩不了今朝的臣。

使用强密码生成工具

  • 强密码生成工具可以生成具有高强度的随机密码,包括足够长度的字符组合。
  • 使用密码管理器来生成和存储密码是一个好习惯,可以确保密码的复杂性和唯一性。

多因素认证结合

  • 多因素认证结合密码策略可以提高用户身份验证的安全性。
  • 多因素认证通常结合了至少两种不同的身份验证因素,如密码、智能卡、生物识别特征等。

密码长度和复杂度要求

  • 密码长度应该足够长,一般建议至少12个字符。
  • 密码应该包含不同类型的字符,包括大写字母、小写字母、数字和特殊字符。

密码历史和重用限制

  • 禁止用户在一定时间内重复使用过去的密码,以确保密码的唯一性和安全性。

密码锁定机制

  • 设置密码尝试次数的阈值,当用户连续多次使用错误的密码尝试登录时,自动锁定用户账户一段时间。
  • 锁定用户账户可以防止暴力破解攻击。

密码教育和培训

  • 对用户进行密码安全意识教育和培训,教导他们如何创建安全密码、如何安全地存储和管理密码等。
  • 提供定期的安全意识培训,以确保用户了解最新的密码安全最佳实践和安全威胁。

总结

时代在进步,MySQL 8.0升级后的密码策略通过设定密码复杂度、历史限制和锁定机制等,提升了数据库安全性,防止了未经授权的访问,减少了内部威胁,符合合规性要求,促进用户安全意识,从而保护生产数据的完整性和保密性。

生产上更安全了,加班可能也就少了吧。

相关推荐
Stara05111 小时前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
不爱学习的啊Biao2 小时前
初识mysql数据库
数据库·mysql·oracle
是桃萌萌鸭~4 小时前
mysqldbcompare 使用及参数详解
数据库·mysql
小草儿7994 小时前
gbase8s之mysql的show命令实现
数据库·mysql
daiyang123...6 小时前
MySQL【知识改变命运】11
android·数据库·mysql
licy__8 小时前
正则表达式语法详解(python)
数据库·mysql·正则表达式
郭梧悠9 小时前
HarmonyOS(57) UI性能优化
ui·性能优化·harmonyos
奈斯ing10 小时前
【Oracle篇】SQL性能优化实战案例(从15秒优化到0.08秒)(第七篇,总共七篇)
运维·数据库·sql·oracle·性能优化
zhangshengqiang16810 小时前
Linux下安装mysql8.0版本
linux·mysql
Karoku06610 小时前
【企业级分布式系统】ELK-企业级日志分析系统
运维·数据库·redis·mysql·elk·缓存