亚马逊AWS官方博客

OpenSource | Redis 开放传输中加密功能

图解 Elasticache 传输中加密

Amazon Web Services 今天在 redisconf 上宣布向 Redis 开放传输中加密功能的源代码,Redis 是领先的内存中键值数据存储。适用于 Redis 的 Amazon ElastiCache去年增加了传输中加密功能,帮助我们的客户加密 Redis 数据集并满足合规性要求。

我们听取客户意见并设计了解决方案,为他们提供重要的使用案例。现在,我们要将这一功能提供给 Redis 社区,以便所有人都可以保护实时应用程序,并对客户端与 Redis 服务器之间以及各 Redis 服务器之间(主节点和只读副本节点)的所有通信进行加密。

Redis 是由一个非常活跃的开源社区开发的,它是一款快速的开源内存中键值数据存储,可用作数据库、缓存、消息代理和队列。它可以实现亚毫秒级的响应时间,每秒处理数百万个请求,为游戏、广告技术、金融服务、医疗保健和 IoT 等实时应用提供支持。

Redis 是缓存、会话管理、实时分析、地理空间、聊天/消息收发、媒体流和游戏排行榜的热门选择,它在键值存储中排名第一,并且最近在 2018 Stack Overflow 调查报告中被开发人员评为最受欢迎的数据库。随着开发人员在构建实时应用程序时对 Redis 的依赖性日益增加,迫切需要我们遵守合规性要求并保护个人身份信息 (PII) 等敏感数据的传输。例如,医疗保健应用程序开发人员需要遵从 HIPAA 且需要使用传输中加密,以将 Redis 用作缓存来传输电子健康记录,实现低延迟访问。同样,开发人员在使用 Redis 作为内存中数据存储构建面向消费者的移动金融应用程序时,需要使用传输中加密功能确保用户和信用卡数据传输的安全。

但是,开源 Redis 并不支持加密。如果开发人员想要利用 Redis 构建安全的实时应用程序,需要借助自托管的加密解决方案(例如 SSL 代理或商用 Redis 产品)。在 SSL 代理方法中,代理位于 Redis 服务器之前,对客户端与 Redis 服务器之间的流量进行加密和解密。对于具有多个主节点 (master) 的 Redis 集群,需要额外的代理来加密各主节点间的通信。

使用 Redis 集群设置“stunnel”之类的代理时,必须针对每个节点为集群总线通信和复制链路间的通信正确设置多个端口转发。这使得设置、持续维护和扩展变得困难,而且容易出错。与基于代理的解决方案相比,我们对开源 Redis 的贡献在于在 Redis 内部实现了本机传输中加密支持。我们的加密连接设置方法的一个关键优势是握手进程是非阻塞的,并且在 Redis 中扩展了默认连接协商进程。启用传输中加密功能后,主节点和副本节点(基于磁盘或无盘)之间的数据同步以及所有集群总线通信均将被加密。我们的传输中加密使用 Amazon s2n 库进行加密操作。s2n 是 TLS/SSL 协议的开源 (Apache License 2.0) 实现,其设计简单、小巧、快速、安全。s2n 具有一个小型、可审计的代码库,可进行常规静态分析、模糊测试和渗透测试(包括正负向单元测试以及端到端测试案例),可尽快加密或擦除明文数据,并且避免执行很少使用的选项和扩展程序。您无需修改应用程序即可在 Redis 中使用传输中加密功能。您只需要一个支持传输中加密的客户端,然后确保将相关标记设置为“true”。

目前支持传输中加密的客户端有很多,包括 Jedis for Java 和 redis-py for Python。除了对客户端和 Redis 服务器之间以及各 Redis 服务器(主节点和只读副本节点)之间的所有通信进行加密外,此新功能还简化了证书续订。在实施过程中,续订证书无需停机,也无需重新启动集群。您可以在 GitHub 上查找代码自述文件。您可以通过以下方式加入使用行列:检查和测试代码、在 pull request 上发表评论、提交问题,或者提交 pull request 以向 GitHub 存储库增加新功能。我们期待收到您的反馈!


同时,感谢 Manoj Kumar 对此项工作的辛苦付出。