如何在 CentOS 7 上安装 Memcached 并确保其安全

介绍

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

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

前提条件

本教程假设您有一个服务器设置了非 root sudo 用户和一个基本的防火墙。

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

从官方存储库中安装 Memcached

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

1sudo yum update

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

1sudo yum install memcached

我们还可以安装libmemcached,一个提供与您的Memcached服务器合作的几个工具的库:

1sudo yum install libmemcached

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

保护 Memcached 配置设置

为了确保我们的 Memcached 实例在本地界面127.0.0.1上收听,我们将更改位于/etc/sysconfig/memcached位置的配置文件中的OPTIONS变量。

您可以用「vi」打开 `/etc/sysconfig/memcached:

1sudo vi /etc/sysconfig/memcached

查找OPTIONS变量,最初将看起来像这样:

1[label /etc/sysconfig/memcached]
2. . .
3OPTIONS=""

绑定到我们的本地网络接口将限制同一台机器上的客户端的流量。我们将通过将-l 127.0.0.1添加到我们的OPTIONS变量来做到这一点。

由于UDP协议对于拒绝服务攻击比TCP更有效,我们还可以禁用UDP倾听器。 为了做到这一点,我们将添加U 0参数到我们的OPTIONS变量中。

1[label /etc/sysconfig/memcached]
2
3PORT="11211"
4USER="memcached"
5MAXCONN="1024"
6CACHESIZE="64"
7OPTIONS="-l 127.0.0.1 -U 0"

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

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

1sudo systemctl restart memcached

请检查 Memcached 是否目前与本地接口绑定,并仅通过键入 TCP 连接来收听:

1sudo netstat -plunt

你应该看到以下结果:

1[secondary_label Output]
2Active Internet connections (only servers)
3Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
4. . .
5tcp 0 0 127.0.0.1:11211 0.0.0.0:*               LISTEN 2383/memcached
6. . .

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

添加授权用户

若要将身份验证用户添加到您的 Memcached 服务中,您可以使用简单身份验证和安全层(SASL)框架,该框架将身份验证程序从应用程序协议中拆除。

配置 SASL 支持

首先,我们可以使用memstat命令测试Memcached实例的连接性,这将有助于我们在我们对配置文件进行更改后确定SASL和用户身份验证是否已启用。

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

1memstat --servers="127.0.0.1"

你应该看到的输出如下:

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     . . .

现在我们可以继续启用 SASL. 首先,我们可以将-S参数添加到我们在/etc/sysconfig/memcached中的OPTIONS变量中,这将启用 SASL。

1sudo vi /etc/sysconfig/memcached

我们将为我们的OPTIONS变量添加-S-vv参数,而-vv选项将提供/var/log/memcached的无语输出,这将有助于我们进行调试。

1[label /etc/sysconfig/memcached]
2. . .
3OPTIONS="-l 127.0.0.1 -U 0 -S -vv"

保存并关闭文件。

重新启动 Memcached 服务:

1sudo systemctl restart memcached

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

1sudo journalctl -u memcached

您应该看到以下行,表示已启动了 SASL 支持:

1[secondary_label Output]
2. . .
3Mar 05 18:16:11 memcached-server memcached[3846]: Initialized SASL.
4. . .

我们可以再次检查连接性,但由于SASL已初始化,此命令不需要身份验证:

1memstat --servers="127.0.0.1"

这个命令不应该产生输出,我们可以输入以下内容来检查其状态:

1echo $?

通常,除了0之外,任何东西都表示过程失败,在这种情况下,我们应该看到一个1的退出状态,这告诉我们memstat命令失败。

添加身份验证用户

现在我们可以下载两个包,使我们能够使用 Cyrus SASL 图书馆及其身份验证机制,包括支持 PLAIN 身份验证方案的插件。这些包, cyrus-sasl-develcyrus-sasl-plain,将使我们能够创建和身份验证我们的用户。

1sudo yum install cyrus-sasl-devel cyrus-sasl-plain

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

1sudo mkdir -p /etc/sasl2
2sudo vi /etc/sasl2/memcached.conf

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

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

除了指定我们的日志级别外,我们还将mech_list设置为plain,这告诉Memcached它应该使用自己的密码文件并验证一个简单的密码。

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

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

最后,我们想给SASL数据库的memcached用户所有权:

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

重新启动 Memcached 服务:

1sudo systemctl restart memcached

再次运行memstat将确认我们的身份验证过程是否奏效,这一次我们将使用我们的身份验证凭证运行:

1memstat --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 支持和用户身份验证成功运行。

允许通过私人网络访问

我们已经介绍了如何将 Memcached 配置为在本地接口上聆听,这可以通过保护 Memcached 接口免受外部接触来防止拒绝服务攻击。

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

通过防火墙限制IP访问

在调整配置设置之前,最好设置防火墙规则,以限制可以连接到您的Memcached服务器的机器。如果您遵循前提条件并在您的服务器上安装了FirewallD,并且计划从另一个主机连接到Memcached,那么您不需要调整防火墙规则。您的独立的Memcached实例应该在127.0.0.1上聆听,由于我们之前定义的OPTIONS变量,因此不应该担心接入的流量。

首先,在您的防火墙策略中添加一个专用的 Memcached 区域:

1sudo firewall-cmd --permanent --new-zone=memcached

然后,指定您想要保留哪个端口打开 Memcached 默认使用端口 11211:

1sudo firewall-cmd --permanent --zone=memcached --add-port=11211/tcp

接下来,指定应该允许访问 Memcached 的私人 IP 地址. 为此,您需要知道您的客户端服务器的私人 IP 地址**:

1sudo firewall-cmd --permanent --zone=memcached --add-source=client_server_private_IP

重新加载防火墙以确保新的规则生效:

1sudo firewall-cmd --reload

现在,您客户端的 IP 地址的包应按照专用 Memcached 区的规则进行处理,所有其他连接都将由默认的公共区进行处理。

有了这些变化,我们可以继续对我们的Memcached服务进行必要的配置更改,将其绑定到我们的服务器的私人网络接口。

将 Memcached 绑定到私人网络接口

连接到我们的服务器的私人网络接口的第一步是修改我们之前设置的OPTIONS变量。

我们可以通过键入再次打开 /etc/sysconfig/memcached:

1sudo vi /etc/sysconfig/memcached

我们现在可以修改-l 127.0.0.1以反映我们的Memcached服务器的私人IP:

1[label /etc/sysconfig/memcached]
2. . .
3OPTIONS="-l memcached_servers_private_IP -U 0 -S -vv"

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

重新启动 Memcached 服务:

1sudo systemctl restart memcached

用「netstat」检查你的新设置以确认更改:

1sudo netstat -plunt
1[secondary_label Output]
2Active Internet connections (only servers)
3Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
4. . .
5tcp 0 0 memcached_servers_private_IP:11211 0.0.0.0:*               LISTEN 2383/memcached
6. . .

测试您的外部客户端的连接,以确保您仍然可以访问服务. 还可以检查未经授权的客户端的访问,以确保您的防火墙规则有效。

结论

在本教程中,我们涵盖了如何通过配置它以连接到您的本地或私人网络接口,并启用SASL身份验证来保护您的Memcached服务器。

要了解更多关于 Memcached 的信息,请参阅 项目文档。 有关如何使用 Memcached 的更多信息,请参阅我们在 Ubuntu 14.04 上如何安装和使用 Memcache 的教程(https://andsky.com/tech/tutorials/how-to-install-and-use-memcache-on-ubuntu-14-04)。

Published At
Categories with 技术
comments powered by Disqus