用户字段用法和示例

编辑

此页面涵盖以下主题。

分类
编辑

用户字段可以存在于任何类型的事件中,而不会影响事件的分类。

但是,当事件与 IAM(身份和帐户管理)相关时,应按以下方式进行分类。在本节中,我们将具体介绍与 IAM 活动相关的 event.categoryevent.type。请务必阅读 分类部分 以查看所有允许的值,并详细了解 event.kindevent.outcome

IAM 活动有点特殊,因为事件预计会被分配 2 个事件类型。其中一个指示活动类型(创建、删除、更改等),另一个指示用户或组是否为管理活动的受影响对象。

为了专注于事件的分类,下面示例中的许多部分都被省略了。

创建组“test-group”

{
  "event": {
    "kind": "event",
    "category": ["iam"], 
    "type": ["group", "creation"], 
    "outcome": "success"
  },
  "group": { "name": "test-group", ... },
  "user": { ... },
  "related": { "user": [ ... ] }
}

类别“iam”

与组创建相关的两种事件类型

将“test-user”添加到“test-group”

{
  "event": {
    "kind": "event",
    "category": ["iam"], 
    "type": ["user", "change"], 
    "action": "user added to group", 
    "outcome": "success"
  },
  "user": {
    ...
    "target": { 
      "name": "test-user",
      "group": { "name": "test-group" }
    }
  },
  "related": { "user": [ ... ] }
}

类别“iam”

与用户修改相关的两种事件类型

event.action 不是分类字段,也没有强制值。它可以根据源事件详细信息或管道填充,以确保事件捕获正在发生的所有细微差别。

如何使用所有可能的用户字段将在下面详细介绍。

用户标识符
编辑

不同的系统使用不同的值作为用户标识符。以下是一些帮助规范化一些简单案例的提示。

  • 当系统为用户名提供复合值(例如 DOMAINNAME\username)时,请在 user.domain 中捕获域名,并在 user.name 中捕获用户名(不含域名)。
  • 当系统使用电子邮件地址作为主要标识符时,请使用它填充 user.iduser.email
字段重用
编辑

用户字段可以在 ECS 的许多地方重复使用(或出现)。这使得能够捕获与单个事件相关的许多用户。

以下是用户字段可以出现的所有位置的完整列表

  • user.*
  • user.effective.*
  • user.target.*
  • user.changes.*
  • source.user.*
  • destination.user.*
  • client.user.*
  • server.user.*

让我们了解一下每个字段的含义。

下面的示例仅在各种 user 嵌套中填充 user.name,有时还会填充 user.id,以提高可读性。但是,在实现中,除非另有说明,否则每个位置中可以合理填充的所有 user 字段都应填充。

事件根部的用户字段
编辑

事件根部的用户字段用于捕获执行事件所描述的主要操作的用户。当事件中存在多个用户时,这一点尤其重要。事件根部的 user.* 字段表示执行操作的用户。

在许多情况下,仅提及一个用户的事件应填充事件根部的用户字段,即使该用户不是执行操作的用户。

如果填充了特定用途的用户字段(例如 url.username),则还应使用相同的用户名填充 user.name

{
  "url": { "username": "alice" }, 
  "user": { "name": "alice" }, 
  "related": { "user": ["alice"] }
}

特定用途的用户名字段

将用户名复制到 user.name 以将 user.name 作为可靠的基线。

远程登录
编辑

当用户跨越主机边界时,用户将在 source.userdestination.user 中捕获。

此功能适用的数据源示例

  • 通过 ssh、Kerberos 进行远程登录
  • 观察网络流量的防火墙

为了与 ECS 将 user 作为事件根部执行操作的用户的设计保持一致,所有 source.user 字段都应复制到事件根部的 user

以下是一个用户“alice”以用户“deus”的身份登录到另一台主机的示例

{
  "user": {
    "name": "alice"
  },
  "source": {
    "user": {
      "name": "alice"
    },
    "ip": "10.42.42.42"
  },
  "destination": {
    "user": {
      "name": "deus"
    },
    "ip": "10.42.42.43"
  },
  "related": { "user": ["alice", "deus"] }
}

每当事件源除了 sourcedestination 之外还填充 clientserver 字段时,也应相应地复制用户字段。您可以查看 映射网络事件 以了解有关映射网络事件的更多信息。

权限更改
编辑

当存在权限提升或降级并且可以确定请求/执行提升的用户时,user.effective 字段相关。

使用事件根部的 user 字段捕获请求权限更改的用户,并使用 user.effective 捕获请求的权限级别,无论权限更改是否成功。

以下是此功能适用的示例

  • 用户更改主机上的身份。

    • 示例:sudo、su、以其他用户身份运行。
  • 以不同用户身份运行程序。示例

    • 受信任的用户通过 Posix setuid/setgid 等机制以 root 身份运行特定的管理员命令。
    • 具有管理员权限的服务管理器出于安全目的以受限用户身份启动子进程(例如,root 以用户“apache”身份运行 Apache HTTPD)

