介绍
Memcached等内存对象缓存系统可以通过将信息临时存储在内存中来优化后端数据库的性能,保留频繁或最近请求的记录。 通过这种方式,它们可以减少对数据库的直接请求数量。
由于像Memcached这样的系统如果配置不当可能会导致拒绝服务攻击,因此保护Memcached服务器非常重要。 在本指南中,我们将介绍如何通过将安装绑定到本地或专用网络接口并为Memcached实例创建授权用户来保护Memcached服务器。
先决条件
本教程假设您有一个使用非root sudo
用户和基本防火墙的服务器。 如果不是这种情况,请设置并安装以下内容:
- 一台CentOS 7服务器, 在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
变量,它最初看起来像这样:
. . .
OPTIONS=""
绑定到我们的本地网络接口将限制流量到同一台计算机上的客户端。 我们将通过将-l 127.0.0.1
添加到我们的OPTIONS
变量中来实现。 这对某些环境来说可能过于严格,但它可以作为安全措施的一个很好的起点。
由于UDP协议对于拒绝服务攻击比TCP更有效,因此我们也可以禁用UDP监听器。 为此,我们将-U 0
参数添加到我们的OPTIONS
变量中。 完整的文件应该是这样的:
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实例的memstat
。 这将帮助我们确定在更改我们的配置文件后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
我们将在我们的OPTIONS
变量中添加-S
和-vv
参数。 -vv
选项将向/var/log/memcached
提供详细的输出,这将在我们调试时帮助我们。 将这些选项添加到OPTIONS
变量中,如下所示:
. . .
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配置文件中:
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绑定到专用网络接口。
使用防火墙限制IP访问
在调整配置设置之前,设置防火墙规则以限制可连接到Memcached服务器的计算机是一个不错的主意。 如果您遵循先决条件并在您的服务器上安装了FirewallD,并且不打算从另一台主机连接到Memcached,则无需调整防火墙规则。 由于我们之前定义的OPTIONS
变量,您的独立Memcached实例应该在127.0.0.1
上进行监听,因此不应该担心传入流量。 但是,如果您打算允许从其他主机访问Memcached服务器,则需要使用firewall-cmd
命令更改防火墙设置。
首先将专门的Memcached区域添加到您的firewalld
策略中:
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:
. . .
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的教程。