资讯详情

资讯详情

服务器被入侵怎么办?SSH暴力破解与挖矿木马应急排查指南

1. 凌晨三点的告警一台业务服务器突然开始自言自语1.1 第一通告警不是黑客发来的勒索信而是监控面板先炸了那天凌晨我睡得正沉手机连续震了七八下直接被震醒。摸过来一看是Zabbix和阿里云监控同时弹的告警某台跑着公司官网和内部API的CentOS 7服务器CPU使用率从平时的5%直接飙到320%出网带宽被占满SSH登录失败次数在十分钟内超过了200次。当时脑子里的第一反应就四个字服务器被入侵了。这里我想先说一句很多人不爱听的话真正判断服务器被入侵的往往不是你在服务器上看到了什么奇怪文件而是监控先替你看到了异常。CPU打满、带宽跑满、登录失败暴增、/tmp目录疯狂写文件这四个信号单独出现任何一个都值得警惕同时出现基本上就是被入。我爬起来打开电脑先没有急着去改密码、删文件而是做了一件很多新手不会做的事给这台服务器的磁盘打了个快照同时把当时的进程列表、网络连接、登录日志原样备份了一份。这一步在后面整个排查过程中起到了关键作用后面我会详细说为什么。1.2 断网还是取证我做出的第一个关键决定很多人遇到服务器被入侵第一反应就是拔网线、关服务器恨不得物理隔离。我的建议是分情况。如果服务器上有重要业务正在跑直接断网可能引发更大的故障如果已经确认被入侵且无法控制那么立刻隔离是对的。我当时这台服务器是独立的测试环境上面没有生产数据所以我的操作顺序是这样的先打快照保留当前磁盘状态这一步相当于给案发现场拍照。用ss和ps把当前活动连接和进程dump到文件。确认这台服务器没有跟其他内网机器有互信关系之后直接在安全组层面把它的外网访问全部切断保留内网访问方便我继续排查。这个决策的核心逻辑是宁可先花三分钟保存证据也不要一上来就把能体现攻击者作案手法的现场全破坏了。很多人的习惯是发现被入侵立刻杀掉所有可疑进程、删掉恶意文件结果等想回溯的时候日志没了、文件没了、对外连接的IP也没了只剩一个被入侵过的结论那是很被动的。1.3 先拍照再清理应急响应的取证意识所谓取证不是非要拿一套专业的取证工具才能做。对于普通运维人员来说最基本、最有效的取证方法就是把内存信息和磁盘状态先保存下来。内存里跑着的进程、建立的连接、加载的内核模块这些东西一旦断电就没了磁盘上的日志、被篡改的文件一旦你登录进去执行了各种命令访问时间也会变所以优先级一定是内存优先于磁盘。我当时执行了这些命令做案发现场快照# 保存当前进程列表 ps auxf /tmp/evidence_ps_$(date %Y%m%d%H%M%S).txt # 保存网络连接 ss -antp /tmp/evidence_ss_$(date %Y%m%d%H%M%S).txt # 保存登录记录 last /tmp/evidence_last_$(date %Y%m%d%H%M%S).txt lastb /tmp/evidence_lastb_$(date %Y%m%d%H%M%S).txt # 保存计划任务列表 crontab -l /tmp/evidence_crontab_$(date %Y%m%d%H%M%S).txt 21 # 保留auth日志副本 cp /var/log/secure /tmp/evidence_secure_$(date %Y%m%d%H%M%S).txt把这些命令的输出全部重定向到文件而不是直接打印在屏幕上不是为了装样子而是因为排查过程中你可能会反复切换上下文有了文件你就可以随时查看、比对不用担心终端刷屏。后面我排查的所有突破口几乎都是先在这些快照文件里发现的。你如果也遇到类似情况千万别跳过这一步。2. 登录层排查攻击者是从哪扇门进来的2.1 先看门禁记录last、lastb 与登录日志拿到快照之后我做的第一件事是看登录记录。last命令读的是/var/log/wtmp记录的是所有成功的登录会话lastb读的是/var/log/btmp记录的是所有失败的登录尝试。我先执行了last -n 20看到最近几次成功的登录里有几个来源IP非常陌生登录用户是root登录时间是凌晨2点47分和2点53分。而我自己的账号是从另一台跳板机登录的这些陌生IP显然不正常。这里要特别提醒一个细节在分析登录日志之前先确认系统时间是否准确。我看了一眼date发现系统时间比实际时间快了将近6分钟当时第一反应是NTP时间同步出了问题。后来排查发现有攻击者连时间同步相关的服务都没放过这是一个很小的细节但会直接影响你还原攻击时间线的准确度。建议大家都配置好chrony或ntpd并定期检查时间偏移。接着我看lastb -n 50发现攻击者已经扫了很久的SSH口令来源IP非常多几乎覆盖了全球各个国家和地区明显是一台肉鸡或扫描器在自动爆破。但这只能说明他们尝试过很多次真正的问题是到底有没有一次爆破成功于是我转向/var/log/secure日志。2.2 SSH暴力破解与异常账号从auth.log还原突破口/var/log/secureCentOS/RHEL或者/var/log/auth.logDebian/Ubuntu是整个登录排查里最核心的日志。我先用grep Accepted /var/log/secure看所有成功的认证记录结果让我心里一紧Mar 12 02:47:22 172.18.0.3 sshd[28142]: Accepted password for root from 45.155.xxx.xxx port 51236 ssh2 Mar 12 02:53:15 172.18.0.3 sshd[28456]: Accepted password for root from 45.155.xxx.xxx port 52311 ssh2root账号、成功登录、密码认证。这台服务器虽然禁用了root远程登录但配置文件里的PermitRootLogin竟然是yes说明要么是当时部署时图省事没改要么是后来被改回去了。不管哪种情况突破口就清清楚楚了SSH弱口令爆破加root直接登录没有二次验证。顺藤摸瓜我又去翻/etc/passwd和/etc/shadow看有没有被新增的异常用户。重点检查的是UID为0的账号因为UID 0意味着和root拥有完全相同的权限很多攻击者会新建一个admin、sysadmin之类的用户然后把UID改成0这样你用last看的时候会看到一个陌生用户但实际上它拥有root权限。我当时用这条命令筛查awk -F: $30{print $1:$3:$7} /etc/passwd输出结果里除了root以外多了一个support用户UID 0shell是/bin/bash。这就是一个典型的后门账号。攻击者在成功登录后做了两件事创建了新的特权账号同时还可能在root的authorized_keys里塞了公钥接下来我们重点查这个。2.3 公钥后门比密码后门更隐蔽的长期驻留点很多时候你改了密码、删了后门账号以为安全了结果没过几天又被人登录了。原因往往就出在SSH公钥上。攻击者只要把一段自己的公钥写进~/.ssh/authorized_keys就可以用对应的私钥随时免密登录有相当强的隐蔽性因为它不会像密码爆破那样留下大量的Failed记录。我立刻检查了/root/.ssh/authorized_keys果然文件里躺着一把公钥内容看起来像一个正常的RSA公钥但注释字段是攻击者的ID。我把这个文件连同之前的命令输出一起备份了然后才做处理。处理不是直接删掉就完事而是先记录里面有几行、每行的内容特征、最后修改时间这些信息对溯源可能有帮助。在这个环节我把排查要点整理成了一张表方便你排查时对照检查项命令/文件判断标准成功登录记录last是否有陌生IP或陌生用户成功登录失败爆破记录lastb大量失败后是否有成功穿插其中特权账号awk -F: $30{print} /etc/passwdUID 0账号是否超过root一个空密码/弱密码账号awk -F: ($2){print} /etc/shadow是否有空密码用户SSH公钥后门cat ~/.ssh/authorized_keys是否有不认识的公钥行可登录用户Shellcat /etc/passwd是否有正常用户shell被改成/bin/bash总结一下登录层面的排查思路先看成功登录记录定位攻击者进来的时间再看密码文件找异常账号最后检查密钥文件找隐身后门。这三步做完基本就能确定攻击者是通过哪种方式拿到系统权限的。3. 进程、网络与计划任务揪出藏在系统里的常住客3.1 异常进程排查CPU、内存与命令名的迷惑性登录层面的证据告诉我攻击者已经拿到root权限那么接下来就要弄清楚他在系统上跑了什么现在还有什么在运行。第一步自然是看进程。我执行top -c的时候第一屏就被一个叫kworkder的进程占满了CPU利用率超过300%这个进程名字和Linux内核线程kworker只差一个字母非常具有迷惑性。这里我得插一句很多恶意程序都会把进程名伪装成系统进程的名字比如kworker、systemd、[kthreadd]有的还会用不可见字符、混淆字符集来干扰你的视线。所以看到可疑进程的时候不要只看名字要配合三点判断看进程的路径ls -l /proc/PID/exe如果路径是/tmp/xxx、/var/tmp/xxx、/dev/shm/xxx那几乎可以断定是恶意程序。看进程的启动时间ps -eo pid,lstart,cmd | grep PID如果一个开机时间很长的系统上冒出一个启动时间正好在入侵时间段的进程那高度可疑。看进程所属用户和终端root用户启动的无终端进程要格外留意。我当时就锁定了一个PIDls -l /proc/xxxx/exe以后发现它指向/tmp/.x/xmrig——xmrig是门罗币挖矿程序的名字瞬间就明白了这台服务器被拉去挖矿了。CPU飙到320%就是这么来的。3.2 外联连接分析谁在主动往外传数据进程异常说明这台服务器已经被当成了肉鸡但挖矿程序只是它工作的一部分我还得看它往哪里连、有没有往外传数据。ss -antp的输出里除了正常的SSH、Web服务端口之外有几个连接到境外IP的ESTABLISHED状态的连接对应的进程PID正好就是那个挖矿程序它正在往矿池地址提交算力。另一个需要重点看的方向是反向Shell。攻击者有时候会留一条反向Shell让服务器主动连接到他的C2服务器这样即使你封了入站端口他依然可以通过出站连接控制服务器。检查反向Shell的方法也很简单ss -antp里如果看到一个进程建立了一条到陌生IP的SSH连接或者一个bash进程在监听一个socket就要立刻警惕。顺着外联连接我把所有陌生IP都记下来到威胁情报平台查了一下信誉大部分都是不良标记IP有的曾经报过挖矿、木马、扫描器行为。到这里这台服务器参与了对外攻击传播的可能性也渐渐出来了因为我在/var/log/messages里看到了大量来自本机发往其他IP的SYN扫描记录说明攻击者还把它变成了一个跳板。热搜词里提到的蠕虫类攻击正是这个特征感染一台之后会继续扫描、横向扩散。3.3 计划任务与启动项攻击者最爱的持久化手法就算你现在把挖矿进程杀了如果它的驻留机制还在过几分钟它还是会被重启。所以排查的下一步就是找持久化。所谓持久化就是让恶意程序在系统重启后、定时触发、或者某个条件满足时自动运行。Linux上最常见的持久化方式有这么几类第一是计划任务。攻击者会在/var/spool/cron/root或/etc/cron.d/下写入一条任务定时去下载执行恶意脚本。我当时crontab -l发现一条被注释得很像正常任务的记录每隔10分钟执行一次/tmp/.x/update.sh这个脚本会自动下载最新的挖矿程序并运行。把/etc/cron.d/下面的文件也翻了一遍果然又找到两条。第二是开机启动项。/etc/rc.local、/etc/rc.d/init.d/、systemd服务是重灾区。我检查systemctl list-unit-files --typeservice --stateenabled发现多了一个叫sys-guard.service的服务ExecStart指向/tmp/.x/guard显然也是后门的一部分。第三是Shell启动文件。/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc这些文件如果被塞入了恶意代码用户每次登录的时候就会执行隐蔽性很强。我逐一把这些文件检查了一遍确认没有被动过。我建议所有人在排查持久化时至少要检查这张清单不可遗漏持久化位置检查方法当前用户计划任务crontab -l系统计划任务ls /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/systemd服务systemctl list-unit-files --typeservice --stateenabled自启动脚本cat /etc/rc.localShell配置文件cat /etc/profile /etc/bashrc ~/.bashrc登录时执行的脚本/etc/ld.so.preload、/etc/profile.d/*.sh3.4 注入型后门与内存马常规检查看不到的威胁进程、网络、计划任务的检查主要针对的是独立运行的恶意程序但还有一种更隐蔽的情况值得单独拿出来说恶意代码不是以独立进程存在的而是被注入到了现有进程里或者干脆只存在于内存中。比如你有一个Java应用服务器攻击者通过反序列化漏洞打进之后直接往内存里塞了一个内存马它不写任何文件、不在磁盘上留下痕迹你杀进程、删文件都没用只要Java应用还在运行它就是活的。排查内存马的思路和排查普通进程不太一样。普通进程看的是ps、top内存马需要你看的是应用自身的行为。我记得在另一个客户那边排查过一次Java内存马最有效的两个入口看HTTP请求的响应头有没有异常的自定义头信息。在Java进程的jsp目录和字节码文件里搜关键字比如常见的cmd、exec、shell等特征串。如果是自己写的Java应用还可以用jmap把堆dump出来再用MAT分析不过这个上手门槛比较高一般应急时比较少见。对大多数Linux服务器来说先把前面说的进程、外联、计划任务、启动项排查干净已经能解决90%的问题。4. 文件层面的入侵痕迹webshell、恶意文件与被篡改的真相4.1 最近被改动的文件find命令的逆向思维排查完进程和持久化我已经知道这台服务器上跑着挖矿程序、有后门账号和公钥、还有计划任务在维持驻留。但这还不够我还没有确认一个重要问题攻击者除了挖矿有没有动过Web目录的东西有没有植入webshell有没有窃取数据我当时的做法是用find命令去搜索最近几天内被修改过的文件。这个思路是逆向的攻击者在系统上做任何操作都不可避免地会改变文件的时间戳或内容只要时间窗口找对了这些改动就藏不住。# 近7天内修改过的可执行文件 find / -mtime -7 -type f -perm -ox -exec ls -la {} \; 2/dev/null | grep -v /proc\|/sys\|/dev # 近7天内Web目录下新增的脚本文件 find /var/www/html -mtime -7 -type f \( -name *.php -o -name *.jsp -o -name *.asp -o -name *.sh \) -exec ls -la {} \;第一轮输出里跳出来的文件集中在/tmp、/var/tmp、/dev/shm、/root这几个目录几乎全是恶意文件。/dev/shm这个目录本身是一个临时文件系统tmpfs数据存在内存里重启就没了很多攻击者喜欢把恶意程序放在这里以为这样更隐蔽。但经验丰富的运维人员看到/dev/shm下的可执行文件第一反应就是这里不对劲。4.2 Web目录排查找webshell的几种实用姿势Web目录是我关注的重中之重因为这台服务器上跑着官网和内部API如果Web层面被植入webshell那问题的严重性会完全不一样。我搜索了/var/www/html下最近修改过的PHP文件发现了几个可疑文件文件名包含env、file、editsys等字样打开一看里面有eval($_POST)之类的函数典型的webshell特征。找webshell其实有很多细节技巧这里分享三个我在实战中觉得最实用的姿势第一个是用grep直接搜高风险函数。PHP的webshell经常用eval、assert、system、exec、shell_exec、passthru、popen这些函数来执行系统命令一条正则就能扫出来grep -rE (eval|assert|system|shell_exec|passthru|popen|proc_open) *\( /var/www/html --include*.php -l第二个是搜索变形混淆的代码。现在的webshell越来越喜欢用base64编码、字符串拼接、可变函数等方式躲避搜索单纯搜函数名可能漏掉很多。常见做法是搜eval(base64、str_rot13、gzinflate、create_function这些用于解混淆的特征。第三个是靠时间线关联。如果有日志能记录某个PHP文件第一次被访问的时间再拿这个时间去find那些在那个时间点前后创建或修改的文件往往能精准锁定攻击者上传的文件。我当时就是从Nginx的access日志里找到了一个POST请求指向/uploads/editsys.php然后再反查这个文件建立了一个完整的时间关联。4.3 恶意二进制与挖矿程序的特征识别挖矿程序通常有比较明显的特征。比如它的进程CPU利用率极高网络连接指向已知的矿池地址文件路径常出现在/tmp、/var/tmp、/dev/shm这些临时目录。但如果攻击者做了加工把矿工二进制打包成一个看似正常的lib库或者内核模块单靠特征就不太够了。我在实际排查中更依赖使用file命令看文件类型、使用strings命令提取可疑字符串。比如那个xmrig文件strings输出里包含了矿池地址和钱包地址这几乎就是实锤了。另外一个常见做法是把恶意样本的MD5值放到威胁情报网站上查一下如果已经有厂商标记过不但能确认恶意性偶尔还能直接看到样本的分析报告省去很多逆向工作。这里特别提醒一个容易忽略的点很多挖矿木马为了伪装会把程序文件名改成跟系统服务很像比如sys-guard、networkd、systemd-log所以不要在文件名上纠结太多核心还是看文件路径、行为特征和网络连接。4.4 日志被清空之后怎么判断攻击者动了哪些手脚有一种比较棘手的情况攻击者很有经验清了日志再走。我当时排查的这台服务器虽然日志还在但在/var/log目录下发现了疑似被清空的迹象——secure的大小比预期小很多而且文件的修改时间正好落在入侵时间段内。日志被清了怎么办先别急着哭还有几条路可以走bash_history检查root和各种用户的~/.bash_history这里经常能翻出攻击者敲过的命令是还原攻击行为的最佳素材。如果攻击者删了history文件还可以看看有没有残留的/root/.bash_history备份或者/var/log/btmp里的尾部记录。系统审计日志如果服务器开启了auditd轮转日志可能在/var/log/audit/下内容非常详细记录了系统调用级别的行为。shell的日志有些服务器配置了/etc/profile中的history记录或者安装了bashhistory工具会在独立位置记录所有命令。应用日志Nginx、Apache、Tomcat、MySQL的日志这些往往是攻击者容易忽略的通过访问日志可以还原攻击者上传webshell、调用后门的行为。进程监控数据如果部署过云监控、Zabbix、Netdata这些平台的历史数据也能辅助还原CPU、带宽、连接数的异常时间点。我们这台服务器上保留了/var/log/nginx/access.log从里面找到了多条向editsys.php发起的POST请求以及一些扫描路径的GET请求这些内容后面成了我判断攻击来源的重要依据。所以即使系统日志被清也绝不是死路一条。5. 溯源分析把散落的攻击碎片拼成一条完整时间线5.1 从入口到驻留攻击链的完整还原当你把登录日志、恶意进程、计划任务、Webshell、文件改动都摸了一遍之后实际上已经把攻击者的作案手法还原得七七八八了。这时候最重要的事情是把所有线索按时间顺序串起来形成一条清晰的攻击链。我当时梳理完的时间线大致是这样时间事件凌晨 02:00 - 02:45攻击者从多个境外IP对22端口发起SSH暴力破解02:47使用root账号成功登录来源IP 45.155.xxx.xxx02:48 - 02:55创建后门账号support写入SSH公钥添加计划任务02:56 - 03:10下载挖矿程序到/tmp/.x/启动xmrig挖矿进程03:11 - 03:30扫描同网段其他IP开始横向移动尝试03:42通过HTTP POST请求向/uploads/editsys.php上传恶意参数Webshell行为有了这个时间线我就很清楚地知道这台服务器的入侵入口是SSH弱口令爆破攻击者拿到了root权限之后做了三件事留后门、挖矿、尝试横向扩散同时还往Web目录丢了一个webshell。整条链路的逻辑非常清晰没有所谓的无头悬案。5.2 网络层佐证防火墙、IDS与威胁情报交叉验证单靠服务器端日志去还原入侵路径有一个明显的局限性它只能看到发生在这台机器上的事情看不到攻击者从更早之前就开始的侦察行为。为了把攻击者的来源摸得更清楚我登录到云控制台把这台服务器在安全组、防火墙上的拦截日志导出来看了一遍。日志显示那个来源IP在前一天的下午就已经开始对这个IP的22端口做慢速扫描了频率不高绕过了大部分简单的暴力破解检测。这种慢速扫描精确爆破的组合已经不是那种全互联网无差别扫描的低级脚本小子了更像是有针对性的攻击。我又把攻击者的IP、恶意文件的MD5、webshell的文件名等关键指标放到威胁情报平台做了一次交叉查询。查下来的结果是这个IP段近期被多家安全厂商标记为恶意源历史上跟多起SSH爆破、挖矿木马传播事件有关。同时检查了云平台的入侵检测告警发现系统曾经在凌晨那段时间产生过一条自适应入侵检测的中级告警当时因为级别不高被忽略了现在回头看那正是攻击行为最活跃的阶段。5.3 判断数据是否泄露哪些敏感文件被碰过排查到了这一步我心里其实已经比较有底了但还有一个所有的业务方都会追问的问题数据有没有被偷走坦白地说在服务器本机要100%确定数据是否泄露非常困难因为攻击者完全有可能把数据库文件打包下载了又删掉相关日志不留下明显痕迹。我们能做的是通过行为痕迹做倾向性判断。我当时的判断依据有几个方面第一检查了/etc/shadow、数据库配置文件、.env文件、application.yml这些常见敏感文件的访问时间没有发现在入侵时段内被读取的迹象第二那台服务器上最有价值的业务数据都存在远程数据库里本机只存了少量静态页面和接口代码攻击者即使拿到也价值有限第三从流量监控看出网带宽的峰值基本都被挖矿程序占据没有观察到明显的批量数据传输行为。但就算如此我依然按最坏情况来对待后续把所有可能接触到数据库的账号密码全部轮换同时让业务方检查数据库的访问日志确认有没有来自这台服务器的异常查询。这是一个成本不高、但非常必要的手术式清理。6. 清理、加固与复盘打扫干净之后如何不再被入6.1 清理后门断根比切韭菜更重要很多运维在应急响应时容易犯一个错误看到挖矿进程就kill -9看到可疑文件就rm -rf然后觉得处理完了。但如果计划任务还在、后门账号还在、公钥还在、webshell还在那所有清理都是白搭。攻击者的后门只要有一个没被封死他随时可以重新进来。我当时的清理顺序是先处理账号层。删除support这个后门账号同时把/root/.ssh/authorized_keys里所有可疑公钥行清掉并且将这个文件改回600权限、属主改为root。修改/etc/ssh/sshd_config把PermitRootLogin改为no同时明确指定只允许某个运维用户通过公钥登录关闭密码登录。这里多说一句改SSH配置前一定要先确保自己有一条可用的密钥登录通道否则改完自己都进不去那就尴尬了。然后是计划任务和启动项。清掉/var/spool/cron/root里的恶意任务删除/etc/cron.d/下的异常文件删掉sys-guard.service服务并且systemctl disable掉。再检查一遍所有Shell配置文件和/etc/ld.so.preload把可能的预加载后门清掉。Web目录里那个editsys.php和同批次的可疑脚本全部删除然后在Nginx层面对/uploads等上传目录做了文件执行权限的限制。6.2 认证加固把弱口令和密码登录一起关进笼子清理完已经存在的后门之后接下来就是加固防止相同路径再次被利用。最基本的一条就是禁止root直接SSH登录禁止密码登录全部使用密钥登录。如果团队里确实有人需要密码认证也建议只保留内网来源的密码登录并且结合fail2ban做来源限制。fail2ban是我强烈推荐部署的一个工具它能实时读取认证日志在短时间内同一个IP出现多次登录失败时自动将其拉黑。配置很简单主要是找到匹配日志的正则然后设置封禁时间。我当时用的配置大概是这样[sshd] enabled true port ssh filter sshd logpath /var/log/secure maxretry 3 bantime 3600maxretry设成3次稍微有点敏感但对公网服务器来说这个力度是合适的毕竟谁没事会连续输错三次密码呢另外我还把SSH端口从22改到了一个高位端口虽然对资深攻击者来说多扫几个端口就能发现但能过滤掉大量无差别扫22端口的脚本降低被爆破的概率。6.3 最小暴露面与网络隔离让黑客无门可敲认证加固解决的是门锁够不够结实的问题网络层解决的是这扇门到底该不该存在的问题。我发现这台服务器的安全组其实放行了好几个不必要的入站端口比如3306MySQL、6379Redis、8080等虽然这些端口对应的服务并没有在线监听但暴露在公网上就是风险。尤其是Redis如果以默认配置跑在公网并且没设密码被未授权访问拿权限的例子不要太多。我的加固思路是最小暴露面业务需要哪个端口才放行哪个端口不需要的直接在安全组删掉。同时为了降低横向扩散的风险这台服务器跟其他内网机器做了网络隔离只保留必要业务端口的互通。对于Web目录我在Nginx层面对/uploads、/files这类可写目录禁止了脚本执行就算再有webshell传上来它也没法直接运行。6.4 监控告警与应急手册凌晨三点能不能安心睡这次事件之后我做的第一件善后工作不是写报告而是把监控告警规则重新梳理了一遍。之前崩溃式告警虽然也发了但因为误报太多导致真正重要的告警被淹没在消息堆里凌晨那几条消息我甚至差点没看到。后来我把告警做了分级P0级CPU持续打满、出网带宽跑满、SSH登录失败激增、配置了异常计划任务时立刻短信电话通知。P1级磁盘空间不足、进程数异常增长时仅推送站内通知。P2级日常性能波动只在日报里体现。同时我还把这次应急响应的完整过程写进了一份内部应急手册。这个手册的价值在平时看不出来等真正出第二次事故的时候你就知道有多重要了。手册里记录了常见的排查命令、恶意文件的处理流程、各个日志文件的存放位置、备份文件的恢复方式、安全意识联系人以及关键账号密码的存放位置。一旦再次遇到类似问题按手册执行就不会因为慌乱而漏步骤。6.5 盘点清单一次完整应急响应的动作列表最后把这次完整排查的所有动作浓缩成一张清单方便你直接抄作业保存下来遇到类似场景对照着执行阶段动作取证打快照、保存ps/ss/last/lastb/crontab输出保留原始日志副本登录排查检查last/lastb/secure日志筛查UID 0账号与authorized_keys进程排查ps/top排查异常进程直连可疑进程的exe路径网络排查ss -antp检查外联连接确认反向Shell与挖矿矿池通信持久化排查检查crontab、systemd、rc.local、Shell配置、ld.so.preload文件排查find最近修改文件Web目录搜webshell特征函数溯源分析以时间线串联日志/文件/流量/威胁情报确认攻击链清理删除后门账号、公钥、恶意文件禁用恶意服务清计划任务加固禁root登录、禁密码登录、部署fail2ban、最小化端口、限制上传目录执行权限恢复监控分级告警定期审查安全组策略准备应急手册做好备份恢复演练那次凌晨排查结束之后我养成了一个习惯每台新服务器上线第一件事就是确认SSH配置、防火墙规则、监控告警、日志轮转这些基础工作看起来不起眼但关键时刻真的是能救命的。另一个体会是遇到服务器被入侵最忌讳的是慌一旦乱了节奏就容易做出删日志、杀进程这种破坏现场的操作。就按照上面的清单一步一步来取证、定位、清理、加固你会发现绝大多数入侵都能被还原出清晰的路径只要路径清楚了剩下的就是体力活。如果条件允许建议找个时间在自己的测试服务器上主动模拟一次入侵自己打自己然后按应急手册练一遍这套肌肉记忆比任何教程都管用。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →