diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index b8243fe525d..a27c2841a96 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -164,6 +164,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add system module. {pull}9546[9546] - Add `user.id` (UID) and `user.name` for ECS. {pull}10195[10195] - Add `group.id` (GID) and `group.name` for ECS. {pull}10195[10195] +- System module `process` dataset: Add user information to processes. {pull}9963[9963] *Filebeat* diff --git a/auditbeat/_meta/fields.common.yml b/auditbeat/_meta/fields.common.yml index 466805306dd..a7ce27f00d4 100644 --- a/auditbeat/_meta/fields.common.yml +++ b/auditbeat/_meta/fields.common.yml @@ -49,3 +49,38 @@ type: keyword example: s0 description: The object's SELinux level. + + - name: user + type: group + description: User information. + fields: + + - name: effective + type: group + description: Effective user information. + fields: + - name: id + type: keyword + description: Effective user ID. + - name: group + type: group + description: Effective group information. + fields: + - name: id + type: keyword + description: Effective group ID. + + - name: saved + type: group + description: Saved user information. + fields: + - name: id + type: keyword + description: Saved user ID. + - name: group + type: group + description: Saved group information. + fields: + - name: id + type: keyword + description: Saved group ID. diff --git a/auditbeat/docs/fields.asciidoc b/auditbeat/docs/fields.asciidoc index 392427f604b..0e5326065cf 100644 --- a/auditbeat/docs/fields.asciidoc +++ b/auditbeat/docs/fields.asciidoc @@ -2671,6 +2671,72 @@ The object's SELinux level. -- +[float] +== user fields + +User information. + + +[float] +== effective fields + +Effective user information. + + +*`user.effective.id`*:: ++ +-- +type: keyword + +Effective user ID. + +-- + +[float] +== group fields + +Effective group information. + + +*`user.effective.group.id`*:: ++ +-- +type: keyword + +Effective group ID. + +-- + +[float] +== saved fields + +Saved user information. + + +*`user.saved.id`*:: ++ +-- +type: keyword + +Saved user ID. + +-- + +[float] +== group fields + +Saved group information. + + +*`user.saved.group.id`*:: ++ +-- +type: keyword + +Saved group ID. + +-- + [[exported-fields-docker-processor]] == Docker fields diff --git a/auditbeat/include/fields.go b/auditbeat/include/fields.go index 37e0c9a4843..57d21664a6a 100644 --- a/auditbeat/include/fields.go +++ b/auditbeat/include/fields.go @@ -32,5 +32,5 @@ func init() { // AssetFieldsYml returns asset data. // This is the base64 encoded gzipped contents of fields.yml. func AssetFieldsYml() string { - return "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" + return "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" } diff --git a/x-pack/auditbeat/module/system/process/_meta/data.json b/x-pack/auditbeat/module/system/process/_meta/data.json index 810a310ad72..c649f77710d 100644 --- a/x-pack/auditbeat/module/system/process/_meta/data.json +++ b/x-pack/auditbeat/module/system/process/_meta/data.json @@ -5,25 +5,44 @@ "name": "host.example.com" }, "event": { - "action": "existing_process", + "action": "process_started", "dataset": "process", - "id": "5795d53b-f7c2-463c-9c04-f316ae876d51", - "module": "system", - "kind": "state" + "kind": "event", + "module": "system" }, - "message": "Process zsh (PID: 2363) is RUNNING", + "message": "Process zsh (PID: 12936) by user elastic STARTED", "process": { "args": [ - "/usr/bin/zsh" + "zsh" ], "executable": "/bin/zsh", "name": "zsh", - "pid": 2363, - "ppid": 2362, - "start": "2018-12-10T16:36:25.21Z", - "working_directory": "/home/elastic" + "pid": 12936, + "ppid": 3858, + "start": "2019-01-21T15:01:54.782288Z", + "working_directory": "/Users/elastic" }, "service": { "type": "system" + }, + "user": { + "effective": { + "group": { + "id": "1000" + }, + "id": "1000" + }, + "group": { + "id": "1000", + "name": "elastic" + }, + "id": "1000", + "name": "elastic", + "saved": { + "group": { + "id": "1000" + }, + "id": "1000" + } } } diff --git a/x-pack/auditbeat/module/system/process/process.go b/x-pack/auditbeat/module/system/process/process.go index 87db7efab0e..7effb37728e 100644 --- a/x-pack/auditbeat/module/system/process/process.go +++ b/x-pack/auditbeat/module/system/process/process.go @@ -7,7 +7,7 @@ package process import ( "fmt" "os" - "runtime" + "os/user" "strconv" "time" @@ -19,7 +19,6 @@ import ( "github.com/elastic/beats/libbeat/common" "github.com/elastic/beats/libbeat/common/cfgwarn" "github.com/elastic/beats/libbeat/logp" - "github.com/elastic/beats/libbeat/metric/system/process" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/x-pack/auditbeat/cache" "github.com/elastic/go-sysinfo" @@ -84,8 +83,11 @@ type MetricSet struct { // Process represents information about a process. type Process struct { - Info types.ProcessInfo - Error error + Info types.ProcessInfo + UserInfo *types.UserInfo + User *user.User + Group *user.Group + Error error } // Hash creates a hash for Process. @@ -273,6 +275,29 @@ func processEvent(process *Process, eventType string, action eventAction) mb.Eve }, } + if process.UserInfo != nil { + putIfNotEmpty(&event.RootFields, "user.id", process.UserInfo.UID) + putIfNotEmpty(&event.RootFields, "user.group.id", process.UserInfo.GID) + + putIfNotEmpty(&event.RootFields, "user.effective.id", process.UserInfo.EUID) + putIfNotEmpty(&event.RootFields, "user.effective.group.id", process.UserInfo.EGID) + + putIfNotEmpty(&event.RootFields, "user.saved.id", process.UserInfo.SUID) + putIfNotEmpty(&event.RootFields, "user.saved.group.id", process.UserInfo.SGID) + } + + if process.User != nil { + if process.User.Username != "" { + event.RootFields.Put("user.name", process.User.Username) + } else if process.User.Name != "" { + event.RootFields.Put("user.name", process.User.Name) + } + } + + if process.Group != nil { + event.RootFields.Put("user.group.name", process.Group.Name) + } + if process.Error != nil { event.RootFields.Put("error.message", process.Error.Error()) } @@ -280,6 +305,12 @@ func processEvent(process *Process, eventType string, action eventAction) mb.Eve return event } +func putIfNotEmpty(mapstr *common.MapStr, key string, value string) { + if value != "" { + mapstr.Put(key, value) + } +} + func processMessage(process *Process, action eventAction) string { if process.Error != nil { return fmt.Sprintf("ERROR for PID %d: %v", process.Info.PID, process.Error) @@ -295,8 +326,13 @@ func processMessage(process *Process, action eventAction) string { actionString = "is RUNNING" } - return fmt.Sprintf("Process %v (PID: %d) %v", - process.Info.Name, process.Info.PID, actionString) + var userString string + if process.User != nil { + userString = fmt.Sprintf(" by user %v", process.User.Username) + } + + return fmt.Sprintf("Process %v (PID: %d)%v %v", + process.Info.Name, process.Info.PID, userString, actionString) } func convertToCacheable(processes []*Process) []cache.Cacheable { @@ -310,82 +346,66 @@ func convertToCacheable(processes []*Process) []cache.Cacheable { } func (ms *MetricSet) getProcesses() ([]*Process, error) { - // TODO: Implement Processes() in go-sysinfo - // e.g. https://github.com/elastic/go-sysinfo/blob/master/providers/darwin/process_darwin_amd64.go#L41 - pids, err := process.Pids() + var processes []*Process + + sysinfoProcs, err := sysinfo.Processes() if err != nil { - return nil, errors.Wrap(err, "failed to fetch the list of PIDs") + return nil, errors.Wrap(err, "failed to fetch processes") } - var processes []*Process - for _, pid := range pids { + for _, sysinfoProc := range sysinfoProcs { var process *Process - sysinfoProc, err := sysinfo.Process(pid) + pInfo, err := sysinfoProc.Info() if err != nil { if os.IsNotExist(err) { - // Skip - process probably just terminated since our call - // to Pids() + // Skip - process probably just terminated since our call to Processes(). continue } - if runtime.GOOS == "windows" && (pid == 0 || os.IsPermission(err)) { - // On Windows, the call to Process() can fail if Auditbeat does not have - // the necessary access rights, while trying to open the System Process (PID: 0) - // will always fail. + if os.Geteuid() != 0 && os.IsPermission(err) { + // Running as non-root, permission issues when trying to access + // other user's private process information are expected. + + if !ms.suppressPermissionWarnings { + ms.log.Warnf("Failed to load process information for PID %d as non-root user. "+ + "Will suppress further errors of this kind. Error: %v", sysinfoProc.PID(), err) + + // Only warn once at the start of Auditbeat. + ms.suppressPermissionWarnings = true + } + continue } // Record what we can and continue process = &Process{ - Info: types.ProcessInfo{ - PID: pid, - }, - Error: errors.Wrapf(err, "failed to load process with PID %d", pid), + Info: pInfo, + Error: errors.Wrapf(err, "failed to load process information for PID %d", sysinfoProc.PID()), } + process.Info.PID = sysinfoProc.PID() // in case pInfo did not contain it } else { - pInfo, err := sysinfoProc.Info() - if err == nil { - process = &Process{ - Info: pInfo, - } - } else { - if os.IsNotExist(err) { - // Skip - process probably just terminated since our call - // to Pids() - continue - } - - if os.Geteuid() != 0 { - if os.IsPermission(err) || runtime.GOOS == "darwin" { - /* - Running as non-root, permission issues when trying to access other user's private - process information are expected. - - Unfortunately, for darwin os.IsPermission() does not - work because it is a custom error created using errors.New() in - getProcTaskAllInfo() in go-sysinfo/providers/darwin/process_darwin_amd64.go - - TODO: Fix go-sysinfo to have better error for darwin. - */ - if !ms.suppressPermissionWarnings { - ms.log.Warnf("Failed to load process information for PID %d as non-root user. "+ - "Will suppress further errors of this kind. Error: %v", pid, err) + process = &Process{ + Info: pInfo, + } + } - // Only warn once at the start of Auditbeat. - ms.suppressPermissionWarnings = true - } + userInfo, err := sysinfoProc.User() + if err != nil { + if process.Error == nil { + process.Error = errors.Wrapf(err, "failed to load user for PID %d", sysinfoProc.PID()) + } + } else { + process.UserInfo = &userInfo - //continue - } - } + goUser, err := user.LookupId(userInfo.UID) + if err == nil { + process.User = goUser + } - // Record what we can and continue - process = &Process{ - Info: pInfo, - Error: errors.Wrapf(err, "failed to load process information for PID %d", pid), - } - process.Info.PID = pid // in case pInfo did not contain it + group, err := user.LookupGroupId(userInfo.GID) + if err == nil { + process.Group = group } } diff --git a/x-pack/auditbeat/module/system/process/process_test.go b/x-pack/auditbeat/module/system/process/process_test.go index e5320a1ede9..7da050b6d45 100644 --- a/x-pack/auditbeat/module/system/process/process_test.go +++ b/x-pack/auditbeat/module/system/process/process_test.go @@ -5,10 +5,16 @@ package process import ( + "os/user" "testing" + "time" + + "github.com/stretchr/testify/assert" "github.com/elastic/beats/auditbeat/core" + "github.com/elastic/beats/libbeat/common" mbtest "github.com/elastic/beats/metricbeat/mb/testing" + "github.com/elastic/go-sysinfo/types" ) func TestData(t *testing.T) { @@ -32,3 +38,91 @@ func getConfig() map[string]interface{} { "metricsets": []string{"process"}, } } + +func TestProcessEvent(t *testing.T) { + process := Process{ + Info: types.ProcessInfo{ + Name: "zsh", + PID: 9086, + PPID: 9085, + CWD: "/home/elastic", + Exe: "/bin/zsh", + Args: []string{"zsh"}, + StartTime: time.Date(2019, 1, 1, 0, 0, 1, 0, time.UTC), + }, + UserInfo: &types.UserInfo{ + UID: "1002", + EUID: "1002", + SUID: "1002", + GID: "1002", + EGID: "1002", + SGID: "1002", + }, + User: &user.User{ + Uid: "1002", + Username: "elastic", + }, + Group: &user.Group{ + Gid: "1002", + Name: "elastic", + }, + } + eventType := eventTypeEvent + eventAction := eventActionProcessStarted + + event := processEvent(&process, eventType, eventAction) + + containsError, err := event.RootFields.HasKey("error") + if assert.NoError(t, err) { + assert.False(t, containsError) + } + + expectedRootFields := map[string]interface{}{ + "event.kind": "event", + "event.action": "process_started", + "message": "Process zsh (PID: 9086) by user elastic STARTED", + + "process.pid": 9086, + "process.ppid": 9085, + "process.name": "zsh", + "process.executable": "/bin/zsh", + "process.args": []string{"zsh"}, + "process.start": "2019-01-01 00:00:01 +0000 UTC", + + "user.id": "1002", + "user.name": "elastic", + "user.group.id": "1002", + "user.group.name": "elastic", + "user.effective.id": "1002", + "user.effective.group.id": "1002", + "user.saved.id": "1002", + "user.saved.group.id": "1002", + } + for expFieldName, expFieldValue := range expectedRootFields { + value, err := event.RootFields.GetValue(expFieldName) + if assert.NoErrorf(t, err, "error for field %v (value: %v)", expFieldName, expFieldValue) { + switch v := value.(type) { + case time.Time: + assert.Equalf(t, expFieldValue, v.String(), "Unexpected value for field %v.", expFieldName) + default: + assert.Equalf(t, expFieldValue, value, "Unexpected value for field %v.", expFieldName) + } + } + } +} + +func TestPutIfNotEmpty(t *testing.T) { + mapstr := common.MapStr{} + + putIfNotEmpty(&mapstr, "key1", "value") + value, err := mapstr.GetValue("key1") + if assert.NoError(t, err) { + assert.Equal(t, "value", value) + } + + putIfNotEmpty(&mapstr, "key2", "") + hasKey, err := mapstr.HasKey("key2") + if assert.NoError(t, err) { + assert.False(t, hasKey) + } +} diff --git a/x-pack/auditbeat/tests/system/auditbeat_xpack.py b/x-pack/auditbeat/tests/system/auditbeat_xpack.py index 76313faa494..bf3b3edf65c 100644 --- a/x-pack/auditbeat/tests/system/auditbeat_xpack.py +++ b/x-pack/auditbeat/tests/system/auditbeat_xpack.py @@ -29,7 +29,7 @@ def setUp(self): ) # Adapted from metricbeat.py - def check_metricset(self, module, metricset, fields=[], warnings_allowed=False): + def check_metricset(self, module, metricset, fields=[], errors_allowed=False, warnings_allowed=False): """ Method to test a metricset for its fields """ @@ -55,4 +55,8 @@ def check_metricset(self, module, metricset, fields=[], warnings_allowed=False): if not f in flattened: raise Exception("Field '{}' not found in event.".format(f)) + # Check for presence of top-level error object. + if not errors_allowed and "error" in evt: + raise Exception("Event contains error.") + self.assert_fields_are_documented(evt) diff --git a/x-pack/auditbeat/tests/system/test_metricsets.py b/x-pack/auditbeat/tests/system/test_metricsets.py index 0081d0f87d0..d4b5fff28ca 100644 --- a/x-pack/auditbeat/tests/system/test_metricsets.py +++ b/x-pack/auditbeat/tests/system/test_metricsets.py @@ -32,13 +32,18 @@ def test_metricset_packages(self): # Metricset is experimental and that generates a warning, TODO: remove later self.check_metricset("system", "packages", COMMON_FIELDS + fields, warnings_allowed=True) - @unittest.skipIf(sys.platform == "darwin" and os.geteuid != 0, "Requires root on macOS") def test_metricset_process(self): """ process metricset collects information about processes running on a system. """ - fields = ["process.pid"] + fields = ["process.pid", "process.ppid", "process.name", "process.executable", "process.args", + "process.start", "process.working_directory", "user.id", "user.group.id", "user.group.name"] + + # Windows does not have effective and saved IDs, and user.name is not always filled for system processes. + if sys.platform != "win32": + fields.extend(["user.effective.id", "user.saved.id", "user.effective.group.id", "user.saved.group.id", + "user.name"]) # Metricset is experimental and that generates a warning, TODO: remove later self.check_metricset("system", "process", COMMON_FIELDS + fields, warnings_allowed=True) @@ -51,8 +56,10 @@ def test_metricset_socket(self): fields = ["destination.port"] - # Metricset is experimental and that generates a warning, TODO: remove later - self.check_metricset("system", "socket", COMMON_FIELDS + fields, warnings_allowed=True) + # errors_allowed=True - The socket metricset fills the `error` field if the process enrichment fails + # (e.g. process has exited). This should not fail the test. + # warnings_allowed=True - Metricset is experimental and that generates a warning, TODO: remove later + self.check_metricset("system", "socket", COMMON_FIELDS + fields, errors_allowed=True, warnings_allowed=True) @unittest.skipUnless(sys.platform == "linux2", "Only implemented for Linux") def test_metricset_user(self):