如何在Ubuntu18.04上安装和保护Memcached
本教程的先前版本由 Kathleen Juell 编写。
介绍
像 Memcached 这样的内存对象缓存系统可以通过将信息临时存储在内存中、保留经常或最近请求的记录来优化后端数据库的性能。 通过这种方式,它们减少了对数据库的直接请求数量。
在本指南中,您将学习如何安装和配置 Memcached 服务器。 您还将了解如何使用简单身份验证和安全层 (SASL) 添加身份验证以保护 Memcached。 最后,您将学习如何将 Memcached 绑定到本地或专用网络接口,以确保只有经过身份验证的用户才能在受信任的网络上访问它。
先决条件
要遵循本教程,您将需要:
- 一台 Ubuntu 18.04 服务器,具有 sudo 非 root 用户并启用了防火墙。 要进行设置,您可以按照我们的 Initial Server Setup with Ubuntu 18.04 教程进行操作。
具备这些先决条件后,您就可以安装和保护您的 Memcached 服务器了。
或者,如果您想尝试使用交互式终端在浏览器中安装和配置 Memcached,请单击下面的 Launch an Interactive Terminal! 按钮开始使用。
启动交互式终端!
第 1 步 — 安装 Memcached
如果您的服务器上还没有安装 Memcached,您可以从官方 Ubuntu 存储库安装它。 首先,确保使用以下命令更新您的本地包索引:
sudo apt update
接下来安装官方包如下:
sudo apt install memcached
您还可以安装 libmemcached-tools
,这是一个包含各种工具的软件包,可用于检查、测试和管理 Memcached 服务器。 使用以下命令将包添加到您的服务器:
sudo apt install libmemcached-tools
Memcached 现在应该作为服务安装在您的服务器上,以及允许您测试其连接性的工具。 现在您可以继续保护其配置设置。
第 2 步 — 配置 Memcached 网络设置(可选)
如果您的 Memcached 服务器只需要支持使用 TCP 的本地 IPv4 连接,那么您可以跳过本节并继续本教程中的 步骤 3。 否则,如果您想将 Memcached 配置为使用 UDP 套接字、Unix 域套接字或添加对 IPv6 连接的支持,请继续执行本教程本节中的相关步骤。
首先,确保您的 Memcached 实例正在侦听本地 IPv4 环回接口 127.0.0.1
。 Ubuntu 和 Debian 附带的当前版本的 Memcached 将其 -l
配置参数设置为本地接口,这意味着它被配置为仅接受来自运行 Memcached 的服务器的连接。
使用 ss
命令验证 Memcached 当前是否绑定到本地 IPv4 127.0.0.1
接口并仅侦听 TCP 连接:
sudo ss -plunt
各种标志将通过以下方式改变 ss
输出:
-p
添加正在使用套接字的进程的名称-l
将输出限制为仅侦听套接字,而不是还包括连接到其他系统的套接字-u
在输出中包含基于 UDP 的套接字-n
在输出中显示数值而不是人类可读的名称和值-t
在输出中包含基于 TCP 的套接字
您应该收到如下输出:
OutputNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . tcp LISTEN 0 1024 127.0.0.1:11211 0.0.0.0:* users:(("memcached",pid=8889,fd=26)) . . .
此输出确认 memcached
仅使用 TCP 协议绑定到 IPv4 环回 127.0.0.1
地址。
现在您已确认 Memcached 配置为仅支持 IPv4 和 TCP 连接,您可以编辑 /etc/memcached.conf
以添加对 UDP、Unix 域套接字或 IPv6 连接的支持。
配置 IPv6
要启用与 Memcached 的 IPv6 连接,请使用 nano
或您的首选编辑器打开 /etc/memcached.conf
文件:
sudo nano /etc/memcached.conf
首先,在文件中找到以下行:
/etc/memcached.conf
. . . -l 127.0.0.1
这一行是配置 Memcached 监听本地 IPv4 接口的地方。 要添加 IPv6 支持,请添加包含 IPv6 本地环回地址 (::1) 的行,如下所示:
/etc/memcached.conf
. . . -l 127.0.0.1 -l ::1
按 CTRL+O
保存并关闭文件,然后按 ENTER
保存,然后按 CTRL+X
退出 nano
。 然后使用 systemctl
命令重启 Memcached:
sudo systemctl restart memcached
现在,您可以通过重复上一节中的 ss
命令来验证 Memcached 是否也在侦听 IPv6 连接:
sudo ss -plunt
您应该收到如下输出:
OutputNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . tcp LISTEN 0 1024 127.0.0.1:11211 0.0.0.0:* users:(("memcached",pid=8889,fd=26)) . . . tcp 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
如果您想将 Memcached 与 UDP 套接字一起使用,您可以通过编辑 /etc/memcached.conf
配置文件来启用 UDP 支持。
使用 nano
或您喜欢的编辑器打开 /etc/memcached.conf
,然后将以下行添加到文件末尾:
/etc/memcached.conf
. . . -U 11211
如果不需要 TCP 支持,找到 -p 11211
行并将其更改为 -p 0
以禁用 TCP 连接。
编辑完文件后,输入CTRL+O
保存并关闭文件,然后CTRL+X
退出。
接下来,使用 systemctl
命令重新启动您的 Memcached 服务以应用您的更改:
sudo systemctl restart memcached
再次使用 ss -plunt
命令验证 Memcached 是否正在侦听 UDP 连接:
sudo ss -plunt
如果您禁用了 TCP 支持并启用了 IPv6 连接,那么您应该会收到如下输出:
[secondary_label Output] Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . udp UNCONN 0 0 127.0.0.1:11211 0.0.0.0:* users:(("memcached",pid=8889,fd=28)) udp UNCONN 0 0 [::1]:11211 [::]:* users:(("memcached",pid=8889,fd=29)) . . .
请注意,如果您只启用了 IPv4 连接,并且启用了 TCP 连接,您的输出可能会有所不同。
配置 Unix 域套接字
如果您想将 Memcached 与 Unix Domain Sockets 一起使用,您可以通过编辑 /etc/memcached.conf
配置文件来启用此支持。 请注意,如果您将 Memcached 配置为使用 Unix 域套接字,则 Memcached 将禁用 TCP 和 UDP 支持,因此请确保您的应用程序在启用套接字支持之前不需要使用这些协议进行连接。
使用 nano
或您喜欢的编辑器打开 /etc/memcached.conf
,然后将以下行添加到文件末尾:
/etc/memcached.conf
. . . -s /var/run/memcached/memcached.sock -a 660
-a
标志确定套接字文件的权限。 确保需要连接 Memcached 的用户是您服务器上 memcache
组的一部分,否则在尝试访问套接字时会收到权限被拒绝消息。
接下来,使用 systemctl
命令重新启动您的 Memcached 服务以应用您的更改:
sudo systemctl restart memcached
使用 ss -lnx
命令验证 Memcached 是否正在侦听 Unix 域套接字连接:
sudo ss -lnx | grep memcached
-x
标志将 ss
的输出限制为显示套接字文件。 您应该收到如下输出:
Outputu_str LISTEN 0 1024 /var/run/memcached/memcached.sock 20234658 * 0
现在您已经配置了 Memcached 的网络设置,您可以继续本教程的下一步,将 SASL 添加到 Memcached 进行身份验证。
第 3 步 — 添加授权用户
要将经过身份验证的用户添加到您的 Memcached 服务,您可以使用简单身份验证和安全层 (SASL),这是一个将身份验证过程与应用程序协议分离的框架。 首先,您将为您的服务器添加对 SASL 的支持,然后您将为用户配置身份验证凭据。 一切就绪后,您就可以在 Memcached 的配置文件中启用 SASL 并确认一切正常。
添加经过身份验证的用户
要开始添加 SASL 支持,您需要安装 sasl2-bin
软件包,其中包含 SASL 用户数据库的管理程序。 此工具将允许您创建一个或多个经过身份验证的用户。 运行以下命令来安装它:
sudo apt install sasl2-bin
接下来,创建 Memcached 将使用 mkdir
命令检查其 SASL 配置设置的目录和文件:
sudo mkdir -p /etc/sasl2
现在使用 nano
或您喜欢的编辑器创建 SASL 配置文件:
sudo nano /etc/sasl2/memcached.conf
添加以下行:
/etc/sasl2/memcached.conf
log_level: 5 mech_list: plain sasldb_path: /etc/sasl2/memcached-sasldb2
除了指定日志级别之外,mech_list
设置为 plain
,它告诉 Memcached 它应该使用自己的密码文件并验证明文密码。 您添加的最后一行指定了您接下来将创建的用户数据库文件的路径。 完成后保存并关闭文件。
现在,您将使用用户凭据创建一个 SASL 数据库。 您将使用带有 -c
标志的 saslpasswd2
命令在 SASL 数据库中创建新的用户条目。 此处的用户将是 sammy,但您可以将此名称替换为您自己的用户。 -f
标志指定数据库的路径,这将是您在 /etc/sasl2/memcached.conf
中设置的路径:
sudo saslpasswd2 -a memcached -c -f /etc/sasl2/memcached-sasldb2 sammy
最后,使用以下 chown
命令为 memcache 用户和组授予对 SASL 数据库的所有权:
sudo chown memcache:memcache /etc/sasl2/memcached-sasldb2
您现在有了一个可供 Memcached 用于身份验证的 SASL 配置。 在下一部分中,您将首先确认 Memcached 以其默认设置运行,然后重新配置它并验证它是否使用 SASL 身份验证。
配置 SASL 支持
我们可以首先使用 memcstat
命令测试我们的 Memcached 实例的连接性。 此检查将帮助我们确定 Memcached 在启用 SASL 和用户身份验证之前正在运行并正确配置。 在我们对配置文件进行更改后,我们将再次运行该命令以检查不同的输出。
要使用 memcstat
命令检查 Memcached 是否已启动并运行,请键入以下内容:
memcstat --servers="127.0.0.1"
如果您使用的是 IPv6,请用 ::1
代替 IPv4 127.0.0.1
地址。 如果您使用的是 Unix 域套接字,请使用套接字的路径代替 IP 地址,例如 --servers=/var/run/memcached/memached.sock
。
当您运行 memcstat
命令并成功连接到 Memcached 时,您应该会收到如下输出:
OutputServer: 127.0.0.1 (11211) pid: 2299875 uptime: 2020 time: 1632404590 version: 1.5.22 . . .
注意:如果您使用支持UDP的Memcached,memcstat
命令将无法连接到UDP端口。 您可以使用以下 netcat
命令来验证连接性:
nc -u 127.0.0.1 11211 -vz
如果 Memcached 正在响应,您应该会收到如下输出:
OutputConnection to 127.0.0.1 11211 port [udp/*] succeeded!
如果您将 Memcached 与 IPv6 和 UDP 一起使用,则命令应如下所示:
nc -6 -u ::1 11211 -vz
现在您可以继续启用 SASL。 为此,请将 -S
参数添加到 /etc/memcached.conf
。 再次使用 nano
或您的首选编辑器打开文件:
sudo nano /etc/memcached.conf
在文件的底部,添加以下内容:
/etc/memcached.conf
. . . -S
接下来,找到并取消注释 -vv
选项,它将向 /var/log/memcached
提供详细输出。 未注释的行应如下所示:
/etc/memcached.conf
. . . -vv
保存并关闭文件。
现在使用以下 systemctl
命令重新启动 Memcached 服务:
sudo systemctl restart memcached
接下来,检查 Memcached 的 journalctl
日志以确保启用了 SASL 支持:
sudo journalctl -u memcached |grep SASL
您应该会收到如下所示的一行输出,表明 SASL 支持已被初始化:
OutputSep 23 17:00:55 memcached systemd-memcached-wrapper[2303930]: Initialized SASL.
现在您可以再次检查与 Memcached 的连接。 在 SASL 支持到位并已初始化的情况下,如果没有有效的身份验证凭据,以下 memcstat
命令应该会失败:
memcstat --servers="127.0.0.1"
该命令不应产生输出。 键入以下 shell 命令以检查其状态:
echo $?
$?
将始终返回退出的最后一个命令的退出代码。 通常,除了 0
之外的任何内容都表示进程失败。 在这种情况下,您应该收到 1
的退出状态,这表明 memcstat
命令失败。
再次运行 memcstat
,这次使用用户名和密码将确认身份验证过程是否有效。 如果您使用不同的凭据,请使用您的凭据代替 sammy
和 your_password` 值运行以下命令:
memcstat --servers="127.0.0.1" --username=sammy --password=your_password
您应该收到如下输出:
OutputServer: 127.0.0.1 (11211) pid: 3831 uptime: 9 time: 1520028517 version: 1.4.25 . . .
您的 Memcached 服务现已配置并运行,支持 SASL 和用户身份验证。
第 4 步 — 允许通过专用网络访问(可选)
默认情况下,Memcached 仅配置为侦听本地环回 (127.0.0.1
) 接口,从而保护 Memcached 接口不暴露给外部各方。 但是,在某些情况下,您可能需要允许从其他服务器进行访问。 在这种情况下,您可以调整配置设置以将 Memcached 绑定到专用网络接口。
注意: 我们将在本节介绍如何使用 UFW 配置防火墙设置,但也可以使用 DigitalOcean Cloud Firewalls 来创建这些设置。 有关设置 DigitalOcean 云防火墙的更多信息,请参阅我们的 DigitalOcean 云防火墙简介 。 要了解有关如何限制特定机器的传入流量的更多信息,请查看本教程中关于 使用标签和服务器名称应用防火墙规则的部分 以及我们对 防火墙标签 的讨论。
使用防火墙限制 IP 访问
在调整配置设置之前,最好设置防火墙规则以限制可以连接到 Memcached 服务器的机器。 首先,您需要记录您想用来连接到 Memcached 的任何机器的私有 IP 地址。 获得私有 IP 地址(或多个地址)后,您将添加显式防火墙规则以允许计算机访问 Memcached。
如果您使用 UFW 防火墙,您可以通过在 Memcached 服务器上键入以下内容来限制对 Memcached 实例的访问:
sudo 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 服务器的专用网络接口
ip -brief address show
根据您的服务器的网络配置,输出可能与以下示例不同:
Outputlo UNKNOWN 127.0.0.1/8 ::1/128 eth0 UP 203.0.113.1/20 10.10.0.5/16 2001:DB8::1/64 fe80::7ced:9ff:fe52:4695/64 eth1 UP 10.136.32.212/16 fe80::2cee:92ff:fe21:8bc4/64
在此示例中,网络接口由它们的 eth0
和 eth1
名称标识。 eth0
行上突出显示的 IPv4 地址是服务器的公共 IP 地址。
eth1
行中突出显示的 10.136.32.212
地址是服务器的私有 IPv4 地址,而 fe80::2cee:92ff:fe21:8bc4
地址是 IPv6 私有地址。 您的 IP 地址会有所不同,但根据 RFC 1918 规范 )将始终在以下范围内:
10.0.0.0
到10.255.255.255
(10/8 前缀)172.16.0.0
到172.31.255.255
(172.16/12 前缀)192.168.0.0
到192.168.255.255
(192.168/16 前缀)
找到服务器的一个或多个私有 IP 地址后,使用 nano
或您喜欢的编辑器再次打开 /etc/memcached.conf
文件:
sudo nano /etc/memcached.conf
找到您之前检查或修改的 -l 127.0.0.1
行,并更改地址以匹配您服务器的私有网络接口:
/etc/memcached.conf
. . . -l memcached_servers_private_IP . . .
如果您想让 Memcached 监听多个地址,请为每个地址添加另一个类似的行,使用 -l memcached_servers_private_IP
格式的 IPv4 或 IPv6。
完成后保存并关闭文件。
接下来,重启 Memcached 服务:
sudo systemctl restart memcached
使用 ss
检查您的新设置以确认更改:
sudo ss -plunt
OutputNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . tcp LISTEN 0 1024 10.137.0.2:11211 0.0.0.0:* users:(("memcached",pid=8991,fd=27)) . . .
测试来自外部客户端的连接,以确保您仍然可以访问该服务。 最好还检查来自非授权客户端的访问(尝试在没有用户和密码的情况下进行连接)以确保您的 SASL 身份验证按预期工作。 尝试从不允许连接的不同服务器连接到 Memcached 以验证您创建的防火墙规则是否有效也是一个好主意。
结论
在本教程中,您探索了如何使用 IPv4、IPv6、TCP、UDP 和 Unix 域套接字配置 Memcached。 您还学习了如何通过启用 SASL 身份验证来保护您的 Memcached 服务器。 最后,您学习了如何将 Memcached 绑定到本地或专用网络接口,以及如何配置防火墙规则以限制对 Memcached 的访问。
要了解有关 Memcached 的更多信息,请查看 项目文档 。