MySQL 8.0 是 MySQL 数据库管理系统的一个重要版本更新,带来了众多显著的改进和新特性,极大地提升了数据库的性能、安全性和易用性。
而密码策略在数据库安全中起着关键作用,主要包括:
- 防止未经授权访问:通过强密码和复杂度要求,防止暴力破解和字典攻击。
- 增强密码管理:定期更换密码和限制密码重用,降低密码泄露风险。
- 应对内部威胁:减少内部人员因密码弱或重复使用带来的安全漏洞。
- 提高事件响应能力:通过密码锁定机制,防止多次失败登录尝试后的持续攻击。
- 合规性和监管要求:确保符合相关法规和标准,避免法律风险。
- 提升用户安全意识:促使用户养成良好的密码管理习惯,整体提升安全水平。
概述
那密码策略是什么呢?
密码策略是指一组规则和要求,旨在确保用户密码的复杂性和安全性,包括密码长度、复杂度、过期时间等。其重要性在于防止未经授权访问,减少密码泄露风险,确保合规性,并提高整体系统的安全性。
而在MySQL 8.0中,密码策略具有以下主要特点:
- 密码过期:允许配置密码有效期,强制用户定期更新密码。
- 密码历史:限制用户不能重复使用最近使用过的密码,增加密码更换的安全性。
- 密码重用限制:防止使用旧密码,提高安全性。
- 密码管理插件:通过插件实现更灵活的密码策略配置和管理。
- 账户锁定:多次失败的登录尝试后锁定账户,防止暴力破解。
密码策略配置详解
新增caching_sha2_password鉴权插件
caching_sha2_password鉴权插件是 MySQL 8.0 中用于用户认证的插件,具备以下特点:
- 更强加密:使用 SHA-256 算法,提高密码加密的安全性。
- 缓存机制:首次认证后缓存密码信息,加速后续连接的认证过程。
- 双重认证:支持非交互式和交互式认证,确保安全的同时提升性能。
- 防攻击能力:抵御彩虹表和暴力破解等常见密码攻击。
可以通过以下命令查看当前数据库默认的鉴权插件是什么。
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升级后的密码策略通过设定密码复杂度、历史限制和锁定机制等,提升了数据库安全性,防止了未经授权的访问,减少了内部威胁,符合合规性要求,促进用户安全意识,从而保护生产数据的完整性和保密性。