安全分析师的核心技能:日志采集、解析与威胁狩猎
日志是安全事件的"黑匣子"——攻击者在系统中留下的每一个脚印都会记录在日志中。据统计,安全事件被发现的平均时间是207天,而通过有效的日志分析可以将发现时间缩短到数小时。
# 常见日志文件位置
/var/log/syslog # Debian/Ubuntu系统日志
/var/log/messages # CentOS/RHEL系统日志
/var/log/auth.log # 认证日志(Debian)
/var/log/secure # 认证日志(CentOS)
/var/log/kern.log # 内核日志
/var/log/apache2/access.log # Apache访问日志
/var/log/nginx/access.log # Nginx访问日志
/var/log/mysql/error.log # MySQL错误日志
# 使用journalctl查看systemd日志
journalctl -u sshd # SSH服务日志
journalctl -u nginx # Nginx日志
journalctl --since "1 hour ago" # 最近1小时
journalctl -p err # 错误级别以上
journalctl -f # 实时跟踪
# SSH暴力破解检测
grep "Failed password" /var/log/auth.log | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10
# 234 203.0.113.50
# 45 198.51.100.22
# 12 192.0.2.100
# 成功登录检查
grep "Accepted" /var/log/auth.log
# May 19 10:15:32 server sshd[12345]: Accepted publickey for admin from 10.0.0.5
# 检查异常时间登录
grep "Accepted" /var/log/auth.log | \
awk '{print $1, $2, $3}' | \
awk -F: '{if ($1 < 6 || $1 > 22) print}'
# 检查sudo使用
grep "sudo:" /var/log/auth.log
# 检查新用户创建
grep "useradd" /var/log/auth.log
# 检查用户切换
grep "su:" /var/log/auth.log
# 模拟Apache/Nginx访问日志
# 格式: IP - - [时间] "请求" 状态码 字节数
# 创建测试日志
cat > /tmp/access.log << 'EOF'
192.168.1.100 - - [19/May/2026:10:15:32 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.101 - - [19/May/2026:10:16:45 +0800] "GET /admin HTTP/1.1" 403 567
10.0.0.50 - - [19/May/2026:10:17:01 +0800] "GET /?id=1 OR 1=1 HTTP/1.1" 200 3456
10.0.0.50 - - [19/May/2026:10:17:02 +0800] "POST /login HTTP/1.1" 401 890
192.168.1.200 - - [19/May/2026:10:18:00 +0800] "GET /../../etc/passwd HTTP/1.1" 400 234
10.0.0.50 - - [19/May/2026:10:19:00 +0800] "GET /api/users?role=admin HTTP/1.1" 200 890
EOF
# === 基础统计 ===
# 访问量TOP IP
awk '{print $1}' /tmp/access.log | sort | uniq -c | sort -rn
# 3 10.0.0.50
# 1 192.168.1.200
# 1 192.168.1.101
# 1 192.168.1.100
# HTTP状态码统计
awk '{print $9}' /tmp/access.log | sort | uniq -c | sort -rn
# 3 200
# 1 403
# 1 401
# 1 400
# 请求方法统计
awk '{print $6}' /tmp/access.log | sort | uniq -c | sort -rn
# === 攻击特征提取 ===
# SQL注入特征
grep -iE "union|select|1=1|or.*=.*--|'.*or.*'" /tmp/access.log
# 10.0.0.50 - - [...] "GET /?id=1 OR 1=1 HTTP/1.1" 200 3456
# XSS特征
grep -iE "