当CentOS服务器出现异常进程、陌生连接或文件被篡改时,手动排查往往效率低下且容易遗漏。我们可以通过编写自动化脚本,实现实时入侵检测、证据收集与自动隔离。核心思路是:利用系统工具(如ps、netstat、tripwire)监控关键指标,一旦触发规则就自动执行隔离操作(如封锁IP、禁用账户、备份日志),并生成详细报告供后续分析。

入侵检测脚本的核心模块设计

一个完整的响应脚本应包含监控、分析、响应三个模块。监控模块负责周期性检查系统状态,包括进程列表、网络连接、关键文件哈希值;分析模块将当前状态与基线对比,识别异常;响应模块执行预设隔离动作。建议将脚本设为systemd服务或cron定时任务,实现7x24小时监控。

进程与网络连接监控实现

通过ps和netstat命令获取运行进程和网络连接,与白名单对比。以下脚本片段可检测异常监听端口:

#!/bin/bash
# 监控异常端口
BASELINE_PORTS="22 80 443"
CURRENT_PORTS=$(netstat -tlnp | awk '/LISTEN/{print $4}' | awk -F: '{print $NF}' | sort -u)

for port in $CURRENT_PORTS; do
    if ! echo $BASELINE_PORTS | grep -qw "$port"; then
        echo "$(date) 警报: 发现异常监听端口 $port" >> /var/log/intrusion.log
        # 自动封锁该端口对应进程
        pid=$(netstat -tlnp | awk -v port=":$port$" '$4 ~ port {print $7}' | cut -d/ -f1)
        [ -n "$pid" ] && kill -9 $pid
    fi
done

同时,可使用lsof检查异常进程打开的文件,结合进程CPU/内存使用率阈值(如top -b -n1)识别挖矿病毒等资源滥用行为。

文件完整性校验与Rootkit检测

使用tripwire或aide建立关键文件(/bin、/sbin、/etc/passwd等)的哈希值数据库,定时比对变化。若无专业工具,可用md5sum简易实现:

#!/bin/bash
# 文件完整性检查
CHECK_FILES="/etc/passwd /etc/shadow /usr/bin/ssh"
for file in $CHECK_FILES; do
    current_md5=$(md5sum $file | awk '{print $1}')
    stored_md5=$(grep $file /var/lib/file_hashes.db | awk '{print $2}')
    if [ "$current_md5" != "$stored_md5" ]; then
        echo "$(date) 文件被篡改: $file" >> /var/log/intrusion.log
        # 从备份恢复文件
        cp /backup$file $file
    fi
done

Rootkit检测推荐集成rkhunter或chkrootkit扫描,脚本可自动化扫描并邮件报警。

自动化隔离响应策略

检测到入侵后,脚本应执行分级隔离:

1. 立即封锁可疑IP(通过iptables或firewalld);

2. 暂停可疑进程;

3. 禁用受影响账户;

4. 将相关文件移至沙箱。示例隔离函数:

# 自动隔离函数
isolate_threat() {
    suspicious_ip=$1
    suspicious_user=$2
    # 封锁IP
    firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$suspicious_ip' reject"
    firewall-cmd --reload
    # 禁用用户
    usermod -L $suspicious_user
    # 备份进程树
    pstree -p $suspicious_user > /var/log/isolated/process_$(date +%s).log
}

注意隔离前需备份日志和进程信息到独立分区(如/var/isolated),避免攻击者擦除痕迹。

证据收集与报告生成

响应脚本必须包含取证模块,在隔离同时保存:

1. 系统快照(ps aux、netstat -nap、last);

2. 可疑文件副本(cp -a);

3. 内存状态(通过/proc文件系统)。报告应采用结构化格式(如JSON),便于导入SIEM系统:

{
  "timestamp": "$(date -Iseconds)",
  "incident_id": "$(uuidgen)",
  "affected_host": "$(hostname)",
  "indicators": [
    {"type": "abnormal_process", "value": "$suspicious_proc"},
    {"type": "foreign_connection", "value": "$foreign_ip:$port"}
  ],
  "response_actions": ["ip_blocked", "user_disabled"]
}

报告应实时发送至安全团队邮箱或内部消息平台,确保及时人工介入。

脚本部署与维护要点

将主脚本保存为/usr/local/bin/incident_response.sh,设置700权限,仅root可修改。通过cron每5分钟运行一次:

*/5 * * * * root /usr/local/bin/incident_response.sh >> /var/log/response.log 2>&1

定期更新白名单和哈希数据库,避免误报。测试时可在沙箱环境模拟攻击(如使用metasploit生成反弹shell),验证脚本检测和隔离效果。

与其他安全工具集成建议

入侵响应脚本可作为现有安全体系的补充,与OSSEC、Snort等IDS联动。例如,当Snort检测到SQL注入攻击时,可触发脚本自动封锁源IP并备份web日志。还可扩展云环境支持,在AWS或阿里云CentOS实例中,通过API自动将受感染实例从负载均衡器中移除。

最终,该脚本应与定期安全审计、系统补丁更新形成纵深防御。记住:自动化脚本不能替代人工分析,所有自动隔离操作都需保留完整证据链,供后续取证和规则优化使用。