如何在Ubuntu16.04上安装和保护Memcached

来自菜鸟教程
跳转至:导航、​搜索

介绍

像 Memcached 这样的内存对象缓存系统可以通过将信息临时存储在内存中、保留经常或最近请求的记录来优化后端数据库的性能。 通过这种方式,它们减少了对数据库的直接请求数量。

因为如果配置不当,像 Memcached 这样的系统可能会导致拒绝服务攻击,因此保护您的 Memcached 服务器非常重要。 在本指南中,我们将介绍如何通过将您的安装绑定到本地或专用网络接口并为您的 Memcached 实例创建授权用户来保护您的 Memcached 服务器。

先决条件

本教程假设您有一个设置了非 root sudo 用户和基本防火墙的服务器。 如果不是这种情况,请设置以下内容:

具备这些先决条件后,您就可以安装和保护您的 Memcached 服务器了。

第 1 步 — 从官方存储库安装 Memcached

如果您的服务器上还没有安装 Memcached,您可以从官方 Ubuntu 存储库安装它。 首先,确保您的本地包索引已更新:

sudo apt-get update

接下来安装官方包如下:

sudo apt-get install memcached

我们还可以安装 libmemcached-tools,该库提供了多种工具来与您的 Memcached 服务器一起工作:

sudo apt-get install libmemcached-tools

Memcached 现在应该作为服务安装在您的服务器上,以及允许您测试其连接性的工具。 我们现在可以继续保护其配置设置。

第 2 步 - 保护 Memcached 配置设置

为了确保我们的 Memcached 实例正在侦听本地接口 127.0.0.1,我们将检查位于 /etc/memcached.conf 的配置文件中的默认设置。 Ubuntu 和 Debian 附带的当前版本的 Memcached 将 -l 参数设置为本地接口,以防止来自网络的拒绝服务攻击。 我们可以检查此设置以确保其设置正确。

您可以用 nano 打开 /etc/memcached.conf

sudo nano /etc/memcached.conf

要检查接口设置,请在文件中找到以下行:

/etc/memcached.conf

. . .
-l 127.0.0.1

如果您看到 -l 127.0.0.1 的默认设置,则无需修改此行。 如果您确实将此设置修改为更开放,那么禁用 UDP 也是一个好主意,因为它更有可能在拒绝服务攻击中被利用。 要禁用 UDP(同时保持 TCP 不受影响),请将以下选项添加到此文件的底部:

/etc/memcached.conf

. . .
-U 0

完成后保存并关闭文件。

重新启动您的 Memcached 服务以应用您的更改:

sudo systemctl restart memcached

通过键入以下内容验证 Memcached 当前是否绑定到本地接口并仅侦听 TCP 连接:

sudo netstat -plunt

您应该看到以下输出:

OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
. . .
tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      2383/memcached
. . .

这确认 memcached 仅使用 TCP 绑定到 127.0.0.1 地址。

第 3 步 — 添加授权用户

要将经过身份验证的用户添加到您的 Memcached 服务,可以使用简单身份验证和安全层 (SASL),这是一个将身份验证过程与应用程序协议分离的框架。 我们将在 Memcached 配置文件中启用 SASL,然后继续添加具有身份验证凭据的用户。

配置 SASL 支持

我们可以首先使用 memcstat 命令测试我们的 Memcached 实例的连接性。 这将帮助我们确定在更改配置文件后启用 SASL 和用户身份验证。

要检查 Memcached 是否已启动并正在运行,请键入以下内容:

memcstat --servers="127.0.0.1"

您应该看到如下输出:

OutputServer: 127.0.0.1 (11211)
     pid: 3831
     uptime: 9
     time: 1520028517
     version: 1.4.25
     . . .

现在我们可以继续启用 SASL。 首先,我们将 -S 参数添加到 /etc/memcached.conf。 再次打开文件:

sudo nano /etc/memcached.conf

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

/etc/memcached.conf

. . .
-S

接下来,找到并取消注释 -vv 选项,它将向 /var/log/memcached 提供详细输出。 未注释的行应如下所示:

/etc/memcached.conf

. . .
-vv

保存并关闭文件。

重启 Memcached 服务:

sudo systemctl restart memcached

接下来,我们可以查看日志以确保已启用 SASL 支持:

sudo journalctl -u memcached

您应该看到以下行,表明 SASL 支持已被初始化:

Output. . .
Mar 02 22:03:58 memcached systemd-memcached-wrapper[2760]: Initialized SASL.
. . .

我们可以再次检查连通性,但由于 SASL 已初始化,此命令应该会在没有身份验证的情况下失败:

