如何在CentOS7上安装和保护Memcached
介绍
像 Memcached 这样的内存对象缓存系统可以通过将信息临时存储在内存中、保留经常或最近请求的记录来优化后端数据库的性能。 通过这种方式,它们减少了对数据库的直接请求数量。
因为如果配置不当,像 Memcached 这样的系统可能会导致拒绝服务攻击,因此保护您的 Memcached 服务器非常重要。 在本指南中,我们将介绍如何通过将您的安装绑定到本地或专用网络接口并为您的 Memcached 实例创建授权用户来保护您的 Memcached 服务器。
先决条件
本教程假设您有一个设置了非 root sudo 用户和基本防火墙的服务器。 如果不是这种情况,请设置并安装以下内容:
- 一台 CentOS 7 服务器,按照我们的 Initial Server Setup with CentOS 7 教程 进行设置。
- FirewallD,按照我们在 CentOS 7 中使用 FirewallD 的指南中的 “安装并启用您的防火墙以在引导时启动” 部分进行配置。
具备这些先决条件后,您就可以安装和保护您的 Memcached 服务器了。
从官方存储库安装 Memcached
如果您的服务器上还没有安装 Memcached,您可以从官方 CentOS 存储库安装它。 首先,确保您的本地包索引已更新:
sudo yum update
接下来安装官方包如下:
sudo yum install memcached
我们还可以安装 libmemcached
,该库提供了多种工具来与您的 Memcached 服务器一起工作:
sudo yum install libmemcached
Memcached 现在应该作为服务安装在您的服务器上,以及允许您测试其连接性的工具。 我们现在可以继续保护其配置设置。
保护 Memcached 配置设置
为了确保我们的 Memcached 实例正在侦听本地接口 127.0.0.1
,我们将修改位于 /etc/sysconfig/memcached
的配置文件中的 OPTIONS
变量。 我们还将禁用 UDP 侦听器。 这两项操作都将保护我们的服务器免受拒绝服务攻击。
您可以用 vi
打开 /etc/sysconfig/memcached
:
sudo vi /etc/sysconfig/memcached
找到 OPTIONS
变量,它最初看起来像这样:
/etc/sysconfig/memcached
. . . OPTIONS=""
绑定到我们的本地网络接口将限制同一台机器上客户端的流量。 我们将通过将 -l 127.0.0.1
添加到我们的 OPTIONS
变量来做到这一点。 这对于某些环境可能过于严格,但它可以作为安全措施的良好起点。
因为 UDP 协议对拒绝服务攻击比 TCP 更有效,所以我们也可以禁用 UDP 侦听器。 为此,我们将 -U 0
参数添加到我们的 OPTIONS
变量中。 完整的文件应如下所示:
/etc/sysconfig/memcached
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 127.0.0.1 -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
地址。
添加授权用户
要将经过身份验证的用户添加到您的 Memcached 服务,可以使用简单身份验证和安全层 (SASL),这是一个将身份验证过程与应用程序协议分离的框架。 我们将在 Memcached 配置文件中启用 SASL,然后继续添加具有身份验证凭据的用户。
配置 SASL 支持
我们可以首先使用 memstat
命令测试我们的 Memcached 实例的连接性。 这将帮助我们确定在更改配置文件后启用 SASL 和用户身份验证。
要检查 Memcached 是否已启动并正在运行,请键入以下内容:
memstat --servers="127.0.0.1"
您应该看到如下输出:
OutputServer: 127.0.0.1 (11211) pid: 3831 uptime: 9 time: 1520028517 version: 1.4.25 . . .
现在我们可以继续启用 SASL。 首先,我们可以将 -S
参数添加到 /etc/sysconfig/memcached
中的 OPTIONS
变量中,这将启用 SASL。 再次打开文件:
sudo vi /etc/sysconfig/memcached
我们将 -S
和 -vv
参数添加到我们的 OPTIONS
变量中。 -vv
选项将为 /var/log/memcached
提供详细输出,这将有助于我们调试。 将这些选项添加到 OPTIONS
变量中,如下所示:
/etc/sysconfig/memcached
. . . OPTIONS="-l 127.0.0.1 -U 0 -S -vv"
保存并关闭文件。
重启 Memcached 服务:
sudo systemctl restart memcached
接下来,我们可以查看日志以确保已启用 SASL 支持:
sudo journalctl -u memcached
您应该看到以下行,表明 SASL 支持已被初始化:
Output. . . Mar 05 18:16:11 memcached-server memcached[3846]: Initialized SASL. . . .
我们可以再次检查连通性,但由于 SASL 已初始化,此命令应该会在没有身份验证的情况下失败:
memstat --servers="127.0.0.1"
此命令不应产生输出。 我们可以键入以下内容来检查其状态:
echo $?
$?
将始终返回退出的最后一个命令的退出代码。 通常,除了 0
之外的任何内容都表示进程失败。 在这种情况下,我们应该看到 1
的退出状态,它告诉我们 memstat
命令失败。
添加经过身份验证的用户
现在我们可以下载两个包,它们允许我们使用 Cyrus SASL 库及其身份验证机制,包括支持 PLAIN 身份验证方案的插件。 这些包 cyrus-sasl-devel
和 cyrus-sasl-plain
将允许我们创建和验证我们的用户。 通过键入以下内容安装软件包:
sudo yum install cyrus-sasl-devel cyrus-sasl-plain
接下来,我们将创建 Memcached 将检查其 SASL 配置设置的目录和文件:
sudo mkdir -p /etc/sasl2 sudo vi /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
最后,我们要授予 memcached
用户对 SASL 数据库的所有权:
sudo chown memcached:memcached /etc/sasl2/memcached-sasldb2
重启 Memcached 服务:
sudo systemctl restart memcached
再次运行 memstat
将确认我们的身份验证过程是否有效。 这次我们将使用我们的身份验证凭据运行它:
memstat --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 支持和用户身份验证成功运行。
允许通过专用网络访问
我们已经介绍了如何配置 Memcached 以侦听本地接口,这可以通过保护 Memcached 接口不暴露给外部各方来防止拒绝服务攻击。 但是,在某些情况下,您可能需要允许从其他服务器进行访问。 在这种情况下,您可以调整配置设置以将 Memcached 绑定到专用网络接口。
注意: 我们将在本节中介绍如何使用 FirewallD 配置防火墙设置,但也可以使用 DigitalOcean Cloud Firewalls 来创建这些设置。 有关设置 DigitalOcean 云防火墙的更多信息,请参阅我们的 DigitalOcean 云防火墙简介 。 要了解有关如何限制特定机器的传入流量的更多信息,请查看本教程中关于 使用标签和服务器名称应用防火墙规则的部分 以及我们对 防火墙标签 的讨论。
使用防火墙限制 IP 访问
在调整配置设置之前,最好设置防火墙规则以限制可以连接到 Memcached 服务器的机器。 如果您遵循先决条件并在您的服务器上安装了 FirewallD,并且 not 计划从另一台主机连接到 Memcached,那么您不需要调整防火墙规则。 由于我们之前定义的 OPTIONS
变量,您的独立 Memcached 实例应该正在侦听 127.0.0.1
,因此不必担心传入流量。 但是,如果您计划允许从其他主机访问您的 Memcached 服务器,则需要使用 firewall-cmd
命令更改防火墙设置。
首先向您的 firewalld
策略添加一个专用的 Memcached 区域:
sudo firewall-cmd --permanent --new-zone=memcached
然后,指定您希望保持打开的端口。 Memcached 默认使用端口 11211
:
sudo firewall-cmd --permanent --zone=memcached --add-port=11211/tcp
接下来,指定应允许访问 Memcached 的私有 IP 地址。 为此,您需要知道 客户端服务器的私有 IP 地址 :
sudo firewall-cmd --permanent --zone=memcached --add-source=client_server_private_IP
重新加载防火墙以确保新规则生效:
sudo firewall-cmd --reload
现在应该根据专用 Memcached 区域中的规则处理来自客户端 IP 地址的数据包。 所有其他连接将由默认的 public
区域处理。
有了这些更改,我们可以继续对 Memcached 服务进行必要的配置更改,将其绑定到我们服务器的私有网络接口。
将 Memcached 绑定到专用网络接口
绑定到我们服务器的私有网络接口的第一步是修改我们之前设置的 OPTIONS
变量。
我们可以通过键入以下命令再次打开 /etc/sysconfig/memcached
:
sudo vi /etc/sysconfig/memcached
在里面,找到 OPTIONS
变量。 我们现在可以修改 -l 127.0.0.1
以反映我们的 Memcached 服务器的私有 IP:
/etc/sysconfig/memcached
. . . OPTIONS="-l memcached_servers_private_IP -U 0 -S -vv"
完成后保存并关闭文件。
再次重启 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 的教程。