网站被打到打不开,这是最考验顺序的时刻。脑子里会有两个念头打架:一边想赶紧把站恢复起来让用户能用,一边想知道对方是从哪进来的。这两个念头都对,但操作方向相反——恢复要动系统,溯源要别动系统。顺序选错,常常两头落空:急着恢复把现场清了,回头查不出入口,过两天换个方式再被打一遍。
一、先把两条线分开看
止损线的目标是让正常用户尽快能访问,手段可以降级,比如限流、切静态页、挂备用节点,先接住用户再说。溯源线的目标是搞清攻击怎么进来的,需要的是一个没被动过的现场。这两条线不是二选一,而是要排先后。排错了,止损做得再快,也是在为下一次被打做准备。
二、为什么不能先重启、不能先删日志
重启会清掉内存里的进程、网络连接和临时文件,而攻击者当时在干什么,恰恰藏在这些东西里。删日志更直接,等于把唯一一份记录扔进垃圾桶。这两个动作看起来很勤快,其实是在制造下一个更大的麻烦。所以正确顺序是:隔离、留证、恢复可用、溯源、加固,而不是一出事就重启。
三、隔离的具体手段,先限流后封 IP
隔离是把站从持续被打的状态里摘出来。能封 IP 就封,但封之前要想清楚两件事:别把正常用户和搜索引擎的爬虫一起封了,也别把公司自己的出口地址封了——这种事发生一次,你会花更多时间去解释。所以更稳的顺序是先限流再封 IP,限流能扛住大部分流量型攻击,而且不会误伤。
限流是止损的第一步。下面这段 nginx 配置按 IP 限速,能扛住大部分流量型攻击,后面几条 iptables 命令按需使用。
# nginx 限流:按 IP 限速,先扛住再慢慢查
# http 段里定义
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=connip:10m;
# server 或 location 段里引用
location / {
limit_req zone=perip burst=20 nodelay;
limit_conn connip 20;
limit_req_status 429;
limit_conn_status 429;
}
# iptables:确认识别清楚之后再按段封,这一步不可逆要留记录
iptables -I INPUT -s 203.0.113.0/24 -j DROP
iptables -L INPUT -n --line-numbers
# 攻击停止后记得撤销:iptables -D INPUT -s 203.0.113.0/24 -j DROP
限流参数别一上来就调得很狠,先松一点看效果,不够再收紧。把限制设得太死,会出现攻击没打垮你、你自己把用户挡住的情况,那和被打的效果是一样的。所有临时规则都要记下来,攻击过去之后逐条撤掉,否则这些规则会变成新的故障源。
四、留证要留哪几样
访问日志和错误日志,就近复制一份,别在原机上反复读;系统日志,尤其是登录和内核相关的部分;当前进程列表和网络连接状态;被改动过的文件清单,按修改时间筛;账号列表和计划任务;数据库里异常时间的操作记录。这些东西全部打包传到另一台机器,做完再动生产。留证这件事,晚半小时就可能什么都没有了。
止损之后马上留证。下面这几条命令把日志、进程、连接和改动记录打包传到另一台机器,别在原机上动生产。
# 留证:把现场打包到另一台机器,别在原机上改东西
mkdir -p /tmp/evidence
cp -a /var/log/nginx /tmp/evidence/
journalctl --since "2 days ago" > /tmp/evidence/journal.txt
ps auxf > /tmp/evidence/ps.txt
ss -antp > /tmp/evidence/conn.txt
crontab -l > /tmp/evidence/crontab.txt
find /www/wwwroot -type f -mtime -3 -ls > /tmp/evidence/changed_files.txt
tar czf /tmp/evidence.tar.gz /tmp/evidence
scp /tmp/evidence.tar.gz user@backup-host:/data/evidence/
注意 scp 那一行要在确认打包完成之后再执行,传完再动生产系统。留证不是走过场,它决定了你后面能不能用一句话说清“攻击是从哪进来的”,这句话的价值远超几百兆日志的存储成本。
五、恢复可用,允许降级
现场固定下来之后,就可以动手恢复了。下手顺序是:先让站能返回内容,再把功能补回来。最简单的做法是切一个静态维护页或者静态首页,告诉用户正在维护,先接住访问;有条件的话切到备用节点;程序侧如果只是被某类请求打垮,可以用限流加规则把这类请求挡住,其余功能照常。降级不是丢人,被打到打不开还在追求功能完整,才是真的丢用户。
六、溯源怎么查
把攻击开始的时间点当成锚,往前推。那个时间点服务器上有什么异常进程、哪个 IP 在疯狂请求、请求的是哪个路径、那个路径对应哪段程序、这段程序的版本有没有已知漏洞。一条一条对下去,落点通常就三类:一个长期没打补丁的组件、一个用弱口令的后台、一个允许上传却能被直接访问的目录。找到落点,才算真正把这件事解决了一半。
七、什么情况下放弃抢救直接重装
如果确认攻击者已经拿到系统权限、留了不止一个后门、或者你没法确定到底清干净没有,最省事的处理是备份数据、重装系统、重新部署。听着粗暴,但比守着一台清不干净的机器安全得多。判断标准很朴素:你没法用一句话说清“后门在哪、我是怎么清掉的”,那就该重装。
八、恢复上线之后还要盯几天
上线不等于结束。接下来几天要盯着访问量、错误率、CPU 和连接数,看有没有再出现同样的曲线;临时加的防护规则先留着,别急着撤。攻击者发现一个入口被堵了,往往会换个入口再来一次,头三天就是复查窗口。盯过这几天,才算把这次攻击真正收尾。
相关阅读:
A5创业网 版权所有