介绍
2018年2月27日, Cloudflare发表了一篇关于memcached放大攻击量剧增的报道 。 受欢迎的对象缓存系统Memcached经常用于减少整个部署期间的响应时间和组件负载。 放大攻击的目标是使用UDP在公共网络上公开的Memcached部署。
为了减轻攻击,最好的选择是将Memcached绑定到本地接口,禁用UDP,并使用传统的网络安全最佳实践保护您的服务器。 在本指南中,我们将介绍如何执行此操作,以及如何将服务公开给选择性外部客户端。
注意 :由于这种放大攻击对网络稳定性的潜在影响,截至2018年3月1日,DigitalOcean已禁用到端口11211的公共接口上的UDP和TCP流量。这会影响数据中心外部对Droplet的访问,但数据中心内部的连接仍然是允许的。
为了获得额外的安全性,如果您需要在同一个数据中心内的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
选项是否设置为该地址以确认该行为:
. . .
-l 127.0.0.1
. . .
如果监听地址在将来被修改为更加开放,那么禁用UDP更有可能被这种特定攻击利用,这也是一个好主意。 要禁用UDP(TCP仍将按预期工作),请在底部或文件中添加以下选项:
. . .
-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
. . .
您应该只使用TCP将memcached
绑定到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
变量中添加这两个参数:
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
. . .
您应该只使用TCP将memcached
绑定到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防火墙规则。 通过查看我们的要领指南,您可以了解更多关于iptables的信息。
之后,您可以调整Memcached服务以绑定到您的服务器的专用网络接口。
将Memcached绑定到专用网络接口
既然您的防火墙已经就位,您可以调整Memcached配置以绑定到您的服务器的专用网络接口而不是127.0.0.1
。
对于Ubuntu或Debian服务器,再次打开/etc/memcached.conf
文件:
sudo nano /etc/memcached.conf
在里面,找到-l 127.0.0.1
行并更改地址以匹配您的服务器的专用网络接口:
. . .
-l memcached_servers_private_IP
. . .
完成后保存并关闭文件。
对于CentOS和Fedora服务器,再次打开/etc/sysconfig/memcached
文件:
sudo vi /etc/sysconfig/memcached
在里面,更改OPTIONS
变量中的-l 127.0.0.1
参数以引用Memcached服务器的私有IP:
. . .
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放大攻击可能会严重影响网络健康状况和服务的稳定性。 但是,通过遵循运行联网服务的最佳实践,可以有效地缓解攻击。 在应用本指南中的更改之后,最好继续监控您的服务以确保维护正常的功能和连接。