如何在 Ubuntu 20.04 上安装并保护 Memcached

此教程的早期版本是由 Kathleen Juell编写的。

介绍

Memcached 等内存对象缓存系统可以通过暂时存储信息到内存中来优化后端数据库性能,并保留经常或最近请求的记录,从而减少对数据库的直接请求数量。

在本指南中,您将学习如何安装和配置 Memcached 服务器. 您还将学习如何使用 Simple Authentication and Security Layer (SASL) 添加身份验证来保护 Memcached。

前提条件

要遵循本教程,您将需要:

有了这些先决条件,您将准备好安装和保护您的 Memcached 服务器。

步骤 1 – 安装 Memcached

如果您尚未在您的服务器上安装 Memcached,您可以从官方 Ubuntu 存储库中安装它。

1sudo apt update

接下来,安装官方包如下:

1sudo apt install memcached

您还可以安装libmemcached-tools,这是一个包含各种工具的包,您可以使用它来检查,测试和管理您的Memcached服务器。

1sudo apt install libmemcached-tools

Memcached 现在应该作为服务在您的服务器上安装,以及允许您测试其连接的工具。

要启动 Memcached,请运行以下systemctl命令:

1sudo systemctl start memcached

现在您可以继续保护其配置设置。

步骤 2 — 配置 Memcached 网络设置(可选)

如果您的 Memcached 服务器只需要使用 TCP 支持本地 IPv4 连接,则您可以在本教程中跳过本节并继续使用 步骤 3

首先,请确保您的 Memcached 实例在本地 IPv4 循环返回接口中收听 127.0.0.1. 与 Ubuntu 和 Debian 搭配的 Memcached 的当前版本有其 -l 配置参数设置为本地接口,这意味着它已配置为仅接受来自运行 Memcached 的服务器的连接。

检查 Memcached 是否目前与本地 IPv4 接口127.0.0.1绑定,并使用ss命令只听 TCP 连接:

1sudo ss -plunt

不同的旗帜将以以下方式改变ss输出:

  • -p 添加使用接口 的过程名称 * -l 仅限输出到听取接口,而不是还包括连接到其他系统的接口
  • -u 在输出中包含基于 UDP 的接口
  • -n 在输出中显示数字值,而不是人类可读的名称和值
  • -t 在输出中包含基于 TCP 的接口

您应该获得如下类型的输出:

1[secondary_label Output]
2Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process                                         
3. . .
4tcp LISTEN 0 1024 127.0.0.1:11211 0.0.0.0:*          users:(("memcached",pid=8889,fd=26))
5. . .

此输出确认memcached与仅使用 TCP 协议的 IPv4 loopback 127.0.0.1 地址绑定。

现在,您已经确认 Memcached 已配置为仅支持 TCP 连接的 IPv4,您可以编辑 `/etc/memcached.conf’ 以添加对 UDP、Unix 域接口或 IPv6 连接的支持。

IPv6 配置

要启用 IPv6 连接到 Memcached,请使用nano或您喜爱的编辑器打开 `/etc/memcached.conf’ 文件:

1sudo nano /etc/memcached.conf

首先,在文件中找到下列行:

1[label /etc/memcached.conf]
2. . .
3-l 127.0.0.1

此行为 Memcached 配置为在本地 IPv4 接口上收听。 若要添加 IPv6 支持,请添加包含 IPv6 本地 loopback 地址(::1)的行,如下:

1[label /etc/memcached.conf]
2. . .
3-l 127.0.0.1
4-l ::1

保存并关闭文件,按CTRL+O,然后按ENTER,以保存,然后按CTRL+X,以退出nano

1sudo systemctl restart memcached

现在,您可以通过重复上一节中的 ss 命令来验证 Memcached 是否也在收听 IPv6 连接:

1sudo ss -plunt

您应该获得如下类型的输出:

1[secondary_label Output]
2Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process                                         
3. . .
4tcp LISTEN 0 1024 127.0.0.1:11211 0.0.0.0:*          users:(("memcached",pid=8889,fd=26))           
5. . .
6tcp LISTEN 0 1024                     [::1]:11211                    [::]:*          users:(("memcached",pid=8889,fd=27))

