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"作为默认级别
投递流程
- 实时消费:使用日志服务消费组构建程序实时消费日志。
- 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)
启动程序示例
-
环境变量配置:
inibash 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=<消费组名>
-
运行程序:
bash python3 sync_data.py
并发消费与高可用
- 并发消费:可以启动多个程序实例以实现并发消费,每个实例的消费者名称应不同。
- 高可用:消费组会自动检测断点并从断点继续消费,确保日志不丢失