介绍
一个受管理的 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-tools
和stunnel4
包与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数据库有用。