突出的输出部分表明,Memcached 现在正在听取本地 IPv6 接口上的 TCP 连接。

请注意,如果您想禁用 IPv4 支持,并且只听 IPv6 连接,则可以从 /etc/memcached.conf 删除 -l 127.0.0.1行,然后使用systemctl` 命令重新启动服务。

配置 UDP

如果您想与 UDP 接口一起使用 Memcached,则可以通过编辑 /etc/memcached.conf 配置文件来启用 UDP 支持。

使用nano或您喜爱的编辑器打开/etc/memcached.conf,然后将下列行添加到文件的末尾:

1[label /etc/memcached.conf]
2. . .
3-U 11211

如果您不需要 TCP 支持,请找到 -p 11211 行,然后将其更改为 -p 0 以禁用 TCP 连接。

当您完成编辑文件时,通过输入CTRL+O来保存,然后CTRL+X来退出来保存和关闭它。

接下来,使用systemctl命令重新启动您的 Memcached 服务以应用您的更改:

1sudo systemctl restart memcached

检查 Memcached 是否使用 ss -plunt 命令再次聆听 UDP 连接:

1sudo ss -plunt

如果您禁用了 TCP 支持并启用了 IPv6 连接,则应收到如下输出:

1[secondary_label Output] 
2Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process                                         
3. . .
4udp UNCONN 0 0 127.0.0.1:11211 0.0.0.0:*          users:(("memcached",pid=8889,fd=28))
5udp UNCONN 0 0                        [::1]:11211                    [::]:*          users:(("memcached",pid=8889,fd=29))
6. . .

请注意,如果您只启用了 IPv4 连接,并且已启用了 TCP 连接,则输出可能会有所不同。

配置 Unix 域名插件

如果您想使用 Memcached 与 Unix 域接口,则可以通过编辑 `/etc/memcached.conf’ 配置文件来启用此支持,请注意,如果您将 Memcached 配置为使用 Unix 域接口,则 Memcached 将禁用 TCP 和 UDP 支持,因此在启用接口支持之前,请确保您的应用程序不需要使用这些协议连接。

使用nano或您喜爱的编辑器打开/etc/memcached.conf,然后将下列行添加到文件的末尾:

1[label /etc/memcached.conf]
2. . .
3-s /var/run/memcached/memcached.sock
4-a 660

确保需要连接到 Memcached 的用户是您服务器上的memcache组的一部分,否则在尝试访问插件时将收到权限拒绝的消息。

接下来,使用systemctl命令重新启动您的 Memcached 服务以应用您的更改:

1sudo systemctl restart memcached

验证 Memcached 是否正在使用 ss -lnx 命令聆听 Unix Domain Socket 连接:

1sudo ss -lnx | grep memcached

「-x」旗限制了「ss」的输出,以显示接口文件。

1[secondary_label Output]
2u_str LISTEN 0 1024             /var/run/memcached/memcached.sock 20234658                              * 0

现在你已经配置了Memcached的网络设置,你可以进入本教程的下一步,即将SASL添加到Memcached进行身份验证。

步骤 3 – 添加授权用户

若要将身份验证用户添加到您的 Memcached 服务中,您可以使用 Simple Authentication and Security Layer (SASL) 框架,该框架将身份验证程序从应用程序协议中分离开来。

添加身份验证用户

要开始添加 SASL 支持,您需要安装 sasl2-bin 包,该包包含 SASL 用户数据库的管理程序. 此工具将允许您创建身份验证的用户或用户。

1sudo apt install sasl2-bin

接下来,创建该目录和文件,Memcached将使用mkdir命令检查其SASL配置设置:

1sudo mkdir -p /etc/sasl2

现在使用nano或您喜爱的编辑器创建 SASL 配置文件:

1sudo nano /etc/sasl2/memcached.conf

添加以下几行:

1[label /etc/sasl2/memcached.conf]
2log_level: 5
3mech_list: plain
4sasldb_path: /etc/sasl2/memcached-sasldb2

