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

并发消费与高可用

  • 并发消费:可以启动多个程序实例以实现并发消费,每个实例的消费者名称应不同。
  • 高可用:消费组会自动检测断点并从断点继续消费,确保日志不丢失
相关推荐
paopaokaka_luck11 分钟前
智能推荐社交分享小程序(websocket即时通讯、协同过滤算法、时间衰减因子模型、热度得分算法)
数据库·vue.js·spring boot·后端·websocket·小程序
程序员NEO27 分钟前
Spring AI 对话记忆大揭秘:服务器重启,聊天记录不再丢失!
人工智能·后端
用户214118326360228 分钟前
惊爆!国内轻松白嫖 Claude Code,编程效率狂飙
后端
赋范大模型技术社区28 分钟前
【LangChain 实战】多智能体协作实现浏览器自动化丨Agents 运行流程丨多工具串&并联调用
架构·github·代码规范
iccb101333 分钟前
我是如何实现在线客服系统的极致稳定性与安全性的
前端·javascript·后端
爱学习的茄子38 分钟前
React Hooks驱动的Todo应用:现代函数式组件开发实践与组件化架构深度解析
前端·react.js·面试
M1A139 分钟前
Java 面试系列第一弹:基础问题大盘点
java·后端·mysql
夕颜1111 小时前
关于 Cursor 小插曲记录
后端
考虑考虑1 小时前
go中的Map
后端·程序员·go