dot Redis 8 来了——而且是开源的

了解更多

使用 Stunnel 保护 Redis

使用 Stunnel 保护 Redis 客户端和服务器

如果您想保护对 Redis 的访问,您该怎么办? 纯密码身份验证(即 AUTH 命令)只能帮助您到此为止,在某些情况下,您需要更强大的东西。 您可以通过多种方式来实现这一点,例如防火墙保护您的 Redis 或使用 spiped,但是(后-心脏出血)SSL 仍然是我的最爱之一。 以下文章解释了如何使用 stunnel 在您的 Redis 客户端和服务器之间建立安全(读取已验证和加密)的通信通道。 当然,这是自己动手做的核心方法,因此如果您想拥有 Redis 和 SSL,而又不想进行繁重的工作,请查看我们的计划和 原生支持 SSL 的 Redis 客户端

— Itamar

以下帖子最初出现在 Benjamin Cane 的博客上,2014 年 2 月 18 日,网址为 通过带有 stunnel 的 SSL 隧道发送 redis 流量

最近,如果您一直关注科技甚至主流媒体,您可能已经看到了一些关于数据泄露的故事。 有时,这些数据泄露使攻击者能够收集未加密的密码或信用卡号。 过去,这些类型的攻击仍然发生,但不如今天那么多,而且发生时会被保密。 随着越来越多的基于互联网的服务成为人们生活的一部分,攻击者寻找敏感数据的目标也越来越多。

这些攻击者通常非常狡猾地获取这些数据,很多时候他们通过访问数据库来做到这一点,但另一个常见的地方是通过未加密的网络流量来捕获和窃取数据。 许多常用的服务要么不支持 SSL 加密,要么很少使用该选项。 Redis 是一种分布式内存缓存,是一种较新的服务,目前不支持 SSL 连接。 我最近一直在我的一个副项目中使用 Redis,但我一直发现自己受到缺乏 SSL 加密的限制。

Redis 安全性

Redis 设计用于受信任的专用网络中,并且不支持 SSL 加密连接。 虽然这对于许多实现来说没问题,但它不利于基于云的实现。 虽然一些云提供商提供专用网络,但并非所有云提供商都提供。 因此,如果您想在一台服务器上运行 Redis 主服务器,并在另一台服务器上运行您的应用程序,您别无选择,只能使该连接保持未加密状态。 让敏感流量通过云提供商的网络甚至一般的互联网发送,而没有任何保护,免受网络嗅探器的侵害。

在本文中,我将向您展示如何使用 stunnel 保护您的 Redis 连接。 本文应处理保护连接的 SSL 部分,但您还应遵循 Redis 安全性中的其他建议。

什么是 stunnel

stunnel 应用程序是一个 SSL 加密包装器,可以通过 SSL 加密隧道将未加密的流量(如 redis)隧道传输到另一台服务器。 虽然 stunnel 添加了 SSL 加密,但它不能 100% 保证流量永远不会被捕获为未加密状态。 如果攻击者能够入侵服务器或客户端服务器,他们可以捕获发送到 stunnel 的未加密的本地流量。

使用 stunnel 将 redis 流量包装在 SSL 中

在今天的文章中,我们将使用 stunnel 加密从**客户端**主机到**服务器**主机的流量。 我们将在**客户端**和**服务器**主机上都安装 stunnel,并建立一个隧道,将**客户端**上的 localhost:6379 重定向到在**服务器**上运行的 redis 实例。

设置服务器主机

我们将首先安装 redis,然后设置 stunnel 以将来自外部源的连接转发到本地 redis 实例。

安装 redis-server 包

要安装 redis,我们将使用 apt-get

root@server:~# apt-get install redis-server

配置 redis-service

安装后,我们只需要对 redis 配置进行一项更改。 为了提高安全性,我们将启用 requirepass,这要求所有客户端在能够从 redis 实例拉取或放置数据之前进行身份验证。

root@server:~# vi /etc/redis/redis.conf

查找

# requirepass foobared

替换为

requirepass <yourpass>

示例

requirepass foobared

重新启动 redis 服务

安装后,会自动启动 redis-server,为了使我们的配置更改生效,我们需要重新启动该实例。

root@server:~# /etc/init.d/redis-server restart

安装 stunnel

现在 redis 已安装并正在运行,我们将安装 stunnel。 为了方便起见,我们也将使用 apt-get 安装 stunnel。

root@server:~# apt-get install stunnel4

在启动时启动 stunnel

与 redis 不同,stunnel 不会自动在启动时启动。 要在启动时启动 stunnel,我们需要编辑 /etc/default/stunnel 文件。

root@server:~# vi /etc/default/stunnel4

查找

ENABLED=0

替换为

ENABLED=1

创建自签名证书

像任何其他 SSL 协议一样,stunnel 需要一个证书才能用于客户端到服务器的通信。 虽然您可以从 Verisign 等证书颁发机构获取签名证书,但由于我们仅将其用于内部目的,因此我们可以创建一个自签名证书。

生成密钥

首先,我们将创建一个私钥,我使用 openssl 创建一个 4096 位 RSA 密钥。 在我的示例中,我使用 4096 位密钥,因为它比 1024 或 2048 位密钥增加了更多安全性

root@server:~# openssl genrsa -out /etc/stunnel/key.pem 4096
创建证书

现在我们生成了一个密钥,我们将创建一个证书。 生成证书时,系统会问您一系列问题; 提供的答案用于证明证书的有效性。 -days 标志指定此证书的有效天数,如果需要,您可以修改此标志,但 5 年应该足够了。

root@server:~# openssl req -new -x509 -key /etc/stunnel/key.pem -out /etc/stunnel/cert.pem -days 1826

