问题记录

  今天中午有同事反应某系统打开很慢,以为是电脑问题(手动偷笑)。打开网站一看,慢的连静态文件都是几KB/S的速度。这明显不合理啊。上服务器一查,CPU正常、内存正常、Web程序也正常。

  于是想到了网络带宽问题。用vnstat -i eth1 -l一看,惊呆了😮,出网带宽达到了 162.44Mbit/s,这不是被攻击了么?

3971524549705_.pic_hd

继续用iftop查看是哪个程序占用了网络。

Snipaste_2018-04-24_15-21-12

  发现竟然是 Memcache,这说明 Memcache 存在问题。而我们的应用程序对 Memcache 操作的地方并不多且无异常,故猜测是 Memcache 收到了攻击,而且是前段时间很火的 UDP 反射攻击漏洞引起的。   于是在我们对 Memcache 启动参数加了 -U 0并重启后,流量就正常了。以下内容是关于该漏洞的详细信息和具体解决办法。

漏洞描述

  Memcached 是一套常用的 key/value 缓存系统,由于它本身没有权限控制模块,所以对公网开放的 Memcached 服务很容易被攻击者扫描发现。该类攻击主要使用 Memcached 协议的 UDP 端口开展攻击,攻击者通过向开启了 UDP 协议支持的 Memcached 服务器上发送伪造的 IP 欺骗请求,Memcached 服务器会将大量的响应报文发往目标攻击主机,从而占用目标攻击机器的大量带宽资源,导致拒绝服务。

排查方案

  1. 从外部互联网测试是否对外开放了 Memcached 11211 UDP 端口,使用nc工具测试端口,并查看服务器上是否运行memcached进程,具体测试方式:

    测试端口:nc -vuz IP地址 11211 测试是否对外开放 memcached 服务:telnet IP地址 11211,如果开放了 11211 端口,则可能受影响 检查进程状态:ps -aux | grep memcached

  2. 使用echo -en "\x00\x00\x00\x00\x00\x01\x00\x00stats\r\n" | nc -u IP地址 11211命令查看返回内容,若返回内容非空,则表明服务器可能受到了影响。

漏洞解决方案

  1. 如果开放了 11211 UDP 端口,使用防火墙策略封禁 UDP 11211 端口,确保 Memcached 服务器与互联网之间无法通过 UDP 来访问;

  2. 建议您添加-U 0参数并重启 memcached 服务完全禁用 UDP;

  3. Memcached 官方已经发布新版本默认禁用 UDP 11211 端口,可升级到最新版本;

  4. 对在运行的 Memcached 服务进行安全加固,例如:启动绑定本地监听IP,禁止对外访问、禁用UDP协议、启用登录认证等安全功能,提高 Memcached 安全性;

安全加固方案

  1. 定期升级,使用官方最新版本 Memcached

  2. 配置访问控制

    不要将服务发布到互联网上而被黑客利用,可以通过iptables配置访问控制规则。例如,在Linux环境中运行命令iptables -A INPUT -p tcp -s 192.168.0.2 -dport 11211 -j ACCEPT,在iptables中添加此规则只允许192.168.0.2这个 IP 对 11211 端口进行访问。

  3. 绑定监听 IP

    如果 Memcached 没有在公网开放的必要,可在 Memcached 启动时指定绑定的 IP 地址为 127.0.0.1。例如,在 Linux 环境中运行以下命令:

    1
    
    memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
    
  4. 使用最小化权限账号运行 Memcached 服务

    使用普通权限账号运行,指定 Memcached 用户。例如,在 Linux 环境中运行以下命令来运行 Memcached:

    1
    
    memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
    
  5. 启用认证功能

    Memcached 本身没有做验证访问模块,Memcached 从 1.4.3 版本开始,能支持 SASL 认证。

  6. 修改默认端口

    修改默认 11211 监听端口为 11222 端口。在 Linux 环境中运行以下命令:

    1
    
    memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11222 -c 1024 -P /tmp/memcached.pid
    

参考资料