最近几周,有关 NoSQL 漏洞的报道数量有所增加,这些报道涉及 一般情况,但也具体涉及到 那些 与 Redis 相关的漏洞。后者很可能是 Salvatore Sanfilippo 的博客文章“关于 Redis 安全的几点说明”的结果。那篇文章只是点燃了火苗,我认为,这些漏洞的根源早就埋下了。而且它们仍然存在,除非你采取措施。但在继续这个故事之前,我要提醒大家 3 个关键点和 1 个重要说明。
注意:如果您使用的是 Redis Enterprise Cluster 或 Redis Cloud,那么您可以放心,这些服务器未受到此次攻击的破坏。虽然可以用我们的解决方案创建未受保护的 Redis 数据库,但我们绝大多数用户的数据库(无论是直接用户还是 PaaS 合作伙伴)都至少使用了一种我们提供的安全措施(例如密码保护、源 IP/子网白名单和 SSL)。此外,由于我们的解决方案提供了独立的操作和功能接口,因此即使未受保护的数据库也无法完全受到此类攻击的影响。也就是说,如果您的数据库未受保护,那么您的数据仍然有风险,您真的应该采取措施解决这个问题(提示:设置密码)。
回到漏洞的起源。Salvatore 在他的博客文章中用他一贯的坦率概括了 Redis 的安全模型:“让不受信任的客户端访问系统非常不安全,请自行保护系统免受外部世界的攻击。”为了说明“完全不安全”到底有多不安全,Salvatore 展示了如何使用未受保护的 Redis 数据库访问运行它的服务器。
这里很重要的一点是,如果您使用的是 Redis,您必须注意安全。一旦 Redis 没有在沙箱环境中运行,您(或您的 Redis 提供商)就必须采取必要的措施来妥善保护它。Redis 数据库可以得到适当的保护 - 这里有一个 文档页面,可以帮助您开始进行这样的保护。保护 Redis 的第一步是阅读文档。Redis 拥有很棒的官方文档(不仅仅是我这么说 - 四处看看)以及 大量其他在线材料。
Redis 的默认密码设置为无。确保设置密码,并设置一个不寻常的密码。您的安全性只取决于您采取的预防措施。
第二步是真正关注默认值。信任默认值可以为您服务,就像闭着眼睛开车,信任道路会按照您的意愿弯曲一样。除非您完全控制并记住了这条路,否则您几乎不可能到达目的地。您最好还是睁开眼睛。在谈到默认值时,使用它们的唯一安全方法是了解它们,这意味着 - 您猜对了 - 睁开眼睛阅读它们的 文档或雇用一名司机。
Salvatore 的博客文章在互联网上引起了很大的反响,最初激发了“脚本小子”出于娱乐目的破解未受保护的服务器,但最终也被专业网络罪犯用来牟利。似乎也有一位 白帽子黑客(艺术家的描绘)为未受保护的服务器设置密码。令人遗憾的是,已经造成了如此大的损失,但如果不是公开化,这个“漏洞”可能大多数人都会忽视,其后果也不为人知。它并非旨在成为教训,但我们应该从中吸取教训,不要把安全视为理所当然。
Redis 的未来版本将包含更安全的默认值(今天发布的 v3.2 版本的候选版本绑定到 127.0.0.1 而不是 0.0.0.0,而且 RC2 将默认启用新的protected-mode
)甚至可能包含 改进的安全机制,但保护数据库的责任始终在操作者身上。如果您在暴露在外部世界中的环境中操作自己的 Redis 数据库,您应该审查您已实施的安全措施,并确保您已受到保护。如果您没有使用任何安全措施,我建议您至少将您的服务器视为可疑对象(如果可能,将其删除并从头开始) - 它很可能已经被入侵。