func publishHintToMozdef(hint gozdef.HostAssetHint, gp gozdef.Publisher) error { // create a new event and set values in the fields ev, err := gozdef.NewEvent() if err != nil { return err } ev.Category = "asset_hint" ev.Source = "mig" ev.Summary = fmt.Sprintf("mig discovered endpoint %s", hint.Name) ev.Tags = append(ev.Tags, "mig") ev.Tags = append(ev.Tags, "asset") ev.Info() ev.Details = hint return gp.Send(ev) }
// Send a compliance item to MozDef func sendItem(item gozdef.ComplianceItem) (err error) { ev, err := gozdef.NewEvent() if err != nil { return } ev.Category = "complianceitems" ev.Source = "mig" cverb := "fails" if item.Compliance { cverb = "passes" } ev.Summary = fmt.Sprintf("%s %s compliance with %s", item.Target, cverb, item.Check.Ref) ev.Tags = append(ev.Tags, "mig") ev.Tags = append(ev.Tags, "compliance") ev.Info() ev.Details = item ac := gozdef.ApiConf{Url: conf.MozDef.URL} pub, err := gozdef.InitApi(ac) if err != nil { return } err = pub.Send(ev) return }
func main() { var ( err error conf Config items []gozdef.ComplianceItem ) flag.Usage = func() { fmt.Fprintf(os.Stderr, "%s - a worker that transform commands results into compliance items and publishes them to mozdef\n", os.Args[0]) flag.PrintDefaults() } var configPath = flag.String("c", "/etc/mig/compliance-item-worker.cfg", "Load configuration from file") flag.Parse() err = gcfg.ReadFileInto(&conf, *configPath) if err != nil { panic(err) } logctx, err := mig.InitLogger(conf.Logging, workerName) if err != nil { panic(err) } // bind to the MIG even queue workerQueue := "migevent.worker." + workerName consumerChan, err := workers.InitMqWithConsumer(conf.Mq, workerQueue, mig.Ev_Q_Cmd_Res) if err != nil { panic(err) } // bind to the mozdef relay exchange gp, err := gozdef.InitAmqp(conf.MozDef) if err != nil { panic(err) } mig.ProcessLog(logctx, mig.Log{Desc: "worker started, consuming queue " + workerQueue + " from key " + mig.Ev_Q_Cmd_Res}) tFamRe := regexp.MustCompile("(?i)^compliance$") for event := range consumerChan { var cmd mig.Command err = json.Unmarshal(event.Body, &cmd) if err != nil { mig.ProcessLog(logctx, mig.Log{Desc: fmt.Sprintf("invalid command: %v", err)}.Err()) } // discard actions that aren't threat.family=compliance if !tFamRe.MatchString(cmd.Action.Threat.Family) { continue } items, err = makeComplianceItem(cmd, conf) if err != nil { mig.ProcessLog(logctx, mig.Log{Desc: fmt.Sprintf("failed to make compliance items: %v", err)}.Err()) } for _, item := range items { // create a new event and set values in the fields ev, err := gozdef.NewEvent() if err != nil { mig.ProcessLog(logctx, mig.Log{Desc: fmt.Sprintf("failed to make new mozdef event: %v", err)}.Err()) } ev.Category = "complianceitems" ev.Source = "mig" cverb := "fails" if item.Compliance { cverb = "passes" } ev.Summary = fmt.Sprintf("%s %s compliance with %s", item.Target, cverb, item.Check.Ref) ev.Tags = append(ev.Tags, "mig") ev.Tags = append(ev.Tags, "compliance") ev.Info() ev.Details = item err = gp.Send(ev) if err != nil { mig.ProcessLog(logctx, mig.Log{Desc: fmt.Sprintf("failed to publish to mozdef: %v", err)}.Err()) // if publication to mozdef fails, crash the worker. systemd/upstart will restart a new one panic(err) } } mig.ProcessLog(logctx, mig.Log{Desc: fmt.Sprintf("published %d items from command %.0f to mozdef", len(items), cmd.ID)}.Info()) } return }