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

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

相关推荐
Fleshy数模3 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
az44yao4 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
秦老师Q5 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
橘子136 小时前
MySQL用户管理(十三)
数据库·mysql
Dxy12393102166 小时前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋6 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣506 小时前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
人道领域7 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
千寻技术帮8 小时前
10404_基于Web的校园网络安全防御系统
网络·mysql·安全·web安全·springboot
spencer_tseng9 小时前
MySQL table backup
mysql