如何使用 Stunnel 和 redis-cli 通过 TLS 连接受管 Redis 实例

介绍

一个受管理的 Redis实例可以提供高可用性和自动更新等好处. 然而,每次你连接到远程数据库服务器时,你都会冒着恶意行为者(https://en.wikipedia.org/wiki/Sniffing_attack)发送给它的敏感信息的风险。

redis-cli],Redis命令行界面,在TLS上不本土支持连接,这是一种允许通过网络安全通信的加密协议. 这意味着,如果没有进一步的配置,`redis-cli'不是一个连接远程Redis服务器的安全方式。 与被管理的 Redis 实例建立安全连接的方法之一是创建一个使用 TLS 协议的 [通式] (https://en.wikipedia.org/wiki/Tunneling_protocol).

Stunnel是一个开源代理程序,用于创建安全隧道,允许您通过TLS与其他机器进行通信。

前提条件

要完成本指南,您将需要:

  • 访问Ubuntu 18.04服务器。 该服务器应有一个具有行政特权的非终端用户和一个配置有 " ufw " 的防火墙。 要设置此功能,请遵循我们的Ubuntu 18.04初始服务器设置指南.
  • 管理下的Redis数据库实例。 这个教程中概述的步骤在一个数字海洋管理Redis数据库中进行了测试,尽管它们一般应该为来自任何云层提供者的管理的数据库工作。 为了提供一个数字海洋管理Redis数据库,请遵循我们的管理Redis产品文件。 .

步骤 1 — 安装 Stunnel 和 redis-cli

当您安装 Redis 服务器时,它通常附带redis-cli。但是,您可以安装redis-cli而无需 Redis 服务器,通过从默认 Ubuntu 存储库安装redis-tools包。

首先,更新您的服务器的包索引,如果您最近没有这样做:

1sudo apt update

然后安装redis-toolsstunnel4包与APT:

1sudo apt install redis-tools stunnel4

当被提示时,按ENTER来确认您想要安装软件包。

您可以通过运行以下命令来检查 stunnel 是否正确安装,其 systemd服务是否正在工作:

1sudo systemctl status stunnel4
 1[secondary_label Output]
 2 stunnel4.service - LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)
 3   Loaded: loaded (/etc/init.d/stunnel4; generated)
 4   Active: active (exited) since Thu 2019-09-12 14:34:05 UTC; 8s ago
 5     Docs: man:systemd-sysv-generator(8)
 6    Tasks: 0 (limit: 2362)
 7   CGroup: /system.slice/stunnel4.service
 8
 9Sep 12 14:34:05 stunnel systemd[1]: Starting LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)...
10Sep 12 14:34:05 stunnel stunnel4[2034]: TLS tunnels disabled, see /etc/default/stunnel4
11Sep 12 14:34:05 stunnel systemd[1]: Started LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons).

在这里,你可以看到,冲浪服务是活跃的,虽然该过程立即退出. 这告诉我们,冲浪正在运行,但它不能实际上做任何事情,因为我们还没有配置它。

步骤 2 - 配置隧道

现代的 Linux 系统依赖 systemd 来初始化和管理服务和 daemons. 然而,stunnel 使用 SysV 风格的 init 脚本,该脚本基于较旧的 UNIX 系统 V init 系统,用于启动。 您需要修改 /etc/default/stunnel4 文件以启用此 init 脚本。

使用您喜爱的文本编辑器打开此文件. 在这里,我们将使用nano:

1sudo nano /etc/default/stunnel4

在文件顶部找到ENABLED选项. 默认情况下将设置为0,但将此设置更改为1,以允许 stunnel 在启动时启动:

1[label /etc/default/stunnel4]
2# /etc/default/stunnel
3# Julien LEMOINE <[email protected]>
4# September 2003
5
6# Change to one to enable stunnel automatic startup
7ENABLED=1
8. . .

如果您使用nano来编辑文件,请按CTRL+X,Y,然后按ENTER

接下来,您需要创建一个配置文件,该文件将告诉程序它需要路由流量的地方。

/etc/stunnel目录中打开名为stunnel.conf的新文件:

1sudo nano /etc/stunnel/stunnel.conf

将以下内容添加到此文件中:

 1[label /etc/stunnel/stunnel.conf]
 2fips = no
 3setuid = nobody
 4setgid = nogroup
 5pid = /home/sammy/pids/stunnel.pid
 6debug = 7
 7delay = yes
 8[redis-cli]
 9  client = yes
10  accept = 127.0.0.1:8000
11  connect = managed_redis_hostname_or_ip:managed_redis_port

文件中的前五行是 _global 选项,这意味着它们将适用于您在该文件中包含的每个服务:

  • ). 设置为)需要一些额外的配置.
  • `setuid': 定义将运行的 Stunnel 的 Unix 用户ID 。 默认情况下,分流过程由 root** 用户拥有. 然而,地道文档建议,隧道一开通,您就放弃行政特权,因为不这样做将构成安全风险. 将 " setuid " 参数设定为 " 任何人 " 将使** 无人** -- -- 一个没有特权的用户 -- -- 在隧道建成后对地沟进程拥有所有权。
  • setgid': 定义 Stunnel 运行的 Unix 组 ID 。 与setuid'一样,这种配置规定一个没有特权的群体—— 无集团** —— 以避免任何潜在的安全问题。
  • **pid': 定义 stunnel 将创建 .pid' 文件的文件位置,这种文件类型包含进程 [PID] (https://en.wikipedia.org/wiki/Process_identifier) 。 .pid'文件通常被其他程序用来寻找运行过程中的PID. 默认情况下,stunnel在"/var/run/stunnel4/"目录中创建了".pid"文件,但由于** 无人** 用户没有权限访问该目录,会使隧道无法正确启动. 相反,本行在Ubuntu用户主目录中指定了一个名为stunnel.pid'的文件。 我们将很快创建这个目录和 " stunnel.pid " 文件。 当您添加此行时, 请务必将 Sammy 更改为您的 Ubuntu 系统用户名 。
  • 调试: 设置 stunnel 调试级别,调试级别从"0"到"7"不等. 在这个例子中,我们将将其设定为7',即可获得的最高水平,因为如果出现任何问题,这将提供最详细的信息。 您可以设置为您喜欢的级别, 但请注意默认设置为 5 ` 。
  • " 延迟 " :如果设定为 " 是 " ,这个选项会导致DNS对 " 连接 " 选项所列出地址的搜索延迟。 这也将防止斯通内尔被卡通IP地址. 此设置将帮助隧道继续打开, 即使管理中的 Redis 实例已关闭, 当扩大您的集群时也会发生 。 .

剩下的行是 _service-level 选项,只适用于我们将创建的redis-cli隧道:

  • `[redis-cli]': 这是一个 _ service name_,并指定以下行代表客户端程序的单个服务配置. 您可以在stunnel配置文件中拥有多个服务,尽管每个服务都必须与现有的客户端应用程序相关联,并且不能为同一个应用程序拥有两个服务.
  • " 客户 " : 设置为) , 而不是充当 TLS 服务器 。
  • 接受 ': 定义主机和端口,用于接收客户端的连接。 在此,我们具体说明IP地址127.0.0.1',这是一个IPv4回路地址,用于代表 localhost** ,以及端口`8000'。 这意味着Stunnel将监听端口 " 8000 " 上来自Ubuntu服务器的连接并加密它们。 注意, 只要尚未使用, 您可以将端口设置为您喜欢的任何端口编号 。
  • `连接': 定义 Stunnel 将连接到的远程地址和端口。 请确定修改此参数以与您管理的数据库端口和主机名或IP地址保持一致 。 .

注:您在连接指令中应该指定的主机名称或 IP 地址和端口将特定于您自己的管理的 Redis 数据库,这些通常可以在您提供 Redis 实例的云提供商的数据库管理用户界面中找到。

如果您正在使用 DigitalOcean Managed Redis 数据库,您可以通过访问您的 控制面板 并在左侧栏菜单中单击** Databases** ,然后单击您想要连接的 Redis 实例的名称,然后转到** 连接详细信息** 部分。

这是一个相当小的配置,留下许多 stunnel 的默认设置。 该程序有许多选项可供您创建适合您的特定需求的隧道。 查看 官方文档 有关更多细节。

添加此内容后,保存并关闭文件。

接下来,请确保您在Ubuntu用户的家庭目录中:

1cd

然后创建pids目录,其中将包含stunnel.pid文件:

1mkdir pids

Stunnel 过程会自动创建 stunnel.pid 文件,因此您不需要自己创建该文件,但是,您需要将 pids 目录的所有权转移到 nobody 用户和** nogroup** 组:

1sudo chown -R nobody:nogroup pids/

然后,重新启动stunnel4服务,以便 stunnel 读取新的配置文件:

1sudo systemctl restart stunnel4

接下来,您可以通过召唤netstat,一个用于显示网络连接的命令行实用程序来测试stunnel是否成功创建了一个隧道。

1sudo netstat -plunt | grep stunnel
1[secondary_label Output]
2tcp 0 0 127.0.0.1:8000 0.0.0.0:*               LISTEN 17868/stunnel

此输出显示,stunnel正在听取在本地端口8000上的连接。

您还可以确认 nobody 用户已经通过 ps 对 stunnel 流程的所有权,该程序显示了当前运行的所有流程:

1ps aux | grep stunnel
1[secondary_label Output]
2nobody 15674 0.0 0.1 121912 3180 ?        Ssl 19:28 0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf
3. . .

在这里,你可以看到没有人确实接管了冲浪过程。

Stunnel 现在已完全配置并在您的系统上运行,您已经准备好连接到您的管理 Redis 实例,并测试隧道是否按预期运行。

步骤 3 — 通过 TLS 连接到您的管理数据库

现在,您已经在服务器上安装了redis-cli并配置了 stunnel,您已经准备好通过TLS连接到您的管理数据库。

根据在步骤 2 中创建的配置文件中定义的设置,您可以使用以下命令连接到您的管理数据库:

1redis-cli -h localhost -p 8000

这个命令包括h旗,它告诉redis-cli,下一个论点将是要连接的主机。在这种情况下,它是localhost,因为我们正在连接到服务器上本地创建的隧道。

运行该命令后,您将连接到您管理的 Redis 服务器. 您的提示将更改以反映您已连接并处于redis-cli的交互模式:

<$>[注] 注意: 通常,管理数据库的配置要求用户在连接时使用密码进行身份验证。 如果您的管理 Redis 实例需要密码,则可以在redis-cli命令中包含-a旗帜,然后是您的密码:

1redis-cli -h localhost -p 8000 -a password

或者,您可以通过运行auth命令,然后在建立连接后使用您的密码进行身份验证:

1auth password

如果您正在使用数字海洋管理数据库,您可以在您找到主机名和端口的同一地点找到您 Redis 实例的密码 。 在您的 Control 面板 中,请在左侧边栏菜单中点击 ** Database** 。 然后,点击您连接的 Redis 实例的名称 。 向下滚动到** Connection Professional ** 一节,在那里你会找到一个被标注为** Password ** 的字段. 点击** show** 按钮,以显示密码,然后将其复制并粘入其中任一命令——取而代之的是 " 密码 " ——以便认证。 < $ > (美元)

您可以通过在 Redis 互动模式中运行ping命令来测试隧道是否按预期运行:

1ping

如果连接是活的,它会返回PONG:

1[secondary_label Output]
2PONG

但是,如果 stunnel 没有正确地将流量从您的服务器隧道到您的 Redis 实例,您可能会在与 Redis 断开连接之前看到这样的错误消息:

1[secondary_label Output]
2Error: Server closed the connection

如果您收到此或类似的错误,请双重检查您是否在您的 stunnel.conf 文件中正确输入了 Redis 实例的托管名称和端口。

当受管理的 Redis 实例重置其开放连接时,您可能会收到此错误,例如当您扩展集群的配置时。

一旦您确认隧道正在工作,请继续并从您的 Redis 实例中断连接:

1exit

如果您改变了 stunnel 的配置,则需要重新加载或重新启动stunnel4服务,以便 stunnel 注意到这些变化:

1sudo systemctl reload stunnel4

如果在未来的任何时候,你想关闭TLS隧道,你也可以用systemctl这样做:

1sudo systemctl stop stunnel4

隧道关闭后,您可以通过重新启动服务来重新打开隧道:

1sudo systemctl start stunnel4

现在,您已经成功配置了 stunnel,您已经开始将数据添加到您管理的 Redis 实例中,使用redis-cli

结论

Stunnel 是创建 TLS 隧道和建立安全连接到远程服务器的实用工具,这在机器之间安全传输信息至关重要的情况下尤其有用,例如在远程数据库中。

如果你是新手与Redis合作,你可能会发现我们的系列在 如何管理Redis数据库有用。

Published At
Categories with 技术
comments powered by Disqus