Linux-memcache反射攻击 修复及所踩的坑
上周末领导收到客户的反馈,说我们生产环境的一台服务器,收到UDP端口的反射攻击,要我们好好查查,周一领导把这个“光荣使命”,交给了我,自此,踩坑开始。。。
我在网上查了以后,发现是因为我们服务器上的memcache的版本是1.4.15,属于老版本,没有默认关闭UDP的端口,反射攻击主要是使用UDP的端口进行的,我想,那就升级个版本就好了,再者配置一下防火墙的规则,那不就OK了吗,应该没有多大的挑战的。
谨慎起见,我先在测试的环境下,升级了版本,没毛病,同时,添加了防火墙的TCP 和 UDP 的规则,在别的服务器上尝试访问下设置的端口,的确生效了,美滋滋~
特意在网上找到一些资料:
一、在memcached服务器或者其上联的网络设备上配置防火墙策略,仅允许授权的业务IP地址访问memcached服务器,拦截非法访问。
二、更改memcached服务的监听端口为11211之外的其他大端口,避免针对默认端口的恶意利用。
三、升级到最新的memcached软件版本,配置启用SASL认证等权限控制策略。
四、加强监测,重点加强Memcached服务端口的流量监测,及时发现并处置异常情况。
五、对其他可能被利用发动大规模反射攻击的服务器资源(例如NTP服务器)开展摸排,对此类反射攻击事件进行预防处置。
Memcached 1.5.6 已发布,这是一个 bug 修复版本。同时,由于前段时间因被曝出有攻击者通过设置 memcached 的最大值,欺骗 UDP 数据包发起请求,利用 Memcached 发送的大量庞大的 UDP 响应数据包进行一些攻击行为,该版本已默认禁用 UDP 协议。
具体包括:
disable UDP port by default
systemd instancing support & rpm build improvements
fix gcc warnings in beta GCC
fix build with clang
fix for dtrace compilation on freebsd
下载地址:
http://www.memcached.org/files/memcached-1.5.6.tar.gz
修复方案
1、若Memcache 服务无需使用UDP协议,需要禁用UDP支持:
memcached -U 0
2、若Memcache 服务无需对外开放,配置监听地址仅限本地回环地址:
在 Memcache 服务的配置文件,或者启动参数中,使用 “ -l 127.0.0.1” 指定监听的 ip 地址
3、使用 iptables 等手段控制 Memcache 服务的端口ACL策略:
仅限来自指定 IP 段的访问
iptables -t filter -A INPUT -p tcp -s IP --dport 11211 -j ACCEPT
屏蔽任何其他 IP 对 Memcached 端口的访问
iptables -I INPUT -p udp --dport 11211 -j DROP
iptables -t filter -A INPUT -p tcp --dport 11211 -j DROP
iptables -L -n --line-number
systemctl restart memcached Warning: memcached.service changed on disk. Run 'systemctl daemon-reload' to reload units.
升级Memcached(强烈建议升级)
Memcached官方已经发布新版本默认禁用UDP 11211端口,修复了此漏洞问题,建议您升级到最新1.5.6版本,
Centos6
yum install libevent2 -y
yum install perl -y
rpm -ivh http://rpmfind.net/linux/remi/enterprise/6/remi/x86_64/memcached-1.5.6-1.el6.remi.x86_64.rpm --force
rpm -ivh http://rpmfind.net/linux/remi/enterprise/6/remi/x86_64/memcached-devel-1.5.6-1.el6.remi.x86_64.rpm --force
service memcached restart
chkconfig memcached on
Centos7
yum install libevent -y
yum install perl -y
rpm -ivh http://rpmfind.net/linux/remi/enterprise/7/remi/x86_64/memcached-1.5.6-1.el7.remi.x86_64.rpm --force
rpm -ivh http://rpmfind.net/linux/remi/enterprise/7/remi/x86_64/memcached-devel-1.5.6-1.el7.remi.x86_64.rpm --force
systemctl restart memcached
systemctl enabled memcached
仅限来自指定 IP 段的访问
iptables -t filter -A INPUT -p tcp -s IP --dport 11211 -j ACCEPT
屏蔽任何其他 IP 对 Memcached 端口的访问
iptables -I INPUT -p udp --dport 11211 -j DROP
iptables -t filter -A INPUT -p tcp --dport 11211 -j DROP
iptables -L -n --line-number
在服务器上运行下面的命令来测试服务器是否易受攻击或修复措施是否生效
echo -en "\x00\x00\x00\x00\x00\x01\x00\x00stats\r\n" | nc -u 127.0.0.1 11211
1.修改memcached配置文件,添加OPTIONS的-l 127.0.0.1参数
[root@iZbp include]# vim /etc/init.d/memcached more /etc/sysconfig/memcached
11 PORT=11211
12 USER=memcached
13 MAXCONN=1024
14 CACHESIZE=984
15 OPTIONS="-l 127.0.0.1"
16 DAEMON=/usr/local/memcached/bin/memcached
重启memcached服务
[root@iZbp include]# service memcached restart
Stopping memcached: [ OK ]
Starting memcached: [ OK ]
2.配置防火规则,仅仅允许本机的tcp、udp访问memcached的11211端口,拦截外部访问
accept规则
# iptables -A INPUT -p tcp -s 127.0.0.1 --dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 127.0.0.1 --dport 11211 -j ACCEPT
drop规则
# iptables -I INPUT -p tcp --dport 11211 -j DROP
# iptables -I INPUT -p udp --dport 11211 -j DROP
保存规则并重启 iptables
# service iptables save
# service iptables restart
3.办公电脑本机cmd命令行测试是否可以远程访问:
telnet x.x.x.x 11211
提示11211端口连接失败,则表示配置成功,Server禁止远程访问memcached
仔细的操作后,正式升级到1.5.6的版本(最新的是1.5.7)。
升级后,发现端口访问什么的都没有太大的问题,一口气把两个正式的生产环境给升级了版本,并重启了服务器的防火墙,都起作用了。
第二天上班,开完早会,有人就发现服务器有点不正常,一个核心的服务无法访问,访问拒绝!找不到!Cassandra数据不一致!服务启动失败!当时还不觉得是因为是我升级memcache的原因,知道公司领导下命令,中午12点之前,必须要恢复正常,领导之前是怀疑集群的缘故,发现没关系,然后查spring自己的cache机制,也没有用,实在是找不到问题所在,眼看11:40分了,领导说,你是不是动生产环境的memcache了,我蒙蔽的点点头,“赶快回退”,同时,领导机智的关闭了服务的的防火墙。
memcache回退:
ps -ef|grep memcached
rpm -e memcached-1.5.6-1.el7.remi.x86_64
rpm -qa memcached-devel
rpm -e--nodeps memcached-1.5.6-1.el7.remi.x86_64
rpm -e memcached-1.5.6-1.el7.remi.x86_64 --nodeps
rpm -qa memcached
/usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024 -l 127.0.0.1
rpm -ivh memcached-1.4.15-10.el7_3.1.x86_64
rpm -qa|grep memcached
rpm -e memcached-devel-1.5.6-1.el7.remi.x86_64 --nodeps
rpm -e memcached-1.4.15-10.el7_3.1.x86_64
yum install memcached
/usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024 -l 127.0.0.1
ps -ef|grep memcached
/usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024 -l 127.0.0.1 &
一顿折腾下,手忙脚乱的在12点之前把系统恢复正常了,心惊肉跳!!!
事后,总结如下:
1、云服务器的防火墙是关闭的,云服务器厂商会创建服务器的安全组,保证服务器的安全性,不需要在服务器内部再次配置服务器的防火墙,如果配置或者打开的话,有可能与安全组的策略冲突,而导致不可访问的问题。
2、Memcache的版本升级要搞清楚系统中有哪些应用在使用,否则会在升级之后,memcache里面的缓存数据会丢失,要慎重!
3、数据一致性。Crassandra数据库会有强一致性的要求,而且在集群的环境下,一台服务器不可访问,会自动写到另外一台服务器上,但是另外一台服务器不可被同步,那就会出现严重的数据一致性的错误。
4、这种系统级别的操作,还是要在测试环境充分验证测试后,才能拿到正式环境,以防万一!!