今天在微博上看到亚二程转发的一个帖子:
原po用了一掉小伎俩将恶意扫描的人带沟里,让人很解气。
由这个贴,顺道想到了自己对付恶意扫描的一些做法。例如本站点公开IP是47.90.50.176,恶意扫描的人一般会直接访问: http://47.90.50.176,只能得到一个恶搞的页面。达到这个效果只需两步:
新建一个站点配置文件,将其设置为默认站点,并将所有的请求都交给/usr/share/nginx/html/index.html处理。本人利用Nginx的default.conf来做,其内容如下:
server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { index index.html; try_files /index.html /index.html?q=tttt; } }
修改index.html,内容改为你想要的。例如我的是:
EL PSY CONGROO! El psy congroo!
最开始的内容设置为“I’m Your Father!”,后来觉得太暴力太直接,就改成了中二的“El Psy Congroo!”。点击: http://47.90.50.176 可查看效果。
说完以上两个事,再谈谈为什么要阻止恶意扫描。恶意扫描是不法分子利用一些已知或公开的漏洞,批量的寻找目标主机并尝试攻击的行为。扫描基本上是撒网式、无目的性的进行,能搞定一个是一个,成本也不大。例如Flash、Struts2,SMB等漏洞,公布后就会被黑客利用,引起网络上腥风血雨。黑客利用各种PoC扫描并尝试获取权限,控制服务器后便可用作肉鸡、挖矿甚至敲诈勒索等目的。
本人是有轻微洁癖的,不喜欢在log中看到乱七八糟的东西,更不想由于未知的0day漏洞导致服务器被搞定,所以才有上述一番恶搞。
恶意扫描不可避免,我们能做的就是预防和阻止,让扫描者拿不到想要的东西,更进一步的目的是保障服务器的安全。一般而言我会采取以下措施防止恶意扫描:
- 无用的端口尽量关闭,设置严格的网络访问策略。使用iptables和网络安全组,仅开放必要的服务端口或者限定IP访问,其他的包一律丢弃。为了安全,本人管理的服务器都是禁ping,仅必须的端口才开放。
- 尽量使用非默认端口和默认用户名密码。SSH、Zabbix、RDP等端口,全部改成非默认的;使用自定义的用户名和设置复杂的强密码。80/443这类公开访问不宜修改的,采用上述恶搞的手段能缓解旁站攻击。更改默认项对批量扫描杀伤力最大,黑客批量操作的模板总是有限的,避开默认项就让脚本化攻击的代价急剧上升。
- 使用前端代理服务器,隐藏真实服务器IP。对外暴露的服务,在用户和真实服务器之间加LSB或者代理服务器,尽可能加大黑客寻找真实服务器IP的难度。
通过以上手段,应该能避开许多烦人的扫描,同时让你的服务器在类似“WannaCry”的攻击中幸免于难。