1.1、syslog简介

完善的日志分析系统应该能够通过多种协议(包括syslog等)进行日志采集并对日志分析,因此日志分析系统首先需要实现对多种日志协议的解析。其次,需要对收集到的海量日志信息进行分析,再利用数据挖掘技术,发现隐藏再日志里面的安全问题。

Syslog再UNIX系统中应用非常广泛,它是一种标准协议,负责记录系统事件的一个后台程序,记录内容包括核心、系统程序的运行情况及所发生的事件。Syslog协议使用UDP作为传输协议,通过514端口通信,Syslog使用syslogd后台进程,syslogd启动时读取配置文件/etc/syslog.conf,它将网络设备的日志发送到安装了syslog软件系统的日志服务器,Syslog日志服务器自动接收日志数据并写到指定的日志文件中。

1.2、syslog日志格式

syslog标准协议如下图:
在这里插入图片描述

Syslog消息并没有对最小长度有所定义,但报文的总长度必须在1024字节之内。其中PRI部分必须有3个字符,以‘<’为起始符,然后紧跟一个数字,最后以‘>’结尾。在括号内的数字被称为Priority(优先级),priority值由Facility和severity两个值计算得出,这两个值的级别和含义见表1-1和表1-2。下面是一个例子:

<30>Oct 10 20:30:10 fedora auditd [1780]: The audit daemon is exiting

▶ “<30>”是PRI部分,即Priority(优先级),取值范围0191。 ▶ “Oct 10 20:30:10 fedora”是HEADER(报头部分)。 ▶ “auditd [1780]: The audit daemon is exiting”是MSG(信息)部分。 在PRI部分,该数值和Facility和Level有关,Facility是创建日志的实体,比如由Kernel产生,还是由User产生,或者是Mail产生…而level可以看成是日志级别。他们的关系可以利用公式推导: Priority=Facility * 8 + Level 后台监控程序会被分配一个facility值,而没有分配到facility值的进程则会使用“local user”的facility值,比如很多网络设备都会默认使用facility值“local user 7”来发送信息。 image.png 从分类能看出来Syslog的Facility有一部分(序号1623)是为其他程序预留的,例如Cisco设备使用local4发送PIX防火墙的syslog日志。 表1-2 日志级别描述 image.png

一个简单的 Go 写入 SysLog 的程序

package main
 
import (
	"fmt"
	"net"
	"os"
	"time"
)
 
func main() {
	serverAddr := "syslog-server-ip:514" // 替换为实际的Syslog服务器地址和端口
	hostname, _ := os.Hostname()
	appName := "myapp"
 
	message := generateSyslogMessage(hostname, appName, "Hello, syslog!")
 
	conn, err := net.Dial("udp", serverAddr)
	if err != nil {
		fmt.Printf("Failed to connect to Syslog server: %s\n", err)
		return
	}
	defer conn.Close()
 
	_, err = conn.Write([]byte(message))
	if err != nil {
		fmt.Printf("Failed to send message to Syslog server: %s\n", err)
		return
	}
 
	fmt.Println("Message sent successfully to Syslog server.")
}
 
func generateSyslogMessage(hostname, appName, content string) string {
	currentTime := time.Now().Format("Jan  2 15:04:05")
	return fmt.Sprintf("<14>%s %s %s[%d]: %s", currentTime, hostname, appName, os.Getpid(), content)
}