除了指定日志级别外,mech_list设置为平行,这告诉 Memcached 应该使用自己的密码文件并验证一个简单的密码. 您添加的最后一行指定了您下次创建的用户数据库文件的路径。

现在你将创建一个 SASL 数据库,使用用户凭证。你将使用 saslpasswd2 命令与 -c 旗帜在 SASL 数据库中创建一个新的用户条目。 用户将是 sammy 在这里,但你可以用自己的用户代替这个名称。 -f 旗帜指定数据库的路径,这将是你在 `/etc/sasl2/memcached.conf 中设置的路径:

1sudo saslpasswd2 -a memcached -c -f /etc/sasl2/memcached-sasldb2 sammy

最后,用下面的chown命令,向 memcache 用户和群组提供SASL数据库的所有权:

1sudo chown memcache:memcache /etc/sasl2/memcached-sasldb2

您现在有一个SASL配置,Memcached可以用于身份验证,在下一节中,您将首先确认Memcached在默认设置下运行,然后重新配置并验证它是否与SASL身份验证工作。

配置 SASL 支持

首先,我们可以通过memcstat命令测试我们的Memcached实例的连接性,这将帮助我们确定Memcached在启用SASL和用户身份验证之前是否正在运行并正确配置。

若要检查 Memcached 是否已启动并使用memcstat命令运行,请输入以下步骤:

1memcstat --servers="127.0.0.1"

如果您使用的是 Unix 域插件,请使用插件路径代替 IP 地址,例如:--servers=/var/run/memcached/memached.sock。

当您运行memcstat命令并成功连接到Memcached时,您应该收到如下的输出:

1[secondary_label Output]
2Server: 127.0.0.1 (11211)
3     pid: 2299875
4     uptime: 2020
5     time: 1632404590
6     version: 1.5.22
7     . . .

<$>[注意] 注意 :如果您正在使用 Memcached 与 UDP 支持,则memcstat命令将无法连接到 UDP 端口。

1nc -u 127.0.0.1 11211 -vz

如果 Memcached 正在响应,您应该收到如下的输出:

1[secondary_label Output]
2Connection to 127.0.0.1 11211 port [udp/*] succeeded!

如果您使用的是 IPv6 和 UDP 的 Memcached,则该命令应如下:

1nc -6 -u ::1 11211 -vz

美元

现在您可以继续启用 SASL. 要做到这一点,请将 -S 参数添加到 /etc/memcached.conf

1sudo nano /etc/memcached.conf

在文件的底部,添加以下内容:

1[label /etc/memcached.conf]
2. . .
3-S

接下来,找出并放弃评论的 -vv 选项,该选项将为 `/var/log/memcached’ 提供语音输出。

1[label /etc/memcached.conf]
2. . .
3-vv

保存并关闭文件。

现在使用以下systemctl命令重新启动 Memcached 服务:

1sudo systemctl restart memcached

接下来,检查 Memcached 的journalctl日志,以确保已启用 SASL 支持:

1sudo journalctl -u memcached |grep SASL

您应该收到如下的一条输出线,表示已启动了 SASL 支持:

1[secondary_label Output]
2Sep 23 17:00:55 memcached systemd-memcached-wrapper[2303930]: Initialized SASL.

现在您可以再次检查连接到 Memcached. 有了 SASL 支持并初始化,以下memcstat命令应该在没有有效的身份验证凭证的情况下失败:

1memcstat --servers="127.0.0.1"

该命令不应该产生输出. 输入以下壳命令以检查其状态:

1echo $?

通常,除了0之外,任何事物都表示进程失败,在这种情况下,你应该收到一个1的退出状态,这表示memcstat命令失败。

再次运行memcstat,这一次使用用户名和密码来确认身份验证过程是否奏效,如果您使用了不同的身份验证,请运行以下命令,以代替sammyyour_password值:

1memcstat --servers="127.0.0.1" --username=sammy --password=your_password

您应该获得如下类型的输出:

1[secondary_label Output]
2Server: 127.0.0.1 (11211)
3     pid: 3831
4     uptime: 9
5     time: 1520028517
6     version: 1.4.25
7     . . .

