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

并发消费与高可用

  • 并发消费:可以启动多个程序实例以实现并发消费,每个实例的消费者名称应不同。
  • 高可用:消费组会自动检测断点并从断点继续消费,确保日志不丢失
相关推荐
用户835629078051几秒前
用Python轻松转换Excel表格为HTML格式
后端·python
用户084059812908 分钟前
高版本的jdk在使用maven时,如何编译成低版本的class
后端
渣哥20 分钟前
从 AOP 到代理:Spring 事务注解是如何生效的?
前端·javascript·面试
这里有鱼汤23 分钟前
炒股的尽头真的是玄学?我用八字+AI做了个实验,结果震惊
后端
hrrrrb27 分钟前
【Spring Security】认证(二)
java·后端·spring
程序员爱钓鱼34 分钟前
Python编程实战 · 基础入门篇 | Python的版本与安装
后端·python
舒克日记40 分钟前
基于springboot针对老年人的景区订票系统
java·spring boot·后端
GoldenaArcher1 小时前
GraphQL 工程化篇 III:引入 Prisma 与数据库接入
数据库·后端·graphql
晨非辰1 小时前
【面试高频数据结构(四)】--《从单链到双链的进阶,读懂“双向奔赴”的算法之美与效率权衡》
java·数据结构·c++·人工智能·算法·机器学习·面试