问题记录
今天中午有同事反应某系统打开很慢,以为是电脑问题(手动偷笑)。打开网站一看,慢的连静态文件都是几KB/S的速度。这明显不合理啊。上服务器一查,CPU正常、内存正常、Web程序也正常。
于是想到了网络带宽问题。用vnstat -i eth1 -l
一看,惊呆了?,出网带宽达到了 162.44Mbit/s,这不是被攻击了么?
继续用iftop
查看是哪个程序占用了网络。
发现竟然是 Memcache,这说明 Memcache 存在问题。而我们的应用程序对 Memcache 操作的地方并不多且无异常,故猜测是 Memcache 收到了攻击,而且是前段时间很火的 UDP 反射攻击漏洞引起的。
于是在我们对 Memcache 启动参数加了 -U 0
并重启后,流量就正常了。以下内容是关于该漏洞的详细信息和具体解决办法。
漏洞描述
Memcached 是一套常用的 key/value 缓存系统,由于它本身没有权限控制模块,所以对公网开放的 Memcached 服务很容易被攻击者扫描发现。该类攻击主要使用 Memcached 协议的 UDP 端口开展攻击,攻击者通过向开启了 UDP 协议支持的 Memcached 服务器上发送伪造的 IP 欺骗请求,Memcached 服务器会将大量的响应报文发往目标攻击主机,从而占用目标攻击机器的大量带宽资源,导致拒绝服务。
排查方案
- 从外部互联网测试是否对外开放了 Memcached 11211 UDP 端口,使用nc工具测试端口,并查看服务器上是否运行memcached进程,具体测试方式:
测试端口:
nc -vuz IP地址 11211
测试是否对外开放 memcached 服务:telnet IP地址 11211
,如果开放了 11211 端口,则可能受影响
检查进程状态:ps -aux | grep memcached
- 使用
echo -en "\x00\x00\x00\x00\x00\x01\x00\x00stats\r\n" | nc -u IP地址 11211
命令查看返回内容,若返回内容非空,则表明服务器可能受到了影响。
漏洞解决方案
- 如果开放了 11211 UDP 端口,使用防火墙策略封禁 UDP 11211 端口,确保 Memcached 服务器与互联网之间无法通过 UDP 来访问;
- 建议您添加
-U 0
参数并重启 memcached 服务完全禁用 UDP; - Memcached 官方已经发布新版本默认禁用 UDP 11211 端口,可升级到最新版本;
- 对在运行的 Memcached 服务进行安全加固,例如:启动绑定本地监听IP,禁止对外访问、禁用UDP协议、启用登录认证等安全功能,提高 Memcached 安全性;
安全加固方案
- 定期升级,使用官方最新版本 Memcached
- 配置访问控制
不要将服务发布到互联网上而被黑客利用,可以通过
iptables
配置访问控制规则。例如,在Linux
环境中运行命令iptables -A INPUT -p tcp -s 192.168.0.2 -dport 11211 -j ACCEPT
,在iptables
中添加此规则只允许192.168.0.2
这个 IP 对 11211 端口进行访问。 -
绑定监听 IP
如果 Memcached 没有在公网开放的必要,可在 Memcached 启动时指定绑定的 IP 地址为 127.0.0.1。例如,在 Linux 环境中运行以下命令:
memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
-
使用最小化权限账号运行 Memcached 服务
使用普通权限账号运行,指定 Memcached 用户。例如,在 Linux 环境中运行以下命令来运行 Memcached:
memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
- 启用认证功能
Memcached 本身没有做验证访问模块,Memcached 从 1.4.3 版本开始,能支持 SASL 认证。
-
修改默认端口
修改默认 11211 监听端口为 11222 端口。在 Linux 环境中运行以下命令:
memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11222 -c 1024 -P /tmp/memcached.pid
参考资料
原文地址: https://shockerli.net/post/me...
更多文章请访问我的个人博客: https://shockerli.net
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。