Linux 服務器入侵檢測與安全審計實戰 2026

🛡️ 服務器被黑,往往在你發現之前就已經發生。 黑客入侵服務器後,通常會植入後門、挖礦程序或竊取數據。等到發現時,損失往往已經造成。本文帶你係統掌握 Linux 服務器入侵檢測、安全審計與應急響應的全套技能,做到事前防護、事中檢測、事後恢復。
本文將帶你係統掌握:
- ✅ 服務器安全檢查清單
- ✅ 入侵痕跡檢測(可疑進程、網絡連接、用戶賬號)
- ✅ 文件完整性檢查(AIDE)
- ✅ Rootkit 檢測(RKHunter、Chkrootkit)
- ✅ 日誌分析與異常發現
- ✅ 常見入侵場景分析
- ✅ 應急響應流程
- ✅ 安全加固與持續監控
一、服務器安全檢查清單
1.1 日常檢查清單
在動手檢測之前,先按照以下清單做一次全面檢查:
| 檢查項 | 命令 | 說明 |
|---|---|---|
| 當前登錄用戶 | w / who | 是否有異常用戶 |
| 登錄歷史 | last | 檢查異常登錄記錄 |
| 失敗登錄 | lastb | 暴力破解跡象 |
| 運行進程 | ps aux | 可疑進程 |
| 網絡連接 | ss -tlnp | 異常端口監聽 |
| 定時任務 | crontab -l | 是否被植入惡意任務 |
| SSH 配置 | 檢查配置 | 是否允許 root 登錄 |
| 用戶賬號 | cat /etc/passwd | 異常用戶 |
| Sudo 權限 | cat /etc/sudoers | 異常提權 |
| 異常文件 | find | SUID、最近修改文件 |
1.2 快速檢查腳本
#!/bin/bash
# /opt/scripts/security-check.sh
# 服務器安全快速檢查腳本
echo "========== 服務器安全檢查 =========="
echo "檢查時間: $(date)"
echo ""
echo "--- 當前登錄用戶 ---"
w
echo ""
echo "--- 最近登錄記錄(10條)---"
last | head -10
echo ""
echo "--- 失敗登錄記錄(10條)---"
sudo lastb | head -10 2>/dev/null
echo ""
echo "--- 監聽端口 ---"
ss -tlnp
echo ""
echo "--- 對外連接 ---"
ss -tnp | grep ESTAB
echo ""
echo "--- 所有用戶賬號 ---"
cat /etc/passwd | grep -v nologin | grep -v false
echo ""
echo "--- 定時任務 ---"
for user in $(cut -f1 -d: /etc/passwd); do
crons=$(sudo crontab -u $user -l 2>/dev/null)
if [ -n "$crons" ]; then
echo "用戶 $user:"
echo "$crons"
fi
done
echo ""
echo "--- SUID 文件 ---"
find / -perm -4000 -type f 2>/dev/null
echo ""
echo "--- 最近7天修改的文件 ---"
find / -mtime -7 -type f -not -path "/proc/*" -not -path "/sys/*" -not -path "/run/*" 2>/dev/null | head -20
echo ""
echo "========== 檢查完成 =========="二、入侵痕跡檢測
2.1 檢查可疑進程
# 查看所有進程
ps aux --sort=-%cpu | head -20
# 查看佔用 CPU 最高的進程
ps aux --sort=-%cpu | head -10
# 查看佔用內存最高的進程
ps aux --sort=-%mem | head -10
# 查找可疑進程(挖礦、後門常見特徵)
ps aux | grep -iE "miner|xmr|stratum|kdevtmpfsi|kinsing|bash2|sustes"常見惡意進程特徵:
- 名稱為隨機字符串
- CPU 佔用極高(挖礦程序)
- 隱藏進程(
ps看不到,但/proc下有) - 進程名偽裝成系統進程(如
systemd、kthreadd)
檢查隱藏進程:
# 對比 ps 和 /proc
ps aux | awk '{print $2}' | sort > /tmp/ps_pids
ls /proc | grep -E '^[0-9]+$' | sort > /tmp/proc_pids
diff /tmp/ps_pids /tmp/proc_pids2.2 檢查網絡連接
# 查看所有監聽端口
ss -tlnp
ss -ulnp
# 查看所有建立的連接
ss -tnp
ss -unp
# 查看異常連接(連接到可疑 IP)
ss -tn | grep -v "127.0.0.1" | grep -v "::1"
# 查看網絡統計
ss -s檢查可疑連接:
# 查看連接到礦池的常見端口
ss -tn | grep -E ":(3333|4444|5555|7777|9000)"# 查看連接的外部 IP
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn排查思路:
- 連接到未知 IP 的進程
- 監聽了不該監聽的端口
- 大量連接到同一 IP(可能是 C2 服務器)
2.3 檢查用戶賬號
# 查看所有用戶
cat /etc/passwd
# 查看可登錄用戶
grep -v "nologin\|false" /etc/passwd
# 查看有 root 權限的用戶(UID=0)
awk -F: '$3==0 {print $1}' /etc/passwd
# 查看 sudo 權限
cat /etc/sudoers
cat /etc/sudoers.d/*
# 查看用戶組
cat /etc/group | grep -E "sudo|wheel|admin"
# 查看空密碼用戶
awk -F: '($2==""){print "用戶 " $1 " 密碼為空"}' /etc/shadow檢查異常賬號:
- 新增的未知用戶
- UID 為 0 的非 root 用戶
- 擁有 sudo 權限的異常用戶
- 擁有 shell 的系統用戶
# 檢查最近創建的用戶
grep -v "nologin\|false" /etc/passwd | grep "/home"
ls -lt /home/2.4 檢查 SSH 密鑰
# 檢查 authorized_keys 是否被添加
for user_home in /home/* /root; do
if [ -f "$user_home/.ssh/authorized_keys" ]; then
echo "=== $user_home/.ssh/authorized_keys ==="
cat "$user_home/.ssh/authorized_keys"
fi
done
# 檢查 SSH 配置
cat /etc/ssh/sshd_config | grep -E "PermitRootLogin|PasswordAuthentication|PubkeyAuthentication"常見入侵手段: 黑客獲取權限後,會在 ~/.ssh/authorized_keys 中添加自己的公鑰,實現免密登錄。
2.5 檢查定時任務
# 檢查所有用戶的 crontab
for user in $(cut -f1 -d: /etc/passwd); do
crons=$(sudo crontab -u $user -l 2>/dev/null)
if [ -n "$crons" ]; then
echo "=== 用戶 $user 的 crontab ==="
echo "$crons"
fi
done
# 檢查系統定時任務
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
ls -la /etc/cron.hourly/
ls -la /etc/cron.weekly/
ls -la /etc/cron.monthly/
# 檢查 systemd timer
systemctl list-timers --all檢查內容:
- 可疑的下載命令(
wget、curl) - 執行未知腳本
- 定時清除日誌的命令
- 頻繁執行的異常任務
2.6 檢查異常文件
# 查找 SUID/SGID 文件(可能被植入後門)
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null
# 查找最近修改的文件
find / -mtime -7 -type f -not -path "/proc/*" -not -path "/sys/*" -not -path "/run/*" -not -path "/var/log/*" 2>/dev/null
# 查找隱藏文件
find / -name ".*" -type f -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null | head -20
# 查找 /tmp 下的可執行文件
find /tmp /var/tmp /dev/shm -type f -executable 2>/dev/null
# 查找大文件(可能是挖礦程序或數據打包)
find / -size +50M -type f -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null | head -20三、文件完整性檢查(AIDE)
3.1 安裝 AIDE
AIDE(Advanced Intrusion Detection Environment)是文件完整性檢查工具,可以檢測文件是否被篡改。
# Ubuntu / Debian
sudo apt install -y aide
# CentOS / RHEL
sudo yum install -y aide3.2 初始化數據庫
# 初始化數據庫(需要一些時間)
sudo aideinit
# 或手動初始化
sudo aide --init
# 將新數據庫設為基準
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db⚠️ 重要: 數據庫初始化必須在系統乾淨時進行,否則會以被篡改的狀態為基準。
3.3 執行檢查
# 執行完整性檢查
sudo aide --check
# 更新數據庫(確認修改合法後)
sudo aide --update
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db3.4 配置監控範圍
編輯配置文件 /etc/aide/aide.conf:
# 監控規則
# p: 權限
# i: inode
# n: 鏈接數
# u: 用戶
# g: 組
# s: 大小
# md5: MD5 校驗
# sha1: SHA1 校驗
# 正常監控
Normal = p+i+n+u+g+s+md5+sha1
# 僅監控權限和內容
Log = p+i+n+u+g+s
# 數據庫規則
Data = p+i+n+u+g
# 應用規則
/boot Normal
/bin Normal
/sbin Normal
/lib Normal
/usr Normal
/etc Normal
# 日誌僅監控屬性變化
/var/log Log
/var/log/.* Log
# 不監控的目錄
!/proc
!/sys
!/dev
!/run
!/tmp3.5 定時檢查
# 添加定時任務
sudo crontab -e
# 每天凌晨 4 點檢查
0 4 * * * /usr/bin/aide --check | mail -s "AIDE 檢查報告" admin@example.com四、Rootkit 檢測
4.1 RKHunter
# 安裝
sudo apt install -y rkhunter
# 更新數據庫
sudo rkhunter --update
sudo rkhunter --propupd
# 執行檢查
sudo rkhunter --check
# 僅輸出警告
sudo rkhunter --check --report-warnings-only檢查內容包括:
- 系統命令是否被篡改
- Rootkit 特徵文件
- 可疑文件和目錄
- 異常的網絡端口
- 啟動項檢查
4.2 Chkrootkit
# 安裝
sudo apt install -y chkrootkit
# 執行檢查
sudo chkrootkit
# 僅檢查特定項目
sudo chkrootkit | grep -i "INFECTED"4.3 Lynis(綜合安全審計)
# 安裝
sudo apt install -y lynis
# 執行完整審計
sudo lynis audit system
# 查看報告
sudo cat /var/log/lynis.log | grep -E "Warning|Suggestion"五、日誌分析
5.1 重要日誌文件
| 日誌文件 | 說明 |
|---|---|
/var/log/auth.log | 認證日誌(Ubuntu/Debian) |
/var/log/secure | 認證日誌(CentOS/RHEL) |
/var/log/syslog | 系統日誌 |
/var/log/messages | 系統日誌(CentOS) |
/var/log/nginx/access.log | Nginx 訪問日誌 |
/var/log/nginx/error.log | Nginx 錯誤日誌 |
/var/log/audit/audit.log | 審計日誌 |
~/.bash_history | 用戶命令歷史 |
5.2 SSH 登錄分析
# 成功登錄記錄
sudo grep "Accepted" /var/log/auth.log
# 失敗登錄記錄
sudo grep "Failed password" /var/log/auth.log
# 統計失敗登錄的 IP(暴力破解檢測)
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 查看成功登錄的 IP
sudo grep "Accepted" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn
# 查看登錄的用戶
sudo grep "Accepted" /var/log/auth.log | awk '{print $9}' | sort | uniq -c | sort -rn5.3 異常行為檢測
# 檢查 sudo 使用記錄
sudo grep "sudo" /var/log/auth.log
# 檢查用戶切換
sudo grep "su:" /var/log/auth.log
# 檢查新用戶創建
sudo grep "useradd" /var/log/auth.log
# 檢查密碼修改
sudo grep "passwd" /var/log/auth.log
# 檢查服務重啟
sudo grep -i "systemctl" /var/log/auth.log5.4 Nginx 訪問日誌分析
# 訪問量最高的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# 訪問頻率異常(可能是爬蟲或攻擊)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | awk '$1 > 1000'
# 掃描型請求
grep -E "(\.env|\.git|wp-admin|phpmyadmin|\.ssh)" /var/log/nginx/access.log
# SQL 注入特徵
grep -iE "union|select|insert|drop|update" /var/log/nginx/access.log | head -20
# 404 錯誤最多的 IP
awk '$9 == "404" {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -105.5 命令歷史檢查
# 檢查 root 的命令歷史
cat /root/.bash_history
# 檢查所有用戶的命令歷史
for user_home in /home/* /root; do
if [ -f "$user_home/.bash_history" ]; then
echo "=== $user_home/.bash_history ==="
cat "$user_home/.bash_history"
fi
done
# 檢查被清空的命令歷史
find /home /root -name ".bash_history" -size 0 2>/dev/null⚠️ 如果
.bash_history被清空或大小為 0,可能是入侵者為了掩蓋痕跡。
六、常見入侵場景分析
6.1 挖礦木馬
特徵:
- CPU 佔用 100%
- 進程名可能是
kdevtmpfsi、kinsing、xmrig等 - 連接到礦池 IP
- 存在定時任務自動重啟
排查:
# 查找高 CPU 進程
top -bn1 | head -20
# 查找挖礦進程
ps aux | grep -iE "miner|xmrig|stratum|kdevtmpfsi"
# 查找定時任務
crontab -l
ls /var/spool/cron/
cat /etc/crontab
ls /etc/cron.d/清除步驟:
# 1. 殺死進程
kill -9 $(pgrep -f "kdevtmpfsi")
# 2. 刪除惡意文件
find / -name "kdevtmpfsi" -delete 2>/dev/null
find / -name "kinsing" -delete 2>/dev/null
# 3. 清除定時任務
crontab -r # 謹慎操作,確認是惡意的
rm -f /var/spool/cron/*
# 4. 檢查並刪除 SSH 公鑰
cat ~/.ssh/authorized_keys6.2 Webshell
特徵:
- 網站目錄下有可疑 PHP/JSP 文件
- 文件內容包含
eval、system、exec等函數 - 訪問日誌中有頻繁訪問某文件
排查:
# 查找 Webshell
find /var/www -name "*.php" -exec grep -l "eval\|system\|exec\|passthru\|shell_exec" {} \;
# 查找最近修改的 PHP 文件
find /var/www -name "*.php" -mtime -7
# 查找隱藏文件
find /var/www -name ".*" -type f6.3 SSH 暴力破解
特徵:
- 大量失敗登錄記錄
- 來自同一 IP 的頻繁嘗試
排查:
# 統計失敗登錄
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 檢查是否有成功入侵
sudo grep "Accepted" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn防護: 使用 Fail2ban 自動封禁惡意 IP。
七、應急響應流程
7.1 應急響應步驟
當發現服務器被入侵時,按以下步驟處理:
步驟 1:隔離服務器
# 斷開網絡(如果確認被入侵)
# 注意:這會斷開 SSH 連接
sudo ifdown eth0
# 或
sudo ip link set eth0 down💡 如果需要保持 SSH 連接,可以只阻斷出站流量:
bashsudo iptables -A OUTPUT -d 攻擊者IP -j DROP
步驟 2:保留證據
# 記錄當前狀態
ps aux > /tmp/evidence_ps.txt
ss -tlnp > /tmp/evidence_ss.txt
ss -tnp >> /tmp/evidence_ss.txt
last > /tmp/evidence_last.txt
lastb > /tmp/evidence_lastb.txt
dmesg > /tmp/evidence_dmesg.txt
# 備份日誌
sudo tar czf /tmp/logs_backup.tar.gz /var/log/步驟 3:分析入侵路徑
- 檢查日誌找到入侵入口
- 確定入侵時間和方式
- 評估影響範圍
步驟 4:清除威脅
- 殺死惡意進程
- 刪除惡意文件
- 清除定時任務
- 刪除異常用戶
- 清除 SSH 公鑰
步驟 5:修復漏洞
- 更新系統和軟件
- 修改所有密碼
- 修復被利用的漏洞
- 加固服務器安全
步驟 6:恢復服務
- 確認系統乾淨後重新上線
- 持續監控一段時間
7.2 被入侵後的清理清單
# 1. 修改 root 密碼
sudo passwd root
# 2. 修改所有用戶密碼
for user in $(cut -f1 -d: /etc/passwd); do
sudo passwd $user
done
# 3. 重新生成 SSH 密鑰
rm -rf ~/.ssh
ssh-keygen -t ed25519 -C "your@email.com"
# 4. 清理 authorized_keys
echo "" > ~/.ssh/authorized_keys
# 5. 刪除可疑用戶
sudo userdel -r suspicious_user
# 6. 清理定時任務
sudo crontab -r
sudo rm -f /var/spool/cron/*
sudo rm -f /etc/cron.d/*
# 7. 殺死可疑進程
sudo pkill -f suspicious_process
# 8. 更新系統
sudo apt update && sudo apt upgrade -y八、安全加固
8.1 SSH 加固
# 編輯 SSH 配置
sudo nano /etc/ssh/sshd_config
# 關鍵配置
Port 2222 # 修改默認端口
PermitRootLogin no # 禁止 root 登錄
PasswordAuthentication no # 禁用密碼登錄
PubkeyAuthentication yes # 使用密鑰登錄
MaxAuthTries 3 # 最大嘗試次數
AllowUsers your_username # 只允許指定用戶8.2 防火牆配置
# 使用 UFW
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable8.3 安裝 Fail2ban
sudo apt install -y fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban8.4 禁用不必要的服務
# 查看運行的服務
systemctl list-units --type=service --state=running
# 禁用不必要的服務
sudo systemctl disable unnecessary-service
sudo systemctl stop unnecessary-service8.5 自動安全更新
# Ubuntu/Debian
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades九、持續監控
9.1 日誌監控工具
| 工具 | 說明 |
|---|---|
| Logwatch | 日誌摘要郵件報告 |
| Logcheck | 異常日誌告警 |
| Auditd | 系統審計 |
| OSSEC | 開源 HIDS |
| Wazuh | 企業級 SIEM |
9.2 安裝 Auditd
# 安裝
sudo apt install -y auditd
# 添加審計規則
sudo auditctl -w /etc/passwd -p wa -k identity
sudo auditctl -w /etc/sudoers -p wa -k actions
sudo auditctl -w /var/log/auth.log -p wa -k logins
# 查看審計日誌
sudo ausearch -k identity
sudo ausearch -k logins9.3 使用 Logwatch
# 安裝
sudo apt install -y logwatch
# 手動生成報告
sudo logwatch --detail High --range today
# 配置郵件發送
sudo nano /etc/logwatch/conf/logwatch.conf
# 添加:
# MailTo = your@email.com
# Range = yesterday
# Detail = High9.4 定期安全檢查腳本
#!/bin/bash
# /opt/scripts/weekly-security-check.sh
EMAIL="your@email.com"
REPORT="/tmp/security-report.txt"
echo "每週安全檢查報告" > $REPORT
echo "生成時間: $(date)" >> $REPORT
echo "服務器: $(hostname)" >> $REPORT
echo "" >> $REPORT
echo "=== 失敗登錄 TOP 10 ===" >> $REPORT
sudo grep "Failed password" /var/log/auth.log 2>/dev/null | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10 >> $REPORT
echo "" >> $REPORT
echo "=== 新增用戶 ===" >> $REPORT
sudo grep "useradd" /var/log/auth.log 2>/dev/null >> $REPORT
echo "" >> $REPORT
echo "=== SUID 文件變化 ===" >> $REPORT
sudo aide --check 2>&1 | head -20 >> $REPORT
echo "" >> $REPORT
echo "=== 高 CPU 進程 ===" >> $REPORT
ps aux --sort=-%cpu | head -10 >> $REPORT
echo "" >> $REPORT
# 發送郵件
mail -s "每週安全檢查報告 - $(hostname)" $EMAIL < $REPORT# 設置定時任務
sudo crontab -e
# 每週一早上 8 點執行
0 8 * * 1 /opt/scripts/weekly-security-check.sh十、常用命令速查
# 進程檢查
ps aux --sort=-%cpu | head -10 # CPU 佔用最高
ps aux --sort=-%mem | head -10 # 內存佔用最高
ps aux | grep -iE "miner|xmrig" # 查找挖礦進程
# 網絡檢查
ss -tlnp # 監聽端口
ss -tnp # 建立的連接
ss -tn | awk '{print $5}' | sort | uniq -c | sort -rn # 連接統計
# 用戶檢查
w # 當前登錄用戶
last # 登錄歷史
awk -F: '$3==0 {print $1}' /etc/passwd # UID=0 用戶
# 文件檢查
find / -perm -4000 -type f 2>/dev/null # SUID 文件
find / -mtime -7 -type f 2>/dev/null | head -20 # 最近修改文件
find /tmp -type f -executable 2>/dev/null # /tmp 下可執行文件
# 日誌檢查
grep "Failed password" /var/log/auth.log # 失敗登錄
grep "Accepted" /var/log/auth.log # 成功登錄
grep "useradd" /var/log/auth.log # 用戶創建
# 工具
sudo rkhunter --check # Rootkit 檢測
sudo aide --check # 文件完整性
sudo lynis audit system # 綜合審計十一、總結
服務器安全是一個持續的過程:
- 預防為主:及時更新、關閉不必要的服務、配置防火牆
- 定期檢查:定期運行安全檢查腳本和工具
- 實時監控:使用 AIDE、Auditd 等工具持續監控
- 快速響應:發現入侵後按流程快速處理
- 總結覆盤:每次安全事件後總結經驗,完善防護
🛡️ 安全沒有銀彈,但你可以通過系統化的檢測和加固,將風險降到最低。最好的入侵檢測,是你在黑客之前發現自己的漏洞。
相關文章推薦: