Syslog投递日志到SIEM:基础知识与实践

Syslog是一种广泛使用的日志传输协议,几乎所有的安全信息与事件管理系统(SIEM)都支持通过Syslog接收日志。下面我们将详细介绍Syslog的基础知识、如何通过Syslog将日志投递到SIEM,以及提供相关的代码示例。

Syslog基础知识

Syslog协议

Syslog协议基于RFC3164和RFC5424定义,后者是2009年发布的升级版本,兼容旧版并解决了许多问题,因此推荐使用RFC5424

Syslog传输方式

Syslog支持TCP和UDP传输方式,但为了保证数据传输的稳定性和安全性,建议使用Syslog over TCP/TLS

Syslog facility和severity

  • facility:早期Unix定义的程序组件,通常使用"user"作为默认组件。
  • severity:定义日志级别,常用"info"作为默认级别

投递流程

  1. 实时消费:使用日志服务消费组构建程序实时消费日志。
  2. Syslog投递:通过Syslog over TCP/TLS将日志发送给SIEM系统

代码示例

以下代码展示如何从日志服务获取数据并投递到SIEM的Syslog服务器。

python 复制代码
python
import os
import logging
from logging.handlers import RotatingFileHandler
from syslogclient import SyslogClientRFC5424 as SyslogClient

# 配置日志服务参数
def get_option():
    endpoint = os.environ.get('SLS_ENDPOINT', '')
    accessKeyId = os.environ.get('SLS_AK_ID', '')
    accessKey = os.environ.get('SLS_AK_KEY', '')
    project = os.environ.get('SLS_PROJECT', '')
    logstore = os.environ.get('SLS_LOGSTORE', '')
    consumer_group = os.environ.get('SLS_CG', '')

    # Syslog配置
    settings = {
        "host": "1.2.3.4", 
        "port": 514,       
        "protocol": "tcp", 
        "sep": "||",       
        "cert_path": None, 
        "timeout": 120,    
        "facility": syslogclient.FAC_USER,  
        "severity": syslogclient.SEV_INFO,  
        "hostname": None,  
        "tag": None        
    }

    return settings

class SyncData:
    def __init__(self, settings):
        self.settings = settings

    def process(self, logs):
        with SyslogClient(self.settings["host"], self.settings["port"], proto=self.settings["protocol"], timeout=self.settings["timeout"]) as client:
            for log in logs:
                # 格式化日志内容
                data = ""
                for k, v in log.items():
                    data += f"{self.settings['sep']}{k}={v}"
                
                # 发送日志到Syslog服务器
                client.log(data, facility=self.settings.get("facility"), severity=self.settings.get("severity"))

if __name__ == '__main__':
    settings = get_option()
    sync_data = SyncData(settings)
    
    # 模拟获取日志数据
    logs = [{"field1": "value1", "field2": "value2"}]
    sync_data.process(logs)

启动程序示例

  1. 环境变量配置

    ini 复制代码
    bash
    export SLS_ENDPOINT=<Endpoint of your region>
    export SLS_AK_ID=<YOUR AK ID>
    export SLS_AK_KEY=<YOUR AK KEY>
    export SLS_PROJECT=<SLS Project Name>
    export SLS_LOGSTORE=<SLS Logstore Name>
    export SLS_CG=<消费组名>
  2. 运行程序

    复制代码
    bash
    python3 sync_data.py

并发消费与高可用

  • 并发消费:可以启动多个程序实例以实现并发消费,每个实例的消费者名称应不同。
  • 高可用:消费组会自动检测断点并从断点继续消费,确保日志不丢失
相关推荐
考虑考虑6 小时前
cmd局部设置java变量
运维·后端·自动化运维
wangruofeng6 小时前
一个 Markdown 文件攒下 37k 星,i-have-adhd 给 AI 输出立了 10 条规矩
github·aigc·ai编程
怕浪猫7 小时前
长会话不崩盘:DeepSeek Harness 的上下文压缩与目标管理策略
面试·github·agent
ocean21037 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
DogDaoDao8 小时前
SimToolReal 解读:用“物体中心“视角重新定义灵巧工具操作
人工智能·机器人·github·关键点·人形机器人·gpt-4o·simtoolreal
陈随易9 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
letisgo59 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
wing9810 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan10 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
步行cgn11 小时前
Spring 报错:No bean class specified on bean definition 的原因与解决
java·后端·spring