跳轉到內容

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

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

🛡️ 服務器被黑,往往在你發現之前就已經發生。 黑客入侵服務器後,通常會植入後門、挖礦程序或竊取數據。等到發現時,損失往往已經造成。本文帶你係統掌握 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異常提權
異常文件findSUID、最近修改文件

1.2 快速檢查腳本

bash
#!/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 檢查可疑進程

bash
# 查看所有進程
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 下有)
  • 進程名偽裝成系統進程(如 systemdkthreadd

檢查隱藏進程:

bash
# 對比 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_pids

2.2 檢查網絡連接

bash
# 查看所有監聽端口
ss -tlnp
ss -ulnp

# 查看所有建立的連接
ss -tnp
ss -unp

# 查看異常連接(連接到可疑 IP)
ss -tn | grep -v "127.0.0.1" | grep -v "::1"

# 查看網絡統計
ss -s

檢查可疑連接:

bash
# 查看連接到礦池的常見端口
ss -tn | grep -E ":(3333|4444|5555|7777|9000)"
bash
# 查看連接的外部 IP
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn

排查思路:

  • 連接到未知 IP 的進程
  • 監聽了不該監聽的端口
  • 大量連接到同一 IP(可能是 C2 服務器)

2.3 檢查用戶賬號

bash
# 查看所有用戶
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 的系統用戶
bash
# 檢查最近創建的用戶
grep -v "nologin\|false" /etc/passwd | grep "/home"
ls -lt /home/

2.4 檢查 SSH 密鑰

bash
# 檢查 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 檢查定時任務

bash
# 檢查所有用戶的 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

檢查內容:

  • 可疑的下載命令(wgetcurl
  • 執行未知腳本
  • 定時清除日誌的命令
  • 頻繁執行的異常任務

2.6 檢查異常文件

bash
# 查找 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)是文件完整性檢查工具,可以檢測文件是否被篡改。

bash
# Ubuntu / Debian
sudo apt install -y aide

# CentOS / RHEL
sudo yum install -y aide

3.2 初始化數據庫

bash
# 初始化數據庫(需要一些時間)
sudo aideinit

# 或手動初始化
sudo aide --init

# 將新數據庫設為基準
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

⚠️ 重要: 數據庫初始化必須在系統乾淨時進行,否則會以被篡改的狀態為基準。

3.3 執行檢查

bash
# 執行完整性檢查
sudo aide --check

# 更新數據庫(確認修改合法後)
sudo aide --update
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

3.4 配置監控範圍

編輯配置文件 /etc/aide/aide.conf

ini
# 監控規則
# 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
!/tmp

3.5 定時檢查

bash
# 添加定時任務
sudo crontab -e

# 每天凌晨 4 點檢查
0 4 * * * /usr/bin/aide --check | mail -s "AIDE 檢查報告" admin@example.com

四、Rootkit 檢測

4.1 RKHunter

bash
# 安裝
sudo apt install -y rkhunter

# 更新數據庫
sudo rkhunter --update
sudo rkhunter --propupd

# 執行檢查
sudo rkhunter --check

# 僅輸出警告
sudo rkhunter --check --report-warnings-only

檢查內容包括:

  • 系統命令是否被篡改
  • Rootkit 特徵文件
  • 可疑文件和目錄
  • 異常的網絡端口
  • 啟動項檢查

4.2 Chkrootkit

bash
# 安裝
sudo apt install -y chkrootkit

# 執行檢查
sudo chkrootkit

# 僅檢查特定項目
sudo chkrootkit | grep -i "INFECTED"

4.3 Lynis(綜合安全審計)

bash
# 安裝
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.logNginx 訪問日誌
/var/log/nginx/error.logNginx 錯誤日誌
/var/log/audit/audit.log審計日誌
~/.bash_history用戶命令歷史

5.2 SSH 登錄分析

bash
# 成功登錄記錄
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 -rn

5.3 異常行為檢測

bash
# 檢查 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.log

5.4 Nginx 訪問日誌分析

bash
# 訪問量最高的 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 -10

5.5 命令歷史檢查

bash
# 檢查 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%
  • 進程名可能是 kdevtmpfsikinsingxmrig
  • 連接到礦池 IP
  • 存在定時任務自動重啟

排查:

bash
# 查找高 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/

清除步驟:

bash
# 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_keys

6.2 Webshell

特徵:

  • 網站目錄下有可疑 PHP/JSP 文件
  • 文件內容包含 evalsystemexec 等函數
  • 訪問日誌中有頻繁訪問某文件

排查:

bash
# 查找 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 f

6.3 SSH 暴力破解

特徵:

  • 大量失敗登錄記錄
  • 來自同一 IP 的頻繁嘗試

排查:

bash
# 統計失敗登錄
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:隔離服務器

bash
# 斷開網絡(如果確認被入侵)
# 注意:這會斷開 SSH 連接
sudo ifdown eth0
# 或
sudo ip link set eth0 down

💡 如果需要保持 SSH 連接,可以只阻斷出站流量:

bash
sudo iptables -A OUTPUT -d 攻擊者IP -j DROP

步驟 2:保留證據

bash
# 記錄當前狀態
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 被入侵後的清理清單

bash
# 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 加固

bash
# 編輯 SSH 配置
sudo nano /etc/ssh/sshd_config

# 關鍵配置
Port 2222                      # 修改默認端口
PermitRootLogin no             # 禁止 root 登錄
PasswordAuthentication no      # 禁用密碼登錄
PubkeyAuthentication yes       # 使用密鑰登錄
MaxAuthTries 3                 # 最大嘗試次數
AllowUsers your_username       # 只允許指定用戶

8.2 防火牆配置

bash
# 使用 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 enable

8.3 安裝 Fail2ban

bash
sudo apt install -y fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

8.4 禁用不必要的服務

bash
# 查看運行的服務
systemctl list-units --type=service --state=running

# 禁用不必要的服務
sudo systemctl disable unnecessary-service
sudo systemctl stop unnecessary-service

8.5 自動安全更新

bash
# 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

bash
# 安裝
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 logins

9.3 使用 Logwatch

bash
# 安裝
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 = High

9.4 定期安全檢查腳本

bash
#!/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
bash
# 設置定時任務
sudo crontab -e

# 每週一早上 8 點執行
0 8 * * 1 /opt/scripts/weekly-security-check.sh

十、常用命令速查

bash
# 進程檢查
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                  # 綜合審計

十一、總結

服務器安全是一個持續的過程:

  1. 預防為主:及時更新、關閉不必要的服務、配置防火牆
  2. 定期檢查:定期運行安全檢查腳本和工具
  3. 實時監控:使用 AIDE、Auditd 等工具持續監控
  4. 快速響應:發現入侵後按流程快速處理
  5. 總結覆盤:每次安全事件後總結經驗,完善防護

🛡️ 安全沒有銀彈,但你可以通過系統化的檢測和加固,將風險降到最低。最好的入侵檢測,是你在黑客之前發現自己的漏洞。


相關文章推薦:

最後更新於: