如何判断服务器是否被入侵?5个实用检测方法

背景说明
很多服务器被入侵时,管理员根本不知道。等发现的时候,数据已经没了,或者服务器已经成了别人的"肉鸡"。
今天聊聊怎么判断服务器是否被入侵——在它造成更大损失之前发现它。
一、为什么服务器被入侵很难发现
攻击者的静默期
入侵后立即搞破坏的,是"菜鸟"黑客。
专业黑客的操作是:
- 入侵服务器
- 植入后门(长期控制)
- 窃取数据(慢慢拿)
- 如果是勒索,等到合适时机再发作
这个"静默期"可能长达几周甚至几个月。
攻击者的逻辑是:被发现 = 暴露 = 损失。
所以他们会尽量:
- 不触发告警
- 不留下明显痕迹
- 把自己伪装成正常进程
等你发现的时候,可能已经不是"有没有被入侵"的问题,而是"被入侵了多久"的问题。
二、判断方法一:检查异常登录记录
Linux服务器
# 查看登录成功记录
last
# 查看登录失败记录(被人尝试破解)
lastb
# 查看所有登录记录的汇总
lastlog
# 查看某个时间段内的登录情况
last | grep "2026-04"
# Debian/Ubuntu系统查看auth日志
cat /var/log/auth.log | grep "Failed password"
cat /var/log/auth.log | grep "Accepted password"
# CentOS/RHEL/Rocky Linux系统查看secure日志
cat /var/log/secure | grep "Failed password"
cat /var/log/secure | grep "Accepted password"
专家提示:不同Linux发行版的登录日志路径不同。Debian/Ubuntu系统使用
/var/log/auth.log,而 CentOS/RHEL/Rocky Linux 等RedHat系发行版SSH认证日志记录在/var/log/secure(RHEL 7+可能被systemd-journald接管,建议同时使用journalctl -u sshd查看)。
异常信号:
- 异地登录:你在北京,但登录记录显示"上海"
- 凌晨登录:3点钟有人登上了服务器
- 异常用户:登录记录里出现一个你不认识的账户
Windows服务器
通过事件查看器:
- Win+R,输入"eventvwr.msc"
- 导航到"Windows日志" → “安全”
- 筛选事件ID:
- 4624:账户登录成功
- 4625:登录失败
- 4672:特权分配(管理员登录)
# 查看最近是否有账户被锁定
Search-EventLog -LogName Security -InstanceId 4740 -Newest 10
# 查看是否有可疑的远程登录
Search-EventLog -LogName Security -InstanceId 4624 -Message "*RDP*" -Newest 20
重点关注:
- 短时间内大量4625事件(暴力破解迹象)
- 管理员账户从异常IP登录
- 非管理员账户突然获得高权限
三、判断方法二:检查异常进程和服务
Linux服务器
# 查看占用CPU最高的进程(挖矿常用)
top -c
# 查看进程及其完整命令
ps auxf
# 查看监听端口(有没有多了奇怪的端口)
netstat -tulpn
# 查看所有进程(包括隐藏进程)
ps -ef
# 检查是否有可疑计划任务
crontab -l
cat /etc/crontab
# 检查systemd服务(现代Linux持久化手段)
ls /etc/systemd/system/ | grep -v "^d"
systemctl list-units --type=service --state=running
# 检查环境变量是否被劫持
echo $LD_PRELOAD
# 如果有输出,说明有库被预加载,可能是入侵信号
# 检查LD_PRELOAD持久化配置(更隐蔽的劫持方式)
cat /etc/ld.so.preload
# 如果这个文件存在且包含内容,即使LD_PRELOAD环境变量为空,劫持依然生效
# 这是黑客常用的"无痕"劫持手段
> **专家提示**:如果服务器被植入Rootkit(内核级木马),黑客可以hook系统调用,此时你看到的进程列表全部是"假象"。这种情况下 `ps`、`top`、`ls` 等命令本身都可能被篡改。正确做法是使用从安全环境带来的静态链接工具(如BusyBox静态编译版)进行排查,或者将服务器硬盘挂载到另一台干净的系统进行分析。
**挖矿木马的典型特征:**
- CPU占用99%,但top看到的进程名是随机字符串
- 进程名是"python"或"perl",但你明明没跑Python/Perl应用
- 进程在高CPU占用下"消失"了(可能用了进程守护)
### Windows服务器
```powershell
# 查看异常进程
tasklist
Get-Process | Sort-Object CPU -Descending
# 查看监听端口
netstat -ano | findstr LISTENING
# 查看可疑服务
services.msc
# 查看开机启动项
wmic startup list full
异常信号:
- 进程名是随机字母数字组合(svchost0.exe、a.exe)
- 系统进程但路径在用户目录(C:\Users\)
- 某个进程CPU占用持续80%+,但你不知道它是什么
四、判断方法三:检查系统文件变更
Linux服务器
# 查看最近被修改的系统文件
find /bin /usr/bin /sbin /lib -mtime -7 -ls
# 检查可疑的SSH密钥(黑客可能添加了免密登录的公钥)
cat ~/.ssh/authorized_keys
cat /root/.ssh/authorized_keys
# 检查SSH配置文件是否被篡改
cat /etc/ssh/sshd_config
# 检查文件是否被设置为不可修改(chattr +i)
lsattr /bin /usr/bin /sbin /usr/sbin
# 如果看到 i 标志,说明文件被锁定,即使root也删不掉
# 这常被黑客用于保护木马文件
# 检查关键系统文件的权限是否被修改
rpm -Va # CentOS/RHEL(推荐,比单查MD5更全面)
debsums # Debian/Ubuntu
# 检查隐藏目录和临时文件(黑客喜欢在这些地方藏木马)
ls -la /dev/shm /tmp /var/tmp
# /dev/shm 是内存临时目录,关机即消失,常被杀毒软件忽略
# /var/tmp 是临时文件夹,权限较大
SUID/SGID权限后门排查
黑客常通过给普通命令加上SUID权限,让普通用户运行时获得root权限。
# 查找系统中具有SUID权限的异常文件
find / -perm -u=s -type f 2>/dev/null
# 重点关注非系统命令被赋予了SUID权限
# 常见的被利用命令:vim, less, more, nano, find, bash, perl, python等
# 如果这些命令出现在非预期的位置,要警惕
验证系统命令是否被篡改
# 方式一:使用发行版自带的完整性检查(推荐)
rpm -V coreutils # CentOS/RHEL,比对权限、大小、MD5等所有元数据
apt-check -r coreutils # Debian/Ubuntu
# 方式二:MD5校验(需在干净环境下比对)
# 1. 在同版本清洁机器(或虚拟机)上执行
md5sum /bin/ls
# 2. 记录结果
# 3. 在受害机器上执行相同命令并比对
md5sum /bin/ls
# 如果值不同,说明文件被篡改
专家提示:MD5校验必须在干净环境下比对,不能在本地自检(如果系统命令已被篡改,md5sum本身也可能是假的)。正确做法是从可信来源(如官方ISO镜像)提取干净版本的二进制MD5值进行比对。使用
rpm -V比单查MD5更全面,因为能比对权限、大小、时间戳等所有元数据。
Windows服务器
# 检查系统目录是否有新出现的可执行文件
Get-ChildItem -Path C:\Windows\System32 -Filter "*.exe" | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-30)}
# 检查注册表Run键值(开机启动项)
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
Get-ItemProperty "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
# 检查计划任务(现代Windows攻击的常用持久化手段,比Run键值更难发现)
Get-ScheduledTask | Where-Object {$_.Author -notlike "*Microsoft*"} | Format-List TaskName, Author, State
# 查看非微软官方创建的计划任务详情
Get-ScheduledTaskInfo -TaskName "任务名称" # 替换为实际任务名
五、判断方法四:检查网络流量和连接
Linux服务器
# 查看当前的网络连接
ss -tulpn
# 查看对外连接(中了木马的服务器会常驻一个C2连接)
ss -tnp | grep ESTAB
# 查看带宽占用异常
iftop -i eth0
# 查看流量异常
nethogs
异常信号:
- 服务器主动连接了你不认识的境外IP
- 有大量到境外IP的连接(数据外传)
- DNS查询异常(有些木马通过DNS协议通信)
判断是否有流量攻击
# 查看哪个IP的连接数最多
netstat -anp | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn
如果某个IP建立了大量连接,可能是被当成了攻击源(肉鸡)。
六、判断方法五:检查日志异常
重要技巧
如果怀疑日志被清除了,可以用:
# 查看日志文件是否被截断
ls -l /var/log/auth.log
cat /var/log/auth.log | wc -l
如果日志文件被截断为0字节,或者行数突然减少,要警惕。
专家提示:黑客入侵后第一件事往往是清空本地日志,因为日志会暴露他们的入侵路径。建议建立远程日志服务器(通过Syslog-ng或rsyslog将日志实时同步到另一台服务器),这样即使本地日志被删除,远程备份仍然保留证据。
核弹级排查工具:Auditd
如果系统安装了auditd,即使黑客删除了日志文件,auditd的记录往往能救命。
# 安装auditd
yum install audit -y # CentOS/RHEL
apt install auditd -y # Debian/Ubuntu
# 查看审计服务状态
systemctl status auditd
# 监控谁动了核心文件(如/etc/shadow、/etc/passwd)
ausearch -f /etc/shadow -i
# 监控SSH配置变更
ausearch -k ssh_config
# 实时监控文件访问
auditctl -w /etc/passwd -p wa -k identity
auditctl -w /etc/shadow -p wa -k identity
# 查看审计规则
auditctl -l
专家提示:ausearch是auditd提供的查询工具,即使黑客删除了
/var/log/auth.log,只要auditd规则配置得当,你依然可以查到"是谁在什么时间访问了/etc/shadow"。这是最后一道防线。
七、快速排查清单
当怀疑服务器被入侵时,按这个顺序检查:
1. 先查登录记录
└─ last / lastlog / 事件查看器
└─ 有没有异地/凌晨登录?
2. 再查进程和端口
└─ top / 任务管理器
└─ 有没有CPU占用异常高的进程?
└─ 检查 LD_PRELOAD 和 alias
3. 然后查网络连接
└─ ss / netstat
└─ 有没有连接境外IP?
4. 接着查系统文件
└─ authorized_keys / 启动项
└─ lsattr 检查不可修改文件
└─ systemctl 检查systemd服务
└─ /dev/shm /tmp /var/tmp 检查隐藏文件
└─ find / -perm -u=s 查找SUID后门
5. 最后查日志
└─ /var/log/auth.log 或 /var/log/secure
└─ 有没有大量登录失败记录?
└─ ausearch -f /etc/shadow(如果装了auditd)
提示:不同Linux发行版日志路径不同——Debian/Ubuntu用
/var/log/auth.log,RedHat系用/var/log/secure。
专家排查清单(进阶必查)
| 检测项 | 命令 | 说明 |
|---|---|---|
| 不可修改文件 | lsattr /bin /usr/bin |
chattr +i 是木马保护常用手段 |
| LD_PRELOAD劫持 | echo $LD_PRELOAD && cat /etc/ld.so.preload |
环境变量和持久化配置都要查 |
| 恶意systemd服务 | systemctl list-units --type=service |
现代Linux持久化主流手段 |
| 命令别名篡改 | alias |
黑客可能让ls隐藏恶意文件 |
| SUID后门 | find / -perm -u=s -type f 2>/dev/null |
查找被赋予root权限的异常文件 |
| 隐藏目录/临时文件 | ls -la /dev/shm /tmp /var/tmp |
内存目录和临时目录是黑客最爱 |
| 静态工具排查 | 使用BusyBox静态编译版 | 避免依赖被篡改的系统命令 |
| Auditd审计 | ausearch -f /etc/shadow -i |
即使日志被删也能查到痕迹 |
| Windows计划任务 | Get-ScheduledTask | Where-Object {$_.Author -notlike "*Microsoft*"} |
非微软任务可能是木马 |
八、发现了入侵迹象怎么办
第一步:不要慌,先确认
“看到异常"不等于"被入侵了”。有些异常可能是:
- 员工在非工作时间紧急处理问题
- 正常的定时备份任务
- 监控agent的正常行为
先确认,再行动。
第二步:隔离
不要:
- 重启服务器(木马可能设置成重启后自启动)
- 删除可疑文件(可能打草惊蛇)
- 登录服务器操作(可能暴露你的操作)
- 格式化磁盘后重装系统(会丢失入侵证据)
应该:
- 云服务器:通过云控制台(Web Console)登录,通过安全组/防火墙从网络层阻断
- 物理服务器:通过IP KVM或IPMI(带外管理)进入系统
- 保留现场(截图、录屏)
- 完整备份被入侵服务器的磁盘镜像
专家提示:如果你通过SSH远程连接服务器,直接执行
ifconfig eth0 down会导致自己也立即掉线,无法再远程恢复。这是"远程自杀"。正确做法是通过云控制台、Web Console、或IP KVM等带外管理方式进入系统。
第三步:证据保留
# Linux:使用专业内存取证工具(推荐)
# AVML (Azure VM Memory Analyzer) - Microsoft开发
./avml /tmp/memory.lime
# LiME (Linux Memory Extractor)
insmod lime.ko "path=/tmp/memory.lime format=lime"
# 导出系统进程信息
ps auxf > /tmp/process_$(date +%Y%m%d).txt
netstat -tulpn > /tmp/network_$(date +%Y%m%d).txt
# 导出日志
cp -r /var/log /tmp/logs_$(date +%Y%m%d)
# Windows:导出安全日志
wevtutil qe Security /f:text /c:1000 > C:\security_log.txt
专家提示:
dd if=/dev/mem在现代Linux内核(默认开启CONFIG_STRICT_DEVMEM)下已经基本失效,无法直接读取物理内存。必须使用专业的内存取证工具如AVML或LiME。另外,不要在发现入侵后立即执行大量IO操作(如完整磁盘备份),这会覆盖内存中残留的攻击者指令证据。
九、总结
判断服务器是否被入侵的五个方法:
- 检查登录记录——异地登录、凌晨登录是信号
- 检查异常进程——CPU占用异常、陌生进程名
- 检查网络连接——主动连接境外IP很可疑
- 检查系统文件——SSH密钥、启动项是否被篡改
- 检查日志——登录失败记录、日志文件完整性
最重要的一点:被入侵不可怕,可怕的是被入侵了还不知道。
建立日常巡检习惯,配合远程日志和Auditd监控,才能真正做到"看见"威胁。
核心原则:被入侵不可怕,可怕的是被入侵了还不知道。建立日常巡检习惯,比什么都重要。
你有什么服务器安全检测经验?欢迎在评论区分享。
#运维安全 #服务器安全 #入侵检测 #应急响应
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)