memcstat --servers="127.0.0.1"

此命令不应产生输出。 我们可以键入以下内容来检查其状态:

echo $?

$? 将始终返回退出的最后一个命令的退出代码。 通常,除了 0 之外的任何内容都表示进程失败。 在这种情况下,我们应该看到 1 的退出状态,它告诉我们 memcstat 命令失败。

添加经过身份验证的用户

现在我们可以下载 sasl2-bin,这是一个包含 SASL 用户数据库管理程序的软件包。 这将允许我们创建经过身份验证的用户:

sudo apt-get install sasl2-bin

接下来,我们将创建 Memcached 将检查其 SASL 配置设置的目录和文件:

sudo mkdir -p /etc/sasl2
sudo nano /etc/sasl2/memcached.conf 

将以下内容添加到 SASL 配置文件中:

/etc/sasl2/memcached.conf

mech_list: plain
log_level: 5
sasldb_path: /etc/sasl2/memcached-sasldb2

除了指定我们的日志记录级别,我们将 mech_list 设置为 plain,这告诉 Memcached 它应该使用自己的密码文件并验证明文密码。 我们还将指定接下来要创建的用户数据库文件的路径。 完成后保存并关闭文件。

现在我们将使用我们的用户凭据创建一个 SASL 数据库。 我们将使用 saslpasswd2 命令使用 -c 选项在我们的数据库中为我们的用户创建一个新条目。 我们的用户在这里将是 sammy,但您可以将这个名称替换为您自己的用户。 使用 -f 选项,我们将指定数据库的路径,这将是我们在 /etc/sasl2/memcached.conf 中设置的路径:

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

最后,我们将授予 memcache 用户对 SASL 数据库的所有权:

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

重启 Memcached 服务:

sudo systemctl restart memcached

再次运行 memcstat 将确认我们的身份验证过程是否有效。 这次我们将使用我们的身份验证凭据运行它:

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 以侦听本地接口,这可以通过保护 Memcached 接口不暴露给外部各方来防止拒绝服务攻击。 但是,在某些情况下,您可能需要允许从其他服务器进行访问。 在这种情况下,您可以调整配置设置以将 Memcached 绑定到专用网络接口。

注意: 我们将在本节介绍如何使用 UFW 配置防火墙设置,但也可以使用 DigitalOcean Cloud Firewalls 来创建这些设置。 有关设置 DigitalOcean 云防火墙的更多信息,请参阅我们的 DigitalOcean 云防火墙简介 。 要了解有关如何限制特定机器的传入流量的更多信息,请查看本教程中关于 使用标签和服务器名称应用防火墙规则的部分 以及我们对 防火墙标签 的讨论。


使用防火墙限制 IP 访问

在调整配置设置之前,最好设置防火墙规则以限制可以连接到 Memcached 服务器的机器。 您需要知道 客户端服务器的私有 IP 地址 来配置您的防火墙规则。

如果您使用的是 UFW 防火墙,您可以通过键入以下内容来限制对 Memcached 实例的访问:

sudo ufw allow from client_servers_private_IP/32 to any port 11211

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

完成这些更改后,您可以调整 Memcached 服务以绑定到服务器的专用网络接口。

将 Memcached 绑定到专用网络接口

现在您的防火墙已就位,您可以调整 Memcached 配置以绑定到服务器的专用网络接口,而不是 127.0.0.1

我们可以通过键入以下命令再次打开 /etc/memcached.conf 文件:

sudo nano /etc/memcached.conf

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

/etc/memcached.conf

. . .
-l memcached_servers_private_IP
. . .

完成后保存并关闭文件。

接下来,重启 Memcached 服务:

sudo systemctl restart memcached

使用 netstat 检查您的新设置以确认更改:

sudo netstat -plunt
OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address                              Foreign Address         State       PID/Program name
. . .
tcp        0      0 memcached_servers_private_IP:11211         0.0.0.0:*               LISTEN      2383/memcached
. . .

测试来自外部客户端的连接,以确保您仍然可以访问该服务。 最好同时检查来自非授权客户端的访问,以确保您的防火墙规则有效。

结论

在本教程中,我们介绍了如何通过将 Memcached 服务器配置为绑定到本地或专用网络接口以及启用 SASL 身份验证来保护您的 Memcached 服务器。

要了解有关 Memcached 的更多信息,请查看 项目文档 。 有关如何使用 Memcached 的更多信息,请参阅我们关于 如何在 Ubuntu 14.04 上安装和使用 Memcache 的教程。