问题:Redis默认是没有设置密码
调研:Redis默认没有设置密码是因为它的设计目标是追求高性能和低延迟。
当Redis配置文件中启用密码后,客户端连接Redis时需要进行密码验证。这个验证过程会增加CPU的负载,并可能导致链接响应时间变长,从而影响整体系统性能。特别是在处理大量并发连接时,密码验证可能会成为系统的瓶颈。此外,如果Redis和客户端位于不同的机器上,并且两者之间的网络延迟较高,密码验证的时间也会增加,进一步影响连接速度。
在默认情况下,Redis假设运行在受信任的环境中,例如内部网络或受限制的访问环境中。因此,密码认证的额外开销可能会影响其性能表现。
子问题:那为什么Redis要支持设置密码呢?
调研:Redis的作者认为,对于需要访问Redis的人员应该具有足够的权限和访问控制,以保证系统的安全性。如果Redis服务器部署在没有合适保护措施的公共网络上,或者需要加强对未经授权访问的防范,建议使用密码进行身份验证。
测试:redis启动配置中增加requirepass,设置密码,测试性能和不设置基本没有区别。
分析:通过测试可观察到在毫秒级的测试精度下,加密码和不加密码性能几乎没有区别。建议新建集群直接采用加密码的方式。对之前有业务的集群咱们后面再分析。
问题:Redis除了密码认证,还有哪些措施可以保证其安全性?
方案1:修改绑定地址:默认情况下,Redis只绑定到本地回环地址(127.0.0.1)。您可以更改bind指令,让Redis监听其他网络接口。例如,要将Redis绑定到所有可用接口,您可以将其更改为:
bind 0.0.0.0
要指定某些IP,也只需要绑定特定IP即可,可参考下面官方注释:
但这样,应用要增加部署机器,扩容时,就要手动修改配置,很麻烦了。
方案2:使用防火墙:确保您的服务器防火墙规则只允许受信任的IP地址、者地址段、端口访问Redis端口。因为本身对于其他应用也需要设置严格的防火墙策略,各个大厂都在做防火墙策略收敛,强烈推荐此方式。
其他一些通用安全防御方案,可参考之前写的《红蓝攻防、红蓝对抗》。下面来说一下,如果redis老集群没有密码要改成需要密码,做平滑升级,需要哪些步骤:
1、新建集群B,设置连接需要密码,区别于原来的老集群A不需要密码
2、客户端做双写,老集群A和新集群B的数据同步更新
3、同步老集群A的历史数据到新集群B,并进行数据一致性校验
4、灰度发布客户端改成使用新集群B。
从上面步骤可以看出,成本还是蛮高的。必要性有多少呢?这样来看,咱们数据库连接都是要用户名密码的,因为一个数据库建议只有一个应用来连,知道密码的人是有限的。而且数据库密码一般都是加密的。
而redis密码是明文写在配置文件中的,如果内网被攻破了,黑客可以直接访问配置文件,密码意义还大吗?本身redis集群是公用基础设施,可能一个公司就一套集群,这意味着所有开发都需要知道用户名密码,范围这么大了,密码的意义还大吗?