介绍
像Memcached这样的内存对象缓存系统可以通过在内存中临时存储信息,保留频繁或最近请求的记录来优化后端数据库性能。 通过这种方式,它们可以减少对数据库的直接请求数。
因为如果配置不当,Memcached等系统可能会导致拒绝服务攻击,因此保护Memcached服务器非常重要。 在本指南中,我们将介绍如何通过将安装绑定到本地或专用网络接口以及为Memcached实例创建授权用户来保护Memcached服务器。
先决条件
本教程假定您使用非root sudo
用户和基本防火墙设置服务器。 如果不是这样,请设置以下内容:
- 一个Ubuntu 18.04服务器, 使用Ubuntu 18.04教程设置我们的初始服务器设置 。
有了这些先决条件,您就可以安装和保护Memcached服务器了。
第1步 - 从官方存储库安装Memcached
如果您的服务器上尚未安装Memcached,则可以从官方Ubuntu存储库安装它。 首先,确保更新本地包索引:
sudo apt update
接下来,安装官方包如下:
sudo apt install memcached
我们还可以安装libmemcached-tools
,这是一个提供多种工具来与Memcached服务器配合使用的库:
sudo apt 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
要检查接口设置,请在文件中找到以下行:
. . .
-l 127.0.0.1
. . .
如果您看到默认设置-l 127.0.0.1
则无需修改此行。 如果您确实将此设置修改为更开放,那么同样禁用UDP也是一个好主意,因为它更有可能被用于拒绝服务攻击。 要禁用UDP(同时保持TCP不受影响),请将以下选项添加到此文件的底部:
. . .
-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 2279/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: 2279
uptime: 65
time: 1546620611
version: 1.5.6
. . .
现在我们可以继续启用SASL。 首先,我们将-S
参数添加到/etc/memcached.conf
。 再次打开文件:
sudo nano /etc/memcached.conf
在文件的底部,添加以下内容:
. . .
-S
接下来,查找并取消注释-vv
选项,该选项将向/var/log/memcached
提供详细输出。 未注释的行应如下所示:
. . .
-vv
保存并关闭文件。
重启Memcached服务:
sudo systemctl restart memcached
接下来,我们可以查看日志以确保已启用SASL支持:
sudo journalctl -u memcached
您应该看到以下行,表明SASL支持已初始化:
Output. . .
Jan 04 16:51:12 memcached systemd-memcached-wrapper[2310]: Initialized SASL.
. . .
我们可以再次检查连接,但由于SASL已初始化,因此该命令在没有身份验证的情况下会失败:
memcstat --servers="127.0.0.1"
此命令不应产生输出。 我们可以输入以下内容来检查其状态:
echo $?
$?
将始终返回退出的最后一个命令的退出代码。 通常,除0
之外的任何内容都表示进程失 在这种情况下,我们应该看到退出状态为1
,这告诉我们memcstat
命令失败。
添加经过身份验证的用户
现在我们可以下载sasl2-bin
,这是一个包含SASL用户数据库管理程序的软件包。 这将允许我们创建我们的身份验证用户:
sudo apt install sasl2-bin
接下来,我们将创建Memcached将检查其SASL配置设置的目录和文件:
sudo mkdir /etc/sasl2
sudo nano /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
系统将要求您输入并重新验证您选择的密码。
最后,我们将通过SASL数据库为memcache
用户提供所有权:
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: 2772
uptime: 31
time: 1546621072
version: 1.5.6 Ubuntu
. . .
我们的Memcached服务现在已成功运行,具有SASL支持和用户身份验证。
第4步 - 允许通过专用网络进行访问(可选)
我们已经介绍了如何配置Memcached来监听本地接口,这可以通过保护Memcached接口免于暴露给外部各方来防止拒绝服务攻击。 但是,可能存在需要允许其他服务器访问的情况。 在这种情况下,您可以调整配置设置以将Memcached绑定到专用网络接口。
注意:我们将在本节介绍如何使用UFW配置防火墙设置,但也可以使用DigitalOcean Cloud Firewalls来创建这些设置。 有关设置DigitalOcean云防火墙的更多信息,请参阅我们的DigitalOcean云防火墙简介 。 要了解有关如何限制特定计算机的传入流量的更多信息,请查看本教程中有关 使用标记和服务器名称应用防火墙规则 的部分以及我们对 防火墙标记 的讨论。
使用防火墙限制IP访问
在调整配置设置之前,最好设置防火墙规则以限制可以连接到Memcached服务器的计算机。 您需要知道客户端服务器的专用IP地址才能配置防火墙规则。 有关DigitalOcean上的专用网络的更多信息,请参阅DigitalOcean专用网络的概述 。
如果您使用的是UFW防火墙,则可以通过键入以下内容来限制对Memcached实例的访问:
sudo ufw allow from client_server_private_IP/32 to any port 11211
您可以通过阅读我们的ufw essentials指南了解有关UFW防火墙的更多信息。
通过这些更改,您可以调整Memcached服务以绑定到服务器的专用网络接口。
将Memcached绑定到专用网络接口
现在您的防火墙已就位,您可以调整Memcached配置以绑定到服务器的专用网络接口而不是127.0.0.1
。
我们可以通过输入以下命令再次打开/etc/memcached.conf
文件:
sudo nano /etc/memcached.conf
在里面,找到您之前检查或修改过的-l 127.0.0.1
行,并更改地址以匹配服务器的专用网络接口:
. . .
-l memcached_server_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_server_private_IP:11211 0.0.0.0:* LISTEN 2912/memcached
. . .
测试来自外部客户端的连接,以确保您仍然可以访问该服务。 最好还是检查来自未授权客户端的访问权限,以确保防火墙规则有效。
结论
在本教程中,我们介绍了如何通过将Memcached服务器配置为绑定到本地或专用网络接口以及启用SASL身份验证来保护Memcached服务器。
要了解有关Memcached的更多信息,请查看项目文档 。 有关如何使用Memcached的更多信息,请参阅我们的如何在Ubuntu 14.04上安装和使用Memcached教程。