如果事件源仅提供有关有效用户的信息,而没有提供谁请求不同权限的信息,则应使用事件根部的 user 字段,而不是 user.effective

以下是用户“alice”通过 sudo 以 root 身份运行命令的示例

{
  "user": {
    "name": "alice",
    "id": "1001",
    "effective": {
      "name": "root",
      "id": "1"
    }
  },
  "related": { "user": ["alice", "root"] }
}

如果无法(或禁止)确定哪个用户请求不同权限级别,则可以在事件根部捕获有效用户。通常,权限更改事件已经发生,例如:bob“su”为 root;后续事件将显示 root 用户执行操作。

身份和访问管理
编辑

每当用户执行影响其他用户的操作时(通常在 IAM 场景中),受操作影响的用户将在 user.target 中捕获。执行 IAM 活动的用户在事件根部捕获。

IAM 活动的示例包括

  • user-a 创建或删除 user-b
  • user-a 修改 user-b

在创建/删除场景中,要么没有先前状态(用户创建),要么没有后状态(用户删除)。在这些情况下,只需填充事件根部的 useruser.target

“root”创建用户“bob”的示例

{
  "user": {
    "name": "root",
    "id": "1",
    "target": {
      "name": "bob",
      "id": "1002",
      ...
    }
  }
  "related": { "user": ["bob", "root"] }
}

当现有用户的状态发生变化时,必须使用 user.target 捕获用户的先前状态,并且 user.changes 应仅列出执行的更改。

“root”将用户“bob”重命名为“bob.barker”的示例

{
  "user": {
    "name": "root",
    "id": "1",
    "target": {
      "name": "bob",
      "id": "1002"
    },
    "changes": {
      "name": "bob.barker"
    }
  },
  "related": { "user": ["bob", "bob.barker", "root"] }
}

您会在上面的示例中注意到,未修改的属性(如用户 ID)不会在 user.changes.* 下重复,因为它们没有更改。

组合 IAM 和权限更改
编辑

我们上面介绍了如何同时使用 user.targetuser.changes。如果相同的 IAM 事件中也存在权限提升,则当然也应使用 user.effective

这是上面 IAM 部分中的“重命名”示例。在以下示例中,我们知道“alice”正在提升权限到“root”,以便修改用户“bob”

{
  "user": {
    "name": "alice",
    "id": "1001",
    "effective": {
      "name": "root",
      "id": "1"
    },
    "target": {
      "name": "bob",
      "id": "1002"
    },
    "changes": {
      "name": "bob.barker"
    }
  },
  "related": { "user": ["alice", "bob", "bob.barker", "root"] }
}
字段重用的细微差别
编辑

ECS 中大多数字段重用案例是在不同的字段集中重用字段集。以下两个示例说明了这一点

  • user 中重用 group,从而产生 user.group.* 字段,或者
  • destination 中重用 user,从而产生 destination.user.* 字段,其中还包括 destination.user.group.*

user 字段也可以在 user 内以不同的名称重复使用,表示每个相关用户的角色。例如,user.target.*user.effective.* 字段。

但是,需要注意的是,在 user 内重复使用的 user 字段 *不会被传递到其他任何地方*。让我们说明各种有效和无效的排列。

字段 有效性 备注

user.group.*

有效

正常重用。

destination.user.group.*

有效

user 在其他地方重用时,group 重用会被传递。仅在与事件相关时填充。

user.target.group.*user.effective.group.*user.changes.group.*

有效

即使 user 在自身内部重用,group 重用也会被传递。仅在与事件相关时填充。

destination.user.target.*destination.user.effective.*destination.user.changes.*

无效

user 内重复使用的 user 字段不会被传递到其他任何地方。相同的规则适用于在 sourceclientserver 下重用 user 的情况。

通过 related.user 进行枢纽分析
编辑

在本页的所有事件中,我们都填充了 related.user 字段。

任何包含用户的事件都应始终使用所有在事件中看到的用户名填充数组字段 related.user;包括出现在自定义字段中的事件名称。请注意,此字段不是所有用户字段的嵌套,它是一个平面数组,旨在包含用户标识符。

再以 user.changes 中的示例为例,我们可以看到,无论每个用户的角色是什么(权限提升前/后、受影响的用户、重命名后的用户名),它们都存在于 related.user

{
  "user": {
    "name": "alice",
    "id": "1001",
    "effective": {
      "name": "root",
      "id": "1"
    },
    "target": {
      "name": "bob",
      "id": "1002"
    },
    "changes": {
      "name": "bob.barker"
    }
  },
  "related": { "user": ["alice", "root", "bob", "bob.barker"] }
}

related 字段集中的其他字段一样,related.user 旨在促进枢纽分析。例如,如果您怀疑用户“bob.barker”,则在 related.user 中搜索此名称将为您提供与该用户相关的所有事件,无论它是用户的创建/重命名,还是该用户在系统中处于活动状态的事件。

映射示例
编辑

有关从各种来源映射事件的示例,您可以查看 RFC 0007 中的源数据部分