Skip to content

Commit 97a4746

Browse files
authored
Provide splunk audit configuration. (#641)
1 parent a260813 commit 97a4746

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

cmd/metal-api/main.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package main
22

33
import (
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

Comments
 (0)