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

并发消费与高可用

  • 并发消费:可以启动多个程序实例以实现并发消费,每个实例的消费者名称应不同。
  • 高可用:消费组会自动检测断点并从断点继续消费,确保日志不丢失
相关推荐
JustHappy33 分钟前
古法编程秘籍(七):互联网到底是什么?把两台电脑怎么说话搞懂就够了
前端·后端·网络协议
Hommy881 小时前
【剪映小助手】添加图片接口(Add Images)
后端·github·剪映小助手·视频剪辑自动化
GetcharZp1 小时前
别再盲目用 OpenCV 读图了,这才是 CV 预处理的终极杀手锏!
后端
kyriewen2 小时前
Git Commit 前自动修复代码风格?配置 Husky + lint-staged,从此 CR 只聊逻辑
前端·git·面试
程序员二叉2 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉2 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
徐小夕3 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
Cosolar4 小时前
Docsify零构建文档站完全指南:从快速搭建到企业级部署
前端·开源·github
星栈独行5 小时前
Makepad 应用如何读文件、调接口、保存数据
前端·程序人生·ui·rust·github
IT_陈寒5 小时前
Vite热更新失效?可能你在用Windows
前端·人工智能·后端