@@ -2,6 +2,8 @@ package main
22
33import (
44 "context"
5+ "crypto/tls"
6+ "crypto/x509"
57 "encoding/json"
68 "errors"
79 "fmt"
@@ -297,6 +299,14 @@ func init() {
297299 rootCmd .Flags ().String ("auditing-timescaledb-password" , "" , "password for the auditing service" )
298300 rootCmd .Flags ().String ("auditing-timescaledb-retention" , "" , "the time until audit traces are cleaned up" )
299301
302+ rootCmd .Flags ().String ("auditing-splunk-endpoint" , "" , "endpoint of splunk" )
303+ rootCmd .Flags ().String ("auditing-splunk-hec-token" , "" , "hec token for splunk" )
304+ rootCmd .Flags ().String ("auditing-splunk-source" , "" , "the source used for splunk" )
305+ rootCmd .Flags ().String ("auditing-splunk-source-type" , "" , "the source type used for splunk" )
306+ rootCmd .Flags ().String ("auditing-splunk-index" , "" , "the splunk index" )
307+ rootCmd .Flags ().String ("auditing-splunk-host" , "" , "the splunk host" )
308+ rootCmd .Flags ().String ("auditing-splunk-ca" , "" , "path to a splunk ca" )
309+
300310 rootCmd .Flags ().String ("headscale-addr" , "" , "address of headscale server" )
301311 rootCmd .Flags ().String ("headscale-cp-addr" , "" , "address of headscale control plane" )
302312 rootCmd .Flags ().String ("headscale-api-key" , "" , "initial api key to connect to headscale server" )
@@ -953,6 +963,60 @@ func createAuditingClient(log *slog.Logger) (searchBackend auditing.Auditing, ba
953963 }
954964 }
955965
966+ if viper .IsSet ("auditing-splunk-endpoint" ) {
967+ host := viper .GetString ("auditing-splunk-host" )
968+ if host == "" {
969+ host , err = os .Hostname ()
970+ if err != nil {
971+ return nil , nil , err
972+ }
973+ }
974+
975+ source := moduleName
976+ if viper .GetString ("auditing-splunk-source" ) != "" {
977+ source = viper .GetString ("auditing-splunk-source" )
978+ }
979+
980+ splunkConfig := auditing.SplunkConfig {
981+ Endpoint : viper .GetString ("auditing-splunk-endpoint" ),
982+ HECToken : viper .GetString ("auditing-splunk-hec-token" ),
983+ SourceType : viper .GetString ("auditing-splunk-source-type" ),
984+ Index : viper .GetString ("auditing-splunk-index" ),
985+ Host : host ,
986+ }
987+ if viper .GetString ("auditing-splunk-ca" ) != "" {
988+ caCert , err := os .ReadFile (viper .GetString ("auditing-splunk-ca" ))
989+ if err != nil {
990+ return nil , nil , fmt .Errorf ("unable to read ca cert: %w" , err )
991+ }
992+
993+ caCertPool := x509 .NewCertPool ()
994+ caCertPool .AppendCertsFromPEM (caCert )
995+ splunkConfig .TlsConfig = & tls.Config {
996+ RootCAs : caCertPool ,
997+ MinVersion : tls .VersionTLS12 ,
998+ }
999+ }
1000+
1001+ splunkBackend , err := auditing .NewSplunk (auditing.Config {
1002+ Component : source ,
1003+ Log : log ,
1004+ }, splunkConfig )
1005+ if err != nil {
1006+ return nil , nil , err
1007+ }
1008+
1009+ asyncSplunkBackend , err := auditing .NewAsync (splunkBackend , log , auditing.AsyncConfig {
1010+ AsyncRetry : 3 ,
1011+ AsyncBackoff : pointer .Pointer (1 * time .Second ),
1012+ })
1013+ if err != nil {
1014+ return nil , nil , err
1015+ }
1016+
1017+ backends = append (backends , asyncSplunkBackend )
1018+ }
1019+
9561020 if searchBackend == nil {
9571021 searchBackend = pointer .FirstOrZero (backends )
9581022 }
0 commit comments