
مكتبة Go لتحليل وتنفيذ قواعد الكشف Sigma على إدخالات السجلات، مع دعم معدّلات الحقول، ومطابقة CIDR، ومحلّلات الحقول المخصصة للمراقبة الأمنية.
github.com/runreveal/sigmaliteتوفر الحزمة sigmalite محللاً ومحرك تنفيذ لـ [تنسيق كشف Sigma][].
rule, err := sigmalite.ParseRule([]byte(`
title: My example rule
detection:
keywords:
- foo
- bar
selection:
EventId: 1234
condition: keywords and selection
`))
if err != nil {
return err
}
entry := &sigmalite.LogEntry{
Message: "Hello foo",
Fields: map[string]string{
"EventId": "1234",
},
}
isMatch := rule.Detection.Matches(entry, nil)
go get github.com/runreveal/sigmalite
تُكتب القواعد بتنسيق YAML وتتضمن على الأقل title و detection:
title: My example rule
detection:
keywords:
- foo
- bar
selection:
EventId: 1234
condition: keywords and selection
حقل condition في كتلة detection هو تعبير منطقي يربط محددات الحقول الأخرى في كتلة detection. في هذا المثال، ستطابق هذه القاعدة أي إدخال سجل يحتوي على حقل EventId قيمته بالضبط 1234 و يحتوي على "foo" أو "bar" في رسالته.
يمكن أيضًا مطابقة الحقول باستخدام [التعبيرات العادية][]:
title: My example rule with a timestamp
detection:
selection:
Timestamp|re: ^2024-06-01T(01|02|03):[0-5][0-9]:[0-5][0-9]$
condition: selection
وكذلك CIDRs:
title: My example rule with IP addresses
detection:
local:
DestinationIp|cidr:
- "127.0.0.0/8"
- "10.0.0.0/8"
- "172.16.0.0/12"
- "192.168.0.0/16"
- "169.254.0.0/16"
- "::1/128" # IPv6 loopback
- "fe80::/10" # IPv6 link-local addresses
- "fc00::/7" # IPv6 private addresses
condition: not local
يمكن العثور على مزيد من المعلومات في [وثائق قواعد Sigma الرسمية][].
تدعم هذه المكتبة معدِّلات الحقول التالية:
واجهة FieldResolver توسع مواصفات Sigma القياسية لدعم سيناريوهات البحث المعقدة في الحقول التي تتجاوز أزواج المفتاح/القيمة البسيطة. يتيح لك ذلك تنفيذ منطق حل حقول مخصص لـ:
event.process.user)process.*.user أو network[*].iptype FieldResolver interface {
Resolve(fieldName string, entry *LogEntry) []string
}
تأخذ طريقة Resolve اسم الحقل من قاعدة Sigma الخاصة بك وتعيد جميع القيم المطابقة كشريحة نصية. إذا لم يتم العثور على مطابقات، قم بإرجاع nil أو شريحة فارغة.
// CustomResolver demonstrates field resolution for structured logs
type CustomResolver struct{}
func (r *CustomResolver) Resolve(fieldName string, entry *sigma.LogEntry) []string {
switch fieldName {
case "process.users":
// Aggregate user fields from multiple sources
var users []string
if user, ok := entry.Fields["Event.Process.User"]; ok {
users = append(users, user)
}
if user, ok := entry.Fields["Event.Login.User"]; ok {
users = append(users, user)
}
if user, ok := entry.Fields["Event.Session.User"]; ok {
users = append(users, user)
}
return users
case "network.internal_ips":
// Extract all IP addresses from network-related fields
var ips []string
for fieldName, value := range entry.Fields {
if strings.Contains(strings.ToLower(fieldName), "ip") {
// Simple IP validation (in real usage, use proper validation)
if strings.Contains(value, ".") {
ips = append(ips, value)
}
}
}
return ips
default:
return nil
}
}
func matches(detection *sigmalite.Detection) bool {
opts := &sigmalite.MatchOptions{
FieldResolver: CustomResolver{},
},
entry := &sigmalite.LogEntry{
Message: string("Message Text"),
Fields: nil, // Using resolver so this can be empty
}
return detection.Matches(entry, opts)
}
تعمل محللات الحقول بسلاسة مع جميع معدِّلات الحقول، مما يسمح لك بتطبيق أنماط regex والمطابقة غير الحساسة لحالة الأحرف وتحويلات أخرى على القيم التي تم حلها.