服务器被入侵后,日志是唯一的"案发现场"。但默认日志分散、格式不统一、没有关联分析,想从里面找到入侵痕迹像大海捞针。今天分享一套日志安全分析方案,从收集、分析到告警,全链路覆盖。
一、集中化日志收集
用 rsyslog 转发到中央服务器:
# /etc/rsyslog.conf
*.* @@log-server.yvps.cn:514
或用 Filebeat + Elasticsearch:
# filebeat.yml
filebeat.inputs:
- type: log
paths:
- /var/log/auth.log
- /var/log/nginx/access.log
- /var/log/mysql/slow.log
output.elasticsearch:
hosts: ["http://es-server:9200"]
二、关键安全日志分析
- SSH 暴力破解检测
# 统计失败登录 IP
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20
# 统计成功登录的时间和 IP
grep "Accepted" /var/log/auth.log | awk '{print $1,$2,$3,$(NF-3)}'
- Web 攻击检测
# SQL 注入尝试
grep -i "union\|select\|insert\|delete\|drop" /var/log/nginx/access.log
# XSS 尝试
grep -i "<script\|javascript\|onerror\|onload" /var/log/nginx/access.log
# 扫描器特征
grep -i "sqlmap\|nikto\|nmap\|masscan" /var/log/nginx/access.log
- 异常时间登录
# 非工作时间(22:00-06:00)的登录
awk '$3 >= "22:00:00" || $3 <= "06:00:00" {print}' /var/log/auth.log
三、自动化告警规则
用 ElastAlert 或 Wazuh:
# 示例:SSH 暴力破解告警
name: SSH Brute Force
type: frequency
index: auth-*
num_events: 5
timeframe:
minutes: 10
filter:
- term:
event.outcome: "failure"
alert:
- webhook
webhook_url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
四、日志完整性保护
# 用 auditd 监控日志文件
auditctl -w /var/log/auth.log -p wa -k auth_log_integrity
auditctl -w /var/log/nginx/access.log -p wa -k nginx_log_integrity
# 用 logrotate 保留足够历史
/var/log/auth.log {
daily
rotate 90
compress
delaycompress
missingok
notifempty
create 0640 root adm
}
五、攻击时间线重建
被入侵后,按时间线梳理事件:
T-0: 攻击者 IP 首次出现(暴力破解)
T+5m: 成功登录(使用窃取密钥或弱密码)
T+10m: 下载恶意脚本(wget/curl 记录)
T+15m: 提权操作(sudo/su 记录)
T+20m: 建立持久化(crontab/ssh key 修改)
T+30m: 数据外传(网络流量异常) 



