如何通过减少暴露来保护Memcached
介绍
2018 年 2 月 27 日,Cloudflare 发布了一篇关于 memcached 放大攻击 的数量严重增加的故事。 Memcached 是一种流行的对象缓存系统,经常用于减少整个部署过程中的响应时间和组件负载。 放大攻击的目标是使用 UDP 暴露在公共网络上的 Memcached 部署。
为了减轻攻击,最好的选择是将 Memcached 绑定到本地接口,禁用 UDP,并使用传统的网络安全最佳实践保护您的服务器。 在本指南中,我们将介绍如何执行此操作,以及如何将服务公开给选择性的外部客户端。
注意:由于这种放大攻击对网络稳定性的潜在影响,DigitalOcean 已于 2018 年 3 月 1 日禁用了到端口 11211 的公共接口上的 UDP 和 TCP 流量。 这会影响从数据中心外部对 Droplets 的访问,但仍允许来自数据中心内部的连接。
为了提高安全性,如果您需要在同一数据中心内的 Droplet 之间进行 Memcached 访问,绑定到您的 Droplet 的专用网络接口并使用防火墙规则来限制允许的源地址将有助于防止未经授权的请求。
在 Ubuntu 和 Debian 服务器上保护 Memcached
对于运行在 Ubuntu 或 Debian 服务器上的 Memcached 服务,您可以使用 nano
编辑 /etc/memcached.conf
文件来调整服务参数,例如:
sudo nano /etc/memcached.conf
默认情况下,Ubuntu 和 Debian 将 Memcached 绑定到本地接口 127.0.0.1
。 绑定到 127.0.0.1
的安装不易受到来自网络的放大攻击。 检查 -l
选项是否设置为此地址以确认行为:
/etc/memcached.conf
. . . -l 127.0.0.1 . . .
如果将来监听地址被修改为更加开放,禁用 UDP 也是一个好主意,它更有可能被这种特定攻击利用。 要禁用 UDP(TCP 仍将按预期工作),请将以下选项添加到底部或您的文件中:
/etc/memcached.conf
. . . -U 0
完成后,保存并关闭文件。
重新启动您的 Memcached 服务以应用您的更改:
sudo service memcached restart
通过键入以下命令验证 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
地址。
在 CentOS 和 Fedora 服务器上保护 Memcached
对于在 CentOS 和 Fedora 服务器上运行的 Memcached 服务,您可以通过 vi
编辑 /etc/sysconfig/memcached
文件来调整服务参数,例如:
sudo vi /etc/sysconfig/memcached
在内部,我们将要绑定到本地网络接口,以通过使用 -l 127.0.0.1
选项来限制同一台机器上客户端的流量。 这对于某些环境来说可能过于严格,但这是一个很好的起点。
我们还将设置 -U 0
以禁用 UDP 侦听器。 UDP 作为协议对放大攻击更有效,因此如果我们决定在以后更改绑定端口,禁用它会限制某些攻击的强度。
在 OPTIONS
变量中添加这两个参数:
/etc/sysconfig/memcached
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 127.0.0.1 -U 0"
完成后保存并关闭文件。
要应用更改,请重新启动 Memcached 服务:
sudo service memcached restart
通过键入以下命令验证 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 只监听本地接口。 这通过不将 Memcached 接口暴露给外部各方来防止放大攻击。 如果您需要允许从其他服务器访问,则必须调整配置。
扩展访问最安全的选择是将 Memcached 绑定到专用网络接口。
使用防火墙限制 IP 访问
在您这样做之前,最好设置防火墙规则以限制可以连接到您的 Memcached 服务器的机器。 您需要知道 客户端服务器私有 IP 地址 来配置您的防火墙规则。
如果您使用的是 UFW 防火墙,您可以通过键入以下内容来限制对 Memcached 实例的访问:
sudo ufw allow OpenSSH sudo ufw allow from client_servers_private_IP/32 to any port 11211 sudo ufw enable
您可以通过阅读我们的 基本指南 了解有关 UFW 防火墙的更多信息。
如果您使用的是 Iptables,则可以通过键入以下命令来建立基本防火墙:
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 11211 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -P INPUT DROP
确保使用您的发行版提供的机制保存您的 Iptables 防火墙规则。 您可以通过查看我们的 essentials 指南 了解有关 Iptables 的更多信息。
之后,您可以调整 Memcached 服务以绑定到您服务器的私有网络接口。
将 Memcached 绑定到专用网络接口
现在您的防火墙已就位,您可以调整 Memcached 配置以绑定到服务器的专用网络接口,而不是 127.0.0.1
。
对于 Ubuntu 或 Debian 服务器,再次打开 /etc/memcached.conf
文件:
sudo nano /etc/memcached.conf
在里面,找到 -l 127.0.0.1
行并更改地址以匹配您服务器的私有网络接口:
/etc/memcached.conf
. . . -l memcached_servers_private_IP . . .
完成后保存并关闭文件。
对于 CentOS 和 Fedora 服务器,再次打开 /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"
完成后保存并关闭文件。
接下来,再次重启 Memcached 服务:
sudo service memcached restart
使用 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 放大攻击会对网络健康和服务的稳定性产生严重影响。 但是,可以通过遵循运行网络服务的最佳实践来有效缓解攻击。 应用本指南中的更改后,最好继续监控您的服务以确保保持正确的功能和连接性。