您的 Memcached 服务现在已配置并与 SASL 支持和用户身份验证一起运行。

步骤 4 – 允许通过私人网络访问(可选)

默认情况下,Memcached 仅配置为在本地循环(127.0.0.1)接口上聆听,该接口可保护Memcached 接口免受外部人员的接触。

<$>[info] 注: 我们将在本节中介绍如何使用UFW设置防火墙,但还可以使用DigitalOcean Cloud防火墙来创建这些设置。有关设置DigitalOcean Cloud防火墙的更多信息,请参阅我们的 Introduction to DigitalOcean Cloud Firewalls

通过防火墙限制IP访问

在您调整配置设置之前,最好设置防火墙规则,以限制可以连接到您的 Memcached 服务器的机器。 首先,您需要记录您想要使用连接到 Memcached 的任何机器的私人 IP 地址。

如果您正在使用 UFW 防火墙,您可以通过在您的 Memcached 服务器上键入以下方式来限制访问您的 Memcached 实例:

1sudo ufw allow from client_system_private_IP/32 to any port 11211

如果超过一个系统通过私人网络访问 Memcached,请确保为每个机器添加额外的ufw规则,使用上述规则作为模板。

您可以通过阅读我们的 ufw 基本指南来了解更多关于 UFW 防火墙的信息。

有了这些更改,您可以调整 Memcached 服务以连接到您的服务器的私人网络接口。

将 Memcached 绑定到私人网络接口

现在,您的防火墙已经安装,您可以调整 Memcached 配置以连接到您的服务器的私人网络接口,而不是127.0.0.1

首先,使用以下ip命令找到您的 Memcached 服务器的私人网络接口

1ip -brief address show

根据服务器的网络配置,输出可能与以下示例不同:

1[secondary_label Output]
2lo UNKNOWN 127.0.0.1/8 ::1/128
3eth0 UP 203.0.113.1/20 10.10.0.5/16 2001:DB8::1/64 fe80::7ced:9ff:fe52:4695/64
4eth1 UP 10.136.32.212/16 fe80::2cee:92ff:fe21:8bc4/64

在本示例中,网络接口以其eth0eth1的名称标识,在eth0行上突出显示的IPv4地址是服务器的公共IP地址。

eth1线上标注的10.136.32.212地址是服务器的私人IPv4地址,而fe80::2cee:92ff:fe21:8bc4地址是IPv6私人地址。

  • 10.0.0.010.255.255.255(10/8前缀)
  • 172.16.0.0172.31.255.255(172.16/12前缀) 192.168.0.0192.168.255.255 (192.168/16前缀)

一旦您找到服务器的私人IP地址或地址,请使用nano或您喜爱的编辑器重新打开/etc/memcached.conf文件:

1sudo nano /etc/memcached.conf

查找您之前检查或修改的 -l 127.0.0.1 行,并更改地址以匹配您的服务器的私人网络接口:

1[label /etc/memcached.conf]
2. . .
3-l memcached_servers_private_IP
4. . .

如果您希望在多个地址上使用 Memcached 收听,则可以为每个地址添加另一个类似的行,无论是 IPv4 还是 IPv6 使用 -l memcached_servers_private_IP 格式。

保存并关闭文件,当你完成。

接下来,重新启动 Memcached 服务:

1sudo systemctl restart memcached

检查你的新设置用ss来确认更改:

1sudo ss -plunt
1[secondary_label Output]
2Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
3. . .
4tcp LISTEN 0 1024 10.137.0.2:11211 0.0.0.0:*          users:(("memcached",pid=8991,fd=27))
5. . .

测试您的外部客户端的连接,以确保您仍然可以访问服务. 还可以检查未经授权的客户端的访问(尝试无用户和密码连接),以确保您的 SASL 身份验证按预期运行。

结论

在本教程中,您探索了如何与 IPv4, IPv6, TCP, UDP 和 Unix 域连接器配置 Memcached. 您还了解了如何通过启用 SASL 身份验证来保护您的 Memcached 服务器。

要了解更多有关 Memcached 的信息,请参阅 项目文档

Published At
Categories with 技术
comments powered by Disqus