Linux 系统日志审计与远程日志收集 - linux运维
Linux 系统日志审计与远程日志收集 - linux运维

Linux系统日志审计与远程日志收集:从入门到企业级实践

引言:为什么日志审计是你的最后一道防线

2023年,某知名云服务商因内部员工滥用权限删除生产数据库,导致数万客户数据丢失。事后调查发现,该员工在操作前已通过SSH登录并执行了rm -rf命令,但公司的日志系统仅本地存储,攻击者在得手后清除了/var/log下的所有记录,导致溯源完全失败。这起事件暴露了大多数Linux运维团队的致命短板:日志分散、无远程备份、缺乏实时审计。

Linux 系统日志审计与远程日志收集 - linux运维

作为安全工程师,我必须告诉你:没有集中式日志审计的Linux系统,就像没有监控摄像头的金库。本文将从实战出发,手把手教你搭建企业级日志审计体系,涵盖本地日志加固、rsyslog远程转发、Logstash集中解析、以及基于auditd的关键操作监控。

一、Linux日志体系核心组件解析

在动手之前,先理解Linux日志的“三驾马车”:

1.1 syslog/rsyslog——系统日志主力

  • 路径:/var/log/messages(RHEL/CentOS)、/var/log/syslog(Debian/Ubuntu)
  • 记录:内核消息、服务启动/停止、认证失败等
  • 配置文件:/etc/rsyslog.conf/etc/rsyslog.d/

1.2 auditd——内核级审计利器

  • 路径:/var/log/audit/audit.log
  • 记录:文件访问、系统调用、用户切换等细粒度事件
  • 配置:/etc/audit/audit.rules

1.3 应用日志——各显神通

  • Nginx:/var/log/nginx/access.log
  • MySQL:/var/log/mysql/error.log
  • SSH:/var/log/auth.log/var/log/secure

二、实战第一步:本地日志加固与审计规则

2.1 保护日志不被篡改

首先,修改日志文件的权限和属性,防止普通用户甚至root误删:

# 设置日志目录权限
chmod 750 /var/log
# 设置关键日志不可修改(需要root)
chattr +a /var/log/auth.log
chattr +a /var/log/syslog

+a属性表示只能追加不能删除,攻击者即使拿到root也无法rmmv日志文件。但注意:这会影响日志轮转,需要配合logrotatecopytruncate模式。

2.2 配置auditd监控关键操作

安装并启动auditd:

sudo apt install auditd -y
sudo systemctl enable auditd
sudo systemctl start auditd

编写审计规则文件 /etc/audit/rules.d/critical.rules

# 监控/etc/passwd和/etc/shadow的修改
-w /etc/passwd -p wa -k user_modify
-w /etc/shadow -p wa -k user_modify

# 监控SSH配置文件
-w /etc/ssh/sshd_config -p wa -k ssh_config

# 监控/bin/su和/usr/bin/sudo的执行
-a always,exit -S execve -F path=/bin/su -k privilege_escalation
-a always,exit -S execve -F path=/usr/bin/sudo -k privilege_escalation

# 监控root用户的bash历史
-w /root/.bash_history -p rwa -k root_history

# 监控重要的系统目录
-w /etc -p wa -k etc_change
-w /bin -p wa -k bin_change

加载规则并验证:

sudo augenrules --load
sudo auditctl -l  # 查看已加载的规则
sudo ausearch -k user_modify  # 搜索特定事件

2.3 日志轮转优化

编辑 /etc/logrotate.d/rsyslog,确保日志不会无限膨胀:

