diff --git a/.env.example b/.env.example index 527a988a..5e5970de 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -OSCTRL_VERSION=0.3.6 +OSCTRL_VERSION=0.3.7 OSQUERY_VERSION=5.12.1 NGINX_VERSION=1.21.6-alpine POSTGRES_VERSION=13.5-alpine @@ -7,6 +7,7 @@ POSTGRES_DB_USERNAME=osctrl POSTGRES_DB_PASSWORD=osctrl REDIS_VERSION=6.2.6-alpine3.15 JWT_SECRET=0000000000000000000000000000000000000000000000000000000000000000 +SESSION_KEY=sessionkey OSCTRL_USER=admin OSCTRL_PASS=Changeme123! GOLANG_VERSION=1.21.3 diff --git a/CHANGELOG.md b/CHANGELOG.md index e715ba39..8508771f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # osctrl Changelog -## 🔖 Release [0.3.6](https://github.com/jmpsec/osctrl/releases/tag/v0.3.6) +## 🔖 Release [0.3.7](https://github.com/jmpsec/osctrl/releases/tag/v0.3.7) ### 🚨 Breaking Changes diff --git a/admin/handlers/go.mod b/admin/handlers/go.mod index 1c78465d..a85d7619 100644 --- a/admin/handlers/go.mod +++ b/admin/handlers/go.mod @@ -34,30 +34,30 @@ replace github.com/jmpsec/osctrl/version => ../../version require ( github.com/gorilla/mux v1.8.1 - github.com/jmpsec/osctrl/admin/sessions v0.3.6 - github.com/jmpsec/osctrl/carves v0.3.6 - github.com/jmpsec/osctrl/environments v0.0.0-20240704175315-b3e7d3dd0a86 - github.com/jmpsec/osctrl/metrics v0.0.0-20240704175315-b3e7d3dd0a86 - github.com/jmpsec/osctrl/nodes v0.3.6 - github.com/jmpsec/osctrl/queries v0.3.6 - github.com/jmpsec/osctrl/settings v0.3.6 - github.com/jmpsec/osctrl/tags v0.0.0-20240704175315-b3e7d3dd0a86 - github.com/jmpsec/osctrl/types v0.3.6 - github.com/jmpsec/osctrl/users v0.3.6 - github.com/jmpsec/osctrl/utils v0.3.6 + github.com/jmpsec/osctrl/admin/sessions v0.3.7 + github.com/jmpsec/osctrl/carves v0.3.7 + github.com/jmpsec/osctrl/environments v0.0.0-20240710135334-c020425d8ffe + github.com/jmpsec/osctrl/metrics v0.0.0-20240710135334-c020425d8ffe + github.com/jmpsec/osctrl/nodes v0.3.7 + github.com/jmpsec/osctrl/queries v0.3.7 + github.com/jmpsec/osctrl/settings v0.3.7 + github.com/jmpsec/osctrl/tags v0.0.0-20240710135334-c020425d8ffe + github.com/jmpsec/osctrl/types v0.3.7 + github.com/jmpsec/osctrl/users v0.3.7 + github.com/jmpsec/osctrl/utils v0.3.7 ) require ( - github.com/jmpsec/osctrl/cache v0.0.0-20240704175315-b3e7d3dd0a86 + github.com/jmpsec/osctrl/cache v0.0.0-20240710135334-c020425d8ffe gorm.io/gorm v1.25.10 ) require ( - github.com/aws/aws-sdk-go v1.54.14 // indirect + github.com/aws/aws-sdk-go v1.54.17 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect - github.com/jmpsec/osctrl/backend v0.3.6 // indirect + github.com/jmpsec/osctrl/backend v0.3.7 github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/rs/zerolog v1.33.0 // indirect @@ -98,8 +98,8 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/jmpsec/osctrl/logging v0.0.0-20240704175315-b3e7d3dd0a86 - github.com/jmpsec/osctrl/version v0.3.6 // indirect + github.com/jmpsec/osctrl/logging v0.0.0-20240710135334-c020425d8ffe + github.com/jmpsec/osctrl/version v0.3.7 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect @@ -113,8 +113,8 @@ require ( github.com/spf13/viper v1.19.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.24.0 // indirect - golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect + golang.org/x/crypto v0.25.0 // indirect + golang.org/x/exp v0.0.0-20240707233637-46b078467d37 // indirect golang.org/x/sys v0.22.0 // indirect golang.org/x/text v0.16.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect diff --git a/admin/handlers/go.sum b/admin/handlers/go.sum index e482c43d..b2f71b6a 100644 --- a/admin/handlers/go.sum +++ b/admin/handlers/go.sum @@ -4,6 +4,8 @@ github.com/aws/aws-sdk-go v1.51.16 h1:vnWKK8KjbftEkuPX8bRj3WHsLy1uhotn0eXptpvrxJ github.com/aws/aws-sdk-go v1.51.16/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go v1.54.14 h1:llJ60MzLzovyDE/rEDbUjS1cICh7krk1PwQwNlKRoeQ= github.com/aws/aws-sdk-go v1.54.14/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go v1.54.17 h1:ZV/qwcCIhMHgsJ6iXXPVYI0s1MdLT+5LW28ClzCUPeI= +github.com/aws/aws-sdk-go v1.54.17/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.26.0 h1:/Ce4OCiM3EkpW7Y+xUnfAFpchU78K7/Ug01sZni9PgA= github.com/aws/aws-sdk-go-v2 v1.26.0/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= @@ -251,12 +253,16 @@ golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 h1:985EYyeCOxTpcgOTJpflJUwOeEz0CQOdPt73OzpE9F8= golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +golang.org/x/exp v0.0.0-20240707233637-46b078467d37 h1:uLDX+AfeFCct3a2C7uIWBKMJIR3CJMhcgfrUAqjRK6w= +golang.org/x/exp v0.0.0-20240707233637-46b078467d37/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= diff --git a/admin/handlers/handlers.go b/admin/handlers/handlers.go index 001bef8e..ce460b6d 100644 --- a/admin/handlers/handlers.go +++ b/admin/handlers/handlers.go @@ -4,6 +4,7 @@ import ( "log" "github.com/jmpsec/osctrl/admin/sessions" + "github.com/jmpsec/osctrl/backend" "github.com/jmpsec/osctrl/cache" "github.com/jmpsec/osctrl/carves" "github.com/jmpsec/osctrl/environments" @@ -172,10 +173,20 @@ func WithAdminConfig(config *types.JSONConfigurationAdmin) HandlersOption { } } -func WithDBLogger(dbfile string) HandlersOption { +func WithDBLogger(dbfile string, config *backend.JSONConfigurationDB) HandlersOption { return func(h *HandlersAdmin) { if dbfile == "" { - h.DBLogger = nil + if config == nil { + h.DBLogger = nil + return + } + logger, err := logging.CreateLoggerDBConfig(*config) + if err != nil { + log.Printf("error creating DB logger %v", err) + logger.Enabled = false + logger.Database = nil + } + h.DBLogger = logger return } logger, err := logging.CreateLoggerDBFile(dbfile) diff --git a/admin/handlers/json-logs.go b/admin/handlers/json-logs.go index c1a93ca7..6090c5fb 100644 --- a/admin/handlers/json-logs.go +++ b/admin/handlers/json-logs.go @@ -108,18 +108,28 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request) } // Extract parameter for seconds // If parameter is not present or invalid, it defaults to 6 hours back - secondsBack := int64(utils.SixHours) - seconds, ok := r.URL.Query()["seconds"] + // secondsBack := int64(utils.SixHours) + // seconds, ok := r.URL.Query()["seconds"] + // if ok { + // s, err := strconv.ParseInt(seconds[0], 10, 64) + // if err == nil { + // secondsBack = s + // } + // } + // Extract parameter for limit + // If parameter is not present or invalid, it defaults to 100 items + limitItems := int(100) + limit, ok := r.URL.Query()["limit"] if ok { - s, err := strconv.ParseInt(seconds[0], 10, 64) + l, err := strconv.ParseInt(limit[0], 10, 32) if err == nil { - secondsBack = s + limitItems = int(l) } } // Get logs logJSON := []LogJSON{} if logType == types.StatusLog && h.AdminConfig.Logger == settings.LoggingDB { - statusLogs, err := h.DBLogger.StatusLogs(UUID, env.Name, secondsBack) + statusLogs, err := h.DBLogger.StatusLogsLimit(UUID, env.Name, int(limitItems)) if err != nil { log.Printf("error getting logs %v", err) h.Inc(metricJSONErr) @@ -138,8 +148,8 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request) } logJSON = append(logJSON, _l) } - } else if logType == types.ResultLog && h.RedisCache != nil { - resultLogs, err := h.RedisCache.ResultLogs(UUID, env.Name, secondsBack) + } else if logType == types.ResultLog && h.AdminConfig.Logger == settings.LoggingDB { + resultLogs, err := h.DBLogger.ResultLogsLimit(UUID, env.Name, int(limitItems)) if err != nil { log.Printf("error getting logs %v", err) h.Inc(metricJSONErr) @@ -149,8 +159,8 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request) for _, r := range resultLogs { _l := LogJSON{ Created: CreationTimes{ - Display: utils.PastFutureTimesEpoch(int64(r.UnixTime)), - Timestamp: strconv.Itoa(int(r.UnixTime)), + Display: utils.PastFutureTimes(r.CreatedAt), + Timestamp: strconv.Itoa(int(r.CreatedAt.Unix())), }, First: r.Name, Second: string(r.Columns), diff --git a/admin/main.go b/admin/main.go index 211873fc..7571e5f1 100644 --- a/admin/main.go +++ b/admin/main.go @@ -154,6 +154,7 @@ var ( osqueryTablesFile string osqueryTablesVersion string loggerFile string + loggerDbSame bool staticFilesFolder string staticOffline bool carvedFilesFolder string @@ -522,6 +523,13 @@ func init() { EnvVars: []string{"LOGGER_FILE"}, Destination: &loggerFile, }, + &cli.BoolFlag{ + Name: "logger-db-same", + Value: false, + Usage: "Use the same DB configuration for the logger", + EnvVars: []string{"LOGGER_DB_SAME"}, + Destination: &loggerDbSame, + }, &cli.StringFlag{ Name: "static", Aliases: []string{"s"}, @@ -728,9 +736,13 @@ func osctrlAdminService() { } }() - // Set the logger configuration file to empty if we are logging to anything but the DB - if adminConfig.Logger != settings.LoggingDB { - loggerFile = "" + var loggerDBConfig *backend.JSONConfigurationDB + loggerFile = "" + // Set the logger configuration file if we have a DB logger + if adminConfig.Logger == settings.LoggingDB { + if loggerDbSame { + loggerDBConfig = &dbConfig + } } // Initialize Admin handlers before router @@ -753,7 +765,7 @@ func osctrlAdminService() { handlers.WithOsqueryTables(osqueryTables), handlers.WithCarvesFolder(carvedFilesFolder), handlers.WithAdminConfig(&adminConfig), - handlers.WithDBLogger(loggerFile), + handlers.WithDBLogger(loggerFile, loggerDBConfig), ) // ////////////////////////// ADMIN diff --git a/admin/sessions/go.mod b/admin/sessions/go.mod index 839a5a55..8f06a7a0 100644 --- a/admin/sessions/go.mod +++ b/admin/sessions/go.mod @@ -21,14 +21,14 @@ replace github.com/jmpsec/osctrl/version => ../../version require ( github.com/gorilla/securecookie v1.1.2 github.com/gorilla/sessions v1.3.0 - github.com/jmpsec/osctrl/nodes v0.3.6 // indirect - github.com/jmpsec/osctrl/queries v0.3.6 // indirect - github.com/jmpsec/osctrl/types v0.3.6 // indirect - github.com/jmpsec/osctrl/users v0.3.6 + github.com/jmpsec/osctrl/nodes v0.3.7 // indirect + github.com/jmpsec/osctrl/queries v0.3.7 // indirect + github.com/jmpsec/osctrl/types v0.3.7 // indirect + github.com/jmpsec/osctrl/users v0.3.7 ) require ( - github.com/jmpsec/osctrl/utils v0.0.0-20240704175315-b3e7d3dd0a86 + github.com/jmpsec/osctrl/utils v0.0.0-20240710135334-c020425d8ffe gorm.io/gorm v1.25.10 ) @@ -37,9 +37,9 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/jmpsec/osctrl/environments v0.0.0-20240704175315-b3e7d3dd0a86 // indirect - github.com/jmpsec/osctrl/settings v0.3.6 // indirect - github.com/jmpsec/osctrl/version v0.3.6 // indirect + github.com/jmpsec/osctrl/environments v0.0.0-20240710135334-c020425d8ffe // indirect + github.com/jmpsec/osctrl/settings v0.3.7 // indirect + github.com/jmpsec/osctrl/version v0.3.7 // indirect github.com/segmentio/ksuid v1.0.4 // indirect - golang.org/x/crypto v0.24.0 // indirect + golang.org/x/crypto v0.25.0 // indirect ) diff --git a/admin/sessions/go.sum b/admin/sessions/go.sum index 8825b8c7..093ace36 100644 --- a/admin/sessions/go.sum +++ b/admin/sessions/go.sum @@ -39,6 +39,8 @@ golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc= diff --git a/admin/templates/node.html b/admin/templates/node.html index e19bd712..28c5fb8b 100644 --- a/admin/templates/node.html +++ b/admin/templates/node.html @@ -371,7 +371,8 @@