Linux日志管理与故障排查

Linux日志管理与故障排查

系统日志记录了服务器运行状态、安全事件和应用程序行为,是故障排查和安全审计的重要依据。

日志文件结构

Linux 系统日志主要存放在 /var/log/ 目录下:

1
2
3
4
5
6
7
8
9
10
11
1234567891011/var/log/
├── auth.log # 认证日志(SSH 登录、sudo 等)
├── syslog # 系统日志
├── kern.log # 内核日志
├── dmesg # 启动日志
├── boot.log # 启动过程日志
├── dpkg.log # 软件包安装日志
├── apt/ # APT 包管理器日志
├── nginx/ # Nginx Web 服务器日志
├── mysql/ # MySQL 数据库日志
└── cron.log # 定时任务日志

核心日志命令

查看日志文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1234567891011121314# 实时查看日志(最后100行)
tail -f /var/log/syslog

# 查看最后 50 行
tail -n 50 /var/log/auth.log

# 分页查看
less /var/log/syslog

# 查看完整内容
cat /var/log/dmesg

# 查看启动日志
dmesg | less

搜索和分析日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1234567891011121314151617# 搜索关键词
grep "error" /var/log/syslog

# 忽略大小写搜索
grep -i "failed" /var/log/auth.log

# 显示匹配行前后 5 行
grep -C 5 "error" /var/log/syslog

# 统计错误数量
grep -c "error" /var/log/syslog

# 搜索多个模式
grep -E "error|warning|critical" /var/log/syslog

# 组合命令分析
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn

日志轮转配置

1
2
3
4
5
6
7
8
9
123456789# 查看日志轮转配置
cat /etc/logrotate.conf
ls -la /etc/logrotate.d/

# 手动执行日志轮转
logrotate -f /etc/logrotate.conf

# 测试轮转配置
logrotate -d /etc/logrotate.conf

自定义日志轮转配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1234567891011121314cat > /etc/logrotate.d/myapp << 'EOF'
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
systemctl reload myapp
endscript
}
EOF

实战案例:SSH 暴力破解分析与防护

问题场景

服务器 SSH 服务遭受暴力破解攻击,需要分析日志、识别攻击源并实施防护措施。

解决方案

第一步:分析认证日志

1
2
3
4
5
6
7
8
9
10
11
1234567891011# 查看失败的 SSH 登录尝试
grep "Failed password" /var/log/auth.log | tail -20

# 统计攻击 IP 地址
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10

# 查看攻击时间分布
grep "Failed password" /var/log/auth.log | awk '{print $1, $2, $3}' | sort | uniq -c

# 查看尝试的用户名
grep "Failed password" /var/log/auth.log | awk '{print $(NF-5)}' | sort | uniq -c | sort -rn | head -10

第二步:识别攻击模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
123456789101112131415161718192021222324# 创建分析脚本
cat > /usr/local/bin/analyze-ssh-attack.sh << 'EOF'
#!/bin/bash

LOG_FILE="/var/log/auth.log"
REPORT_FILE="/tmp/ssh-attack-report.txt"

echo "SSH 攻击分析报告" > $REPORT_FILE
echo "生成时间:$(date)" >> $REPORT_FILE
echo "================" >> $REPORT_FILE

echo -e "\n攻击 IP 排行:" >> $REPORT_FILE
grep "Failed password" $LOG_FILE | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE

echo -e "\n尝试用户名排行:" >> $REPORT_FILE
grep "Failed password" $LOG_FILE | awk '{print $(NF-5)}' | sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE

echo -e "\n攻击时间分布:" >> $REPORT_FILE
grep "Failed password" $LOG_FILE | awk '{print $1, $2}' | sort | uniq -c | tail -24 >> $REPORT_FILE

cat $REPORT_FILE
EOF

chmod +x /usr/local/bin/analyze-ssh-attack.sh

第三步:实施防护措施

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
12345678910111213141516171819202122232425# 安装 Fail2Ban
apt update
apt install fail2ban -y

# 配置 SSH 防护
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
EOF

# 启动服务
systemctl restart fail2ban
systemctl enable fail2ban

# 查看状态
fail2ban-client status sshd

# 查看被禁 IP
fail2ban-client get sshd banned

第四步:配置 SSH 安全加固

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
123456789101112131415# 修改 SSH 配置
cat > /etc/ssh/sshd_config << 'EOF'
Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 60
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers admin deploy
EOF

# 重启 SSH 服务
systemctl restart sshd

第五步:创建监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
12345678910111213141516171819202122232425262728293031323334cat > /usr/local/bin/monitor-ssh.sh << 'EOF'
#!/bin/bash

LOG_FILE="/var/log/auth.log"
ALERT_LOG="/var/log/ssh-alerts.log"
THRESHOLD=10

# 检测最近 5 分钟的失败尝试
COUNT=$(grep "Failed password" $LOG_FILE | \
awk -v d="$(date -d '5 minutes ago' '+%b %d %H:%M')" \
'$1" "$2" "$3 >= d' | wc -l)

if [ $COUNT -gt $THRESHOLD ]; then
echo "$(date): 检测到 $COUNT 次 SSH 失败尝试" >> $ALERT_LOG

# 获取攻击 IP
ATTACKERS=$(grep "Failed password" $LOG_FILE | \
awk -v d="$(date -d '5 minutes ago' '+%b %d %H:%M')" \
'$1" "$2" "$3 >= d' | \
awk '{print $(NF-3)}' | sort | uniq)

echo "攻击 IP: $ATTACKERS" >> $ALERT_LOG

# 临时封禁
for ip in $ATTACKERS; do
iptables -A INPUT -s $ip -p tcp --dport 2222 -j DROP
done
fi
EOF

chmod +x /usr/local/bin/monitor-ssh.sh

# 设置定时检查
echo "*/5 * * * * /usr/local/bin/monitor-ssh.sh" | crontab -

验证测试

1
2
3
4
5
6
7
8
9
10
11
12
123456789101112# 运行分析脚本
/usr/local/bin/analyze-ssh-attack.sh

# 查看 Fail2Ban 状态
fail2ban-client status
fail2ban-client status sshd

# 查看监控日志
tail -f /var/log/ssh-alerts.log

# 测试 SSH 连接
ssh -p 2222 admin@localhost

总结

日志管理的关键点:

    1. 熟悉日志文件位置和作用
    1. 掌握 tail、grep、awk 等分析命令
    1. 配置日志轮转避免磁盘占满
    1. 使用 Fail2Ban 自动防护暴力破解
    1. 建立监控脚本及时发现异常