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

并发消费与高可用

  • 并发消费:可以启动多个程序实例以实现并发消费,每个实例的消费者名称应不同。
  • 高可用:消费组会自动检测断点并从断点继续消费,确保日志不丢失
相关推荐
豆角焖肉2 分钟前
SpringBoot + Redis 缓存实战
java·spring boot·redis·后端·缓存·菜单缓存
IT_陈寒7 分钟前
深入理解Redis:核心原理与最佳实践
前端·人工智能·后端
打工仔折腾 AI9 分钟前
鸿蒙端ToDesk远控电脑实测:蓝牙键鼠、双模式鼠标与跨端剪贴板实践
后端·python·性能优化·计算机外设·电脑·harmonyos·ai agent 实战
AINative软件工程14 分钟前
LLM 异步任务的 Webhook 工程实践:回调可靠投递、重试与幂等消费的生产设计
后端·ai编程
miofly16 分钟前
GitHub 日榜趋势速报 | 2026-10-13
开源·github
高频因子挖掘机22 分钟前
Python 批量获取股票行情后,如何用 Pandas 统一字段、索引和数据类型?
后端·github·api
高频因子挖掘机44 分钟前
多股票 K 线如何用 Pandas 对齐?从收益率计算到横截面分析
后端·github·api
架构技术专栏9 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
码事漫谈10 小时前
你让AI干的活,它可能只干了十分之一——而你根本看不出来
后端