由于这实际上仅用于内部通信,因此这些问题没有正确或错误的答案,但是以下示例可以用作回答证书问题的指南。

示例

root@server:~# openssl req -new -x509 -key /etc/stunnel/key.pem -out /etc/stunnel/cert.pem -days 1826
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:Arizona
Locality Name (eg, city) []:Phoenix
Organization Name (eg, company) [Internet Widgits Pty Ltd]:BenCane.com
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:bencane.com
Email Address []:[email protected]
合并两个文件

我们将密钥和证书合并到一个文件中,供 stunnel 使用。 我们还将更改文件权限以限制谁有权读取这些密钥文件。

root@server:~# cat /etc/stunnel/key.pem /etc/stunnel/cert.pem > /etc/stunnel/private.pem
root@server:~# chmod 640 /etc/stunnel/key.pem /etc/stunnel/cert.pem /etc/stunnel/private.pem

配置 stunnel

默认情况下,stunnel 会读取 /etc/stunnel/ 中的所有 *.conf 文件。我们将创建一个名为 redis-server.conf 的文件,并将我们的配置放置在其中。

root@server:~# vi /etc/stunnel/redis-server.conf

添加

cert = /etc/stunnel/private.pem
pid = /var/run/stunnel.pid
[redis]
accept = <yourexternalip>:6379
connect = 127.0.0.1:6379

示例

cert = /etc/stunnel/private.pem
pid = /var/run/stunnel.pid
[redis]
accept = 10.0.3.65:6379
connect = 127.0.0.1:6379

默认情况下,redis 在端口 6379 上侦听 localhost IP 127.0.0.1。我们的配置使 stunnel 在外部 IP 上 accept 连接,并将连接转发到侦听 127.0.0.1:6379 的 redis 实例。

启动 stunnel

配置文件到位后,我们将启动 stunnel。

root@server:/etc/stunnel# /etc/init.d/stunnel4 start

设置客户端主机

此时,**服务器**主机已设置并准备就绪,我们需要设置**客户端**服务器以使用 stunnel 启动 SSL 隧道。

安装 redis-server

对于此示例,我们也将 redis-server 安装在**客户端**上; 虽然此步骤仅用于安装 redis-cli 工具。 如果您将此设置用于在**客户端**主机上运行的应用程序,则很可能不需要安装 redis-server; 因此请记住,此部分是可选的。

root@client:~# apt-get install redis-server
不要在启动时启动 redis-server

默认情况下,redis 在启动时启动,但是我们不希望 redis 在**客户端**主机上运行。 要禁用 redis 在启动时启动,我们可以使用 update-rc.d 命令。

root@client:~# /etc/init.d/redis-server stop
root@client:~# update-rc.d redis-server disable

安装 stunnel

在**客户端**上安装 stunnel 类似于**服务器**安装,但有一些配置差异。

root@client:~# apt-get install stunnel4

在启动时启动 stunnel

要使 stunnel 在启动时启动,我们需要编辑 /etc/default/stunnel4 文件。

root@client:~# vi /etc/default/stunnel4

查找

ENABLED=0

替换为

ENABLED=1

将证书文件从服务器复制到客户端

为了建立 SSL 连接,我们需要在服务器主机上生成的 private.pem 文件。您应该始终使用此密钥进行良好的证书管理,如果它落入坏人之手,攻击者可以解密之前捕获的任何 SSL 流量

root@client:~# scp [email protected]:/etc/stunnel/private.pem /etc/stunnel/
root@client:~# chmod 640 /etc/stunnel/private.pem

配置 stunnel 客户端

stunnel 客户端配置与服务器配置非常相似,要指定此 stunnel 实例是一个客户端,我们将 client = yes 添加到配置中。

root@client:~# vi /etc/stunnel/redis-client.conf

添加

cert = /etc/stunnel/private.pem
client = yes
pid = /var/run/stunnel.pid
[redis]
accept = 127.0.0.1:6379
connect = <serverip>:6379

示例

cert = /etc/stunnel/private.pem
client = yes
pid = /var/run/stunnel.pid
[redis]
accept = 127.0.0.1:6379
connect = 10.0.3.65:6379

在客户端实例上,acceptconnect 设置与服务器配置相反。 这告诉 stunnel 在本地端口 6379 上监听,并将连接转发到具有端口 6379服务器主机 IP。

启动 stunnel

配置完成后,我们可以启动 stunnel 服务。

root@client:~# /etc/init.d/stunnel4 start

测试连接

现在服务器客户端主机都安装了 stunnel 并建立了 SSL 隧道,我们可以使用 redis-cli 命令连接到客户端上的 localhost 来测试此连接。

root@client:~# redis-cli -h localhost 
redis localhost:6379> auth foobared
OK

此配置的工作方式是,当客户端主机上的客户端连接到本地端口 6379 时,它将通过 stunnel 与服务器主机创建的 SSL 隧道转发,并重定向到在服务器上运行的 redis 实例。 要设置一个应用程序来调用此实例,您只需在客户端主机上安装该应用程序,并使其以与我的示例相同的方式连接到 localhost 上的 redis。

同样的设置也可以用于在 redis 中设置主/从复制,但是从实例需要监听除默认端口 6379 之外的端口。

Benjamin Cane,又名 @madflogo,是 CloudRoutes 的创始人,也是金融服务行业从事高可用性和持续可用性系统的解决方案架构师。 他管理 Linux 和 Unix 系统已有 10 多年。 您可能会发现他正在撰写和分享有关 Linux、Unix、Python、DevOps 和其他各种 Sysadmin 类事物的文章。

访问 Redis 了解更多 Redis 技术。