/var/log/syslog
/var/log/auth.log
/var/log/kern.log
{
    rotate 90
    daily
    compress
    delaycompress
    missingok
    notifempty
    sharedscripts
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

三、实战第二步:搭建远程日志收集系统

3.1 架构设计

采用“生产者-消费者”模式:
日志生产者:所有业务服务器(Web、DB、应用)
日志消费者:集中日志服务器(运行rsyslog或Logstash)
传输协议:使用TCP+TLS加密,避免明文传输

3.2 在日志服务器上配置rsyslog

安装rsyslog(通常已预装):

sudo apt install rsyslog -y

编辑 /etc/rsyslog.conf,取消注释以下内容:

# 开启TCP监听
module(load="imtcp")
input(type="imtcp" port="514")

# 开启UDP监听(可选)
module(load="imudp")
input(type="imudp" port="514")

# 使用模板将不同主机的日志分类存储
$template RemoteLogs,"/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%.log"
*.* ?RemoteLogs

重启服务:

sudo systemctl restart rsyslog
sudo netstat -tulpn | grep 514  # 确认端口监听

3.3 在客户端配置日志转发

编辑 /etc/rsyslog.d/50-remote.conf

# 使用TCP协议发送,确保可靠性
*.* @@192.168.1.100:514

# 或者使用UDP(快速但不可靠)
# *.* @192.168.1.100:514

# 可选:限制发送的日志级别(只发送info及以上)
# *.info @@192.168.1.100:514

重启客户端rsyslog:

sudo systemctl restart rsyslog

3.4 进阶:使用TLS加密传输

生成自签名证书(生产环境建议使用CA签名):

# 在日志服务器上
sudo mkdir /etc/rsyslog.d/ssl
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
    -keyout /etc/rsyslog.d/ssl/log-server.key \
    -out /etc/rsyslog.d/ssl/log-server.crt \
    -subj "/CN=logserver.example.com"

服务器端配置 /etc/rsyslog.d/tls.conf

# 加载TLS模块
module(load="imtcp" 
    StreamDriver.Name="gtls"
    StreamDriver.Mode="1"
    StreamDriver.AuthMode="x509/certvalid"
    PermittedPeer=["*.example.com"])

input(type="imtcp" port="6514")

# 证书路径
global(
    DefaultNetstreamDriver="gtls"
    DefaultNetstreamDriverCAFile="/etc/rsyslog.d/ssl/log-server.crt"
    DefaultNetstreamDriverCertFile="/etc/rsyslog.d/ssl/log-server.crt"
    DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/ssl/log-server.key"
)

客户端配置 /etc/rsyslog.d/50-remote-tls.conf

# 加载TLS模块
module(load="imuxsock")
module(load="imklog")
module(load="omtcp")

# 使用TLS发送
*.* action(type="omfwd"
    target="192.168.1.100"
    port="6514"
    protocol="tcp"
    StreamDriver="gtls"
    StreamDriverMode="1"
    StreamDriverAuthMode="x509/certvalid"
    StreamDriverPermittedPeers="logserver.example.com"
)

四、实战第三步:日志实时分析与告警

4.1 使用logwatch生成日报

安装logwatch:

sudo apt install logwatch -y

生成昨天的日志摘要:

sudo logwatch --detail High --range yesterday --output mail --mailto admin@example.com

4.2 实时告警:检测SSH暴力破解

创建脚本 /usr/local/bin/ssh_alert.sh

#!/bin/bash
THRESHOLD=5
LOG_FILE="/var/log/auth.log"

# 统计最近5分钟内失败的SSH登录
FAILED_COUNT=$(grep "Failed password" $LOG_FILE | \
    awk -v date="$(date -d '5 minutes ago' '+%b %e %H:%M')" \
    '$0 >= date' | wc -l)

if [ $FAILED_COUNT -gt $THRESHOLD ]; then
    echo "警告:检测到 $FAILED_COUNT 次SSH登录失败(最近5分钟)" | \
    mail -s "SSH暴力破解告警" admin@example.com
fi

加入crontab每5分钟执行:

*/5 * * * * /usr/local/bin/ssh_alert.sh

4.3 集成ELK实现可视化

安装Filebeat作为轻量级日志收集器:

# 下载并安装Filebeat
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.10.0-amd64.deb
sudo dpkg -i filebeat-8.10.0-amd64.deb

配置 /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/auth.log
    - /var/log/syslog
    - /var/log/audit/audit.log
  fields:
    server_role: web_server
  fields_under_root: true

output.elasticsearch:
  hosts: ["192.168.1.200:9200"]
  username: "elastic"
  password: "your_password"

setup.kibana:
  host: "192.168.1.200:5601"

启动Filebeat并加载仪表盘:

sudo systemctl enable filebeat
sudo systemctl start filebeat
sudo filebeat setup --dashboards

五、真实场景案例:某电商平台日志审计实战

5.1 问题背景

某电商平台在双11大促后,发现数据库出现异常数据修改。需要追溯:
1. 谁在什么时间执行了DELETE FROM orders
2. 是否有未授权的sudo操作?
3. 攻击者是否清除了日志?

5.2 排查过程

步骤1:检查auditd日志

sudo ausearch -k sql_modify -ts 11/10/2023 00:00:00 -te 11/11/2023 23:59:59

输出显示:用户app_user2023-11-11 02:15:30通过MySQL客户端执行了DELETE操作。

步骤2:关联SSH日志

sudo grep "app_user" /var/log/auth.log | grep "Accepted"

发现该用户在凌晨2:10通过SSH从IP 10.0.0.5登录。

步骤3:检查远程日志服务器
由于本地日志已被删除,但远程日志服务器(通过TLS加密传输)完好保存了所有记录,成功还原了攻击路径:
1. 攻击者通过钓鱼邮件获取了app_user的密码
2. 通过SSH登录后,使用sudo mysql -e "DELETE FROM orders"执行操作
3. 随后执行sudo rm -rf /var/log/*试图销毁证据

步骤4:修复措施
– 强制启用SSH双因素认证
– 为数据库操作添加auditd监控规则
– 设置日志保留期至少180天
– 实施最小权限原则,限制app_user的sudo权限

六、最佳实践与注意事项

6.1 安全加固清单

  1. 日志不可篡改:使用chattr +a+远程存储双重保障
  2. 加密传输:所有日志网络传输必须使用TLS
  3. 日志轮转:设置合理保留策略,避免存储耗尽
  4. 权限最小化:日志目录设为750,日志文件640
  5. 时钟同步:所有服务器使用NTP同步时间,保证日志时序

6.2 常见坑点

  • UDP丢包:生产环境务必使用TCP传输
  • 磁盘写满:设置rsyslog的$SystemLogRateLimitInterval防止日志洪泛
  • 证书过期:TLS证书需设置监控和自动续期
  • 日志格式不统一:在rsyslog模板中定义标准化格式,方便后续解析

6.3 检查清单(月度审计)

# 1. 检查auditd是否运行
systemctl status auditd

# 2. 检查远程日志是否正常到达
ls -la /var/log/remote/

# 3. 检查日志文件完整性
sha256sum /var/log/auth.log > /var/log/checksum
# 与远程服务器比对

# 4. 检查日志轮转是否正常
logrotate -d /etc/logrotate.d/rsyslog

# 5. 测试告警机制
logger -p auth.warn "Test alert message"

结语

日志审计不是一次性的配置,而是一个持续演进的过程。从本地日志加固到远程集中收集,再到实时告警和可视化分析,每一步都关系到你的系统能否在遭受攻击后快速溯源。记住:日志是你最后、也是最可靠的证人。今天就开始行动,按照本文的步骤搭建你的日志审计体系,别等到被入侵后才后悔莫及。

如果你在实施过程中遇到问题,欢迎在评论区留言交流。安全之路,道阻且长,行则将至。

📚 推荐资源

– 部分链接含推广返佣 –

🪐 加入「渗透实战安全圈」

每天分享渗透测试实战、挖洞技巧、漏洞分析、工具推荐

知识星球

https://t.zsxq.com/40MyD

💻 安全运维 / Linux运维 / 渗透测试 技术支持
业务需求可联系博客作者

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注