引言:安全监控的重要性

在网络安全中有一句话:"看不见的东西无法防御"。即使拥有强大的防火墙和入侵检测系统,如果无法实时了解正在发生什么,就无法有效应对安全事件。安全监控和日志分析是维护组织安全态势和快速响应威胁的核心能力。

在本第9篇中,我们将学习各种日志的类型和集中日志管理系统的构建方法、使用ELK Stack构建日志分析平台、SIEM(安全信息和事件管理)的概念和应用,以及异常检测和威胁情报的活用方法。

1. 日志的类型和重要性

1.1 系统日志 (System Logs)

系统日志记录操作系统级别发生的所有事件。在Linux系统中存储在/var/log/目录中,在Windows中可以通过事件查看器确认。

  • /var/log/syslog (或 /var/log/messages):系统全面的消息和事件
  • /var/log/auth.log:认证相关事件(登录尝试、sudo使用等)
  • /var/log/kern.log:内核级消息
  • /var/log/dmesg:启动时硬件和驱动消息
  • /var/log/cron:cron任务执行记录
# 实时日志监控
tail -f /var/log/auth.log

# 特定模式搜索
grep "Failed password" /var/log/auth.log

# 检查最近登录失败尝试
lastb | head -20

1.2 应用程序日志 (Application Logs)

应用程序日志是各个服务或应用程序生成的日志。Web服务器、数据库、邮件服务器等各服务都有独特的日志格式。

  • Apache/Nginx访问日志:Web请求记录
  • Apache/Nginx错误日志:错误和警告消息
  • MySQL/PostgreSQL日志:查询执行和错误
  • 应用程序自身日志:业务逻辑相关事件
# Nginx访问日志格式示例
# 192.168.1.100 - - [22/Jan/2026:10:15:32 +0900] "GET /api/users HTTP/1.1" 200 1234 "-" "Mozilla/5.0..."

# 查看访问频率高的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 按HTTP状态码统计
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

1.3 安全日志 (Security Logs)

安全日志专门记录安全相关事件。由防火墙、IDS/IPS、杀毒软件等安全设备和软件生成。

  • 防火墙日志:允许/阻止的连接记录
  • IDS/IPS日志:检测到的攻击尝试
  • 审计日志 (Audit Log):系统变更跟踪
  • VPN日志:远程访问记录
# Linux auditd日志检查
ausearch -m USER_LOGIN -ts today

# iptables日志检查(如果配置了日志记录)
grep "iptables" /var/log/syslog

# SELinux拒绝日志检查
ausearch -m avc -ts recent

1.4 网络日志 (Network Logs)

网络日志记录网络流量和连接信息。由路由器、交换机、代理服务器等生成。

  • NetFlow/sFlow:网络流量流数据
  • DNS查询日志:域名查询记录
  • DHCP日志:IP分配记录
  • 代理日志:Web流量记录

2. 集中日志管理系统

2.1 使用rsyslog的集中式日志

rsyslog是Linux系统中最广泛使用的系统日志守护进程。提供远程日志收集和过滤功能。

# 集中日志服务器设置 (/etc/rsyslog.conf)
# 通过UDP 514端口接收远程日志
$ModLoad imudp
$UDPServerRun 514

# 通过TCP 514端口接收远程日志(更稳定)
$ModLoad imtcp
$InputTCPServerRun 514

# 按远程主机分别存储日志
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
# 客户端设置 (/etc/rsyslog.conf)
# 将所有日志发送到远程服务器(TCP)
*.* @@192.168.1.10:514

# 仅发送特定facility
auth,authpriv.* @@192.168.1.10:514
kern.* @@192.168.1.10:514

2.2 使用syslog-ng的高级日志管理

syslog-ng提供比rsyslog更灵活的配置和过滤功能。适合需要复杂日志路由和解析的环境。

# syslog-ng服务器设置 (/etc/syslog-ng/syslog-ng.conf)
@version: 3.35

source s_network {
    tcp(ip("0.0.0.0") port(514));
    udp(ip("0.0.0.0") port(514));
};

destination d_hosts {
    file("/var/log/remote/$HOST/$PROGRAM.log"
        create-dirs(yes)
        dir-perm(0755)
        perm(0644));
};

filter f_security {
    facility(auth, authpriv) or
    match("attack" value("MESSAGE")) or
    match("failed" value("MESSAGE"));
};

log {
    source(s_network);
    filter(f_security);
    destination(d_hosts);
};

2.3 日志保留策略

日志保留策略在合规性和存储管理方面非常重要。可以使用logrotate实现自动化。

# /etc/logrotate.d/security-logs
/var/log/remote/*/*.log {
    daily
    rotate 90
    compress
    delaycompress
    missingok
    notifempty
    create 0644 root root
    sharedscripts
    postrotate
        /usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
    endscript
}

3. ELK Stack构建

3.1 ELK Stack概述

ELK Stack是Elasticsearch、Logstash、Kibana的组合,是用于大规模日志数据收集、存储、分析、可视化的强大平台。最近加入了Beats,也被称为Elastic Stack。

  • Elasticsearch:分布式搜索和分析引擎,日志数据存储
  • Logstash:数据收集、解析、转换管道
  • Kibana:数据可视化和仪表板
  • Beats:轻量级数据收集器(Filebeat、Metricbeat等)

3.2 Elasticsearch安装和配置

# Elasticsearch安装(Ubuntu/Debian)
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install elasticsearch

# 基本配置 (/etc/elasticsearch/elasticsearch.yml)
cluster.name: security-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node

# 安全配置(Elasticsearch 8.x)
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
# JVM堆内存设置 (/etc/elasticsearch/jvm.options.d/heap.options)
-Xms4g
-Xmx4g

# 启动服务
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

# 状态检查
curl -X GET "localhost:9200/_cluster/health?pretty"

3.3 Logstash管道配置

# Logstash安装
sudo apt install logstash

# 管道配置 (/etc/logstash/conf.d/security-logs.conf)
input {
    beats {
        port => 5044
    }
    syslog {
        port => 5514
        type => "syslog"
    }
}

filter {
    if [type] == "syslog" {
        grok {
            match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
        }
        date {
            match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
        }
    }

    # SSH登录失败检测
    if [syslog_program] == "sshd" and [syslog_message] =~ /Failed password/ {
        grok {
            match => { "syslog_message" => "Failed password for %{USER:ssh_user} from %{IP:src_ip}" }
        }
        mutate {
            add_tag => ["ssh_failed_login"]
        }
    }

    # 添加GeoIP信息
    if [src_ip] {
        geoip {
            source => "src_ip"
            target => "geoip"
        }
    }
}

output {
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "security-logs-%{+YYYY.MM.dd}"
    }
}

3.4 使用Filebeat收集日志

# Filebeat配置 (/etc/filebeat/filebeat.yml)
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /var/log/auth.log
      - /var/log/syslog
    fields:
      log_type: system

  - type: log
    enabled: true
    paths:
      - /var/log/nginx/access.log
    fields:
      log_type: nginx_access

  - type: log
    enabled: true
    paths:
      - /var/log/nginx/error.log
    fields:
      log_type: nginx_error

output.logstash:
  hosts: ["localhost:5044"]

# 或直接发送到Elasticsearch
# output.elasticsearch:
#   hosts: ["localhost:9200"]
#   index: "filebeat-%{+yyyy.MM.dd}"

3.5 Kibana仪表板配置

# Kibana安装和配置
sudo apt install kibana

# 配置 (/etc/kibana/kibana.yml)
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]

# 启动服务
sudo systemctl enable kibana
sudo systemctl start kibana

在Kibana中配置安全仪表板时,建议包含以下可视化:

  • 登录失败趋势:按时间段显示失败登录尝试的图表
  • 主要攻击源IP:尝试失败次数最多的IP列表
  • 地理分布:攻击尝试的地理位置地图
  • 按事件类型分布:用饼图显示事件类型
  • 实时日志流:最新安全事件列表

4. SIEM概念和应用

4.1 什么是SIEM?

SIEM(安全信息和事件管理)是将安全信息管理(SIM)和安全事件管理(SEM)相结合的解决方案。从各种来源收集日志,并通过关联分析检测安全威胁。

  • 日志收集和规范化:将各种格式的日志标准化
  • 实时监控:安全事件实时监视
  • 关联分析:连接多个事件以识别攻击模式
  • 告警和响应:检测到威胁时自动发送警报
  • 合规性报告:生成审计和合规性报告

4.2 开源SIEM:Wazuh

Wazuh是基于OSSEC的开源SIEM解决方案,可以与ELK Stack集成使用。

# Wazuh服务器安装(单节点)
curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh
sudo bash wazuh-install.sh -a

# Wazuh代理安装(客户端)
curl -sO https://packages.wazuh.com/4.7/wazuh-agent-4.7.0-1.x86_64.rpm
sudo rpm -ivh wazuh-agent-4.7.0-1.x86_64.rpm

# 代理配置
sudo sed -i 's/MANAGER_IP/192.168.1.10/' /var/ossec/etc/ossec.conf
sudo systemctl enable wazuh-agent
sudo systemctl start wazuh-agent

4.3 SIEM规则编写

<!-- Wazuh自定义规则 (/var/ossec/etc/rules/local_rules.xml) -->
<group name="custom_rules">

    <!-- 短时间内多次SSH失败尝试检测 -->
    <rule id="100001" level="10" frequency="5" timeframe="60">
        <if_matched_sid>5710</if_matched_sid>
        <same_source_ip />
        <description>SSH暴力破解攻击检测:1分钟内5次以上失败</description>
        <group>authentication_failures,pci_dss_10.2.4,</group>
    </rule>

    <!-- 异常时间段登录检测 -->
    <rule id="100002" level="8">
        <if_sid>5501</if_sid>
        <time>12am - 6am</time>
        <description>异常时间段登录成功</description>
    </rule>

    <!-- 重要文件变更检测 -->
    <rule id="100003" level="12">
        <if_sid>550</if_sid>
        <match>/etc/passwd|/etc/shadow|/etc/sudoers</match>
        <description>重要系统文件变更检测</description>
    </rule>

</group>

5. 异常检测

5.1 基线(Baseline)设置

要检测异常,首先需要了解正常活动模式。基线可以按时间段、星期、用户分别设置。

  • 网络流量:平均带宽使用量、协议分布
  • 登录模式:通常的登录时间、位置
  • 进程活动:正常运行的进程列表
  • 文件访问:一般的文件访问模式

5.2 异常类型

  • 量异常:异常高或低的流量/日志量
  • 时间异常:异常时间段的活动
  • 地理异常:来自意外位置的访问
  • 行为异常:与平时不同的用户行为模式
  • 协议异常:异常协议使用或端口访问

5.3 基于机器学习的异常检测

可以利用Elasticsearch的ML功能自动检测异常。

// Elasticsearch ML任务创建示例
PUT _ml/anomaly_detectors/security_login_anomaly
{
  "description": "登录异常检测",
  "analysis_config": {
    "bucket_span": "15m",
    "detectors": [
      {
        "function": "high_count",
        "field_name": "event.action",
        "by_field_name": "source.ip",
        "detector_description": "按IP检测异常高的登录尝试"
      }
    ],
    "influencers": ["source.ip", "user.name"]
  },
  "data_description": {
    "time_field": "@timestamp"
  },
  "datafeed_config": {
    "indices": ["security-logs-*"],
    "query": {
      "bool": {
        "filter": [
          {"term": {"event.category": "authentication"}}
        ]
      }
    }
  }
}

6. 威胁情报应用

6.1 什么是威胁情报?

威胁情报(Threat Intelligence)是指收集和分析的网络威胁相关信息。利用它可以提前检测并响应已知威胁。

  • 战术情报:IOC(入侵指标)、恶意IP、域名列表
  • 运营情报:攻击者TTP(战术、技术、程序)
  • 战略情报:威胁趋势、攻击组织分析

6.2 威胁源集成

# 下载恶意IP列表并应用
wget -O /etc/threat-intel/malicious-ips.txt https://example.com/threat-feeds/ips.txt

# 在Logstash中利用威胁情报
filter {
    translate {
        field => "src_ip"
        destination => "threat_match"
        dictionary_path => "/etc/threat-intel/malicious-ips.txt"
        fallback => "clean"
    }

    if [threat_match] != "clean" {
        mutate {
            add_tag => ["threat_detected"]
            add_field => { "threat_source" => "ip_blocklist" }
        }
    }
}

6.3 MISP(恶意软件信息共享平台)

MISP是用于共享和管理威胁情报的开源平台。

# 使用MISP API查询IOC
from pymisp import PyMISP

misp = PyMISP('https://misp.example.com', 'your-api-key', ssl=True)

# 查询特定IP
result = misp.search(controller='attributes', value='192.168.1.100')

# 查询最近事件
events = misp.search(controller='events', timestamp='7d')

# 导出IOC
iocs = misp.search(controller='attributes', type_attribute='ip-dst', to_ids=True)

7. 安全仪表板配置示例

7.1 核心安全指标(KPI)

为了有效的安全监控,应在仪表板中包含以下指标:

  • MTTD(平均检测时间):检测威胁的平均所需时间
  • MTTR(平均响应时间):响应的平均所需时间
  • 每日安全事件数:按严重程度分类
  • 阻止的攻击数:防火墙/IPS阻止的尝试
  • 漏洞现状:未打补丁的系统数

7.2 实时告警设置

# Elasticsearch Watcher告警设置
PUT _watcher/watch/ssh_bruteforce_alert
{
  "trigger": {
    "schedule": { "interval": "1m" }
  },
  "input": {
    "search": {
      "request": {
        "indices": ["security-logs-*"],
        "body": {
          "query": {
            "bool": {
              "must": [
                { "match": { "tags": "ssh_failed_login" }},
                { "range": { "@timestamp": { "gte": "now-5m" }}}
              ]
            }
          },
          "aggs": {
            "by_ip": {
              "terms": { "field": "src_ip", "min_doc_count": 10 }
            }
          }
        }
      }
    }
  },
  "condition": {
    "compare": { "ctx.payload.aggregations.by_ip.buckets.0.doc_count": { "gte": 10 }}
  },
  "actions": {
    "send_email": {
      "email": {
        "to": "security@example.com",
        "subject": "[告警] SSH暴力破解攻击检测",
        "body": "IP {{ctx.payload.aggregations.by_ip.buckets.0.key}}在5分钟内发生了{{ctx.payload.aggregations.by_ip.buckets.0.doc_count}}次SSH登录失败。"
      }
    },
    "webhook": {
      "webhook": {
        "method": "POST",
        "url": "https://hooks.slack.com/services/xxx/yyy/zzz",
        "body": "{\"text\": \"SSH暴力破解攻击检测: {{ctx.payload.aggregations.by_ip.buckets.0.key}}\"}"
      }
    }
  }
}

8. 实战日志分析场景

8.1 Web服务器入侵调查

# 搜索可疑请求模式
grep -E "(union.*select|script>|../|cmd=|exec\()" /var/log/nginx/access.log

# 跟踪特定IP的所有活动
grep "192.168.1.100" /var/log/nginx/access.log | less

# 异常大的响应大小(疑似数据泄露)
awk '$10 > 1000000 {print $1, $7, $10}' /var/log/nginx/access.log

# 大量404错误(疑似扫描)
awk '$9 == 404 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head

8.2 权限提升尝试检测

# sudo使用记录分析
grep "sudo:" /var/log/auth.log | grep -v "session opened\|session closed"

# 失败的sudo尝试
grep "sudo:.*authentication failure" /var/log/auth.log

# su命令使用记录
grep "su\[" /var/log/auth.log

# 检查可疑cron任务
grep "CRON" /var/log/syslog | grep -v "session"

结论

安全监控和日志分析是维护组织安全态势的核心活动。本篇内容总结如下:

  • 日志类型:系统、应用程序、安全、网络日志的特性和应用方法
  • 集中日志管理:使用rsyslog、syslog-ng进行日志集中化
  • ELK Stack:使用Elasticsearch、Logstash、Kibana构建日志分析平台
  • SIEM:安全事件关联分析和自动化威胁检测
  • 异常检测:基线设置和基于机器学习的检测
  • 威胁情报:利用外部威胁信息进行提前检测

有效的安全监控仅靠工具是不够的。了解组织的环境和业务、持续改进检测规则、管理告警疲劳(Alert Fatigue)非常重要。

下一篇第10篇将学习发生入侵事故时如何响应,以及通过数字取证分析事故的方法。我们将通过安全事故响应流程和实际取证技术来结束本系列。