启用审计日志记录

edit

您可以记录与安全相关的事件,例如身份验证失败和拒绝的连接,以监控您的集群是否存在可疑活动(包括数据访问授权和用户安全配置更改)。

审计日志还在发生攻击时提供了法医证据。

审计日志默认是禁用的。您必须显式启用审计日志记录。

审计日志仅在某些订阅级别可用。 有关更多信息,请参阅 https://www.elastic.co/subscriptions

要启用审计日志记录:

  1. elasticsearch.yml 中将 xpack.security.audit.enabled 设置为 true
  2. 重启 Elasticsearch。

当启用审计日志记录时,安全事件会被持久化到主机文件系统中每个集群节点上的专用_audit.json文件中。更多信息,请参阅日志文件审计输出

您可以配置其他选项来控制记录哪些事件以及在审计日志中包含哪些信息。 有关更多信息,请参阅审计设置

审计事件

edit

当您在审计安全事件时,单个客户端请求可能会在多个集群节点上生成多个审计事件。可以使用公共的request.id属性来关联相关的事件。

elasticsearch.yml 中使用 xpack.security.audit.logfile.events.include 设置来指定您希望包含在审计输出中的事件类型。

某些审计事件需要使用 security_config_change 事件类型来审计相关的事件操作。受影响的审计事件描述中会指明是否需要该事件类型。

access_denied

当经过身份验证的用户尝试执行他们没有必要权限的操作时记录。

示例
{"type":"audit", "timestamp":"2020-12-30T22:30:06,949+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"transport", "event.action":
"access_denied", "authentication.type":"REALM", "user.name":"user1",
"user.realm":"default_native", "user.roles":["test_role"], "origin.type":
"rest", "origin.address":"[::1]:52434", "request.id":"yKOgWn2CRQCKYgZRz3phJw",
"action":"indices:admin/auto_create", "request.name":"CreateIndexRequest",
"indices":[""]}
access_granted

当经过身份验证的用户尝试执行他们具有必要权限的操作时记录。这些事件仅针对非系统用户记录。

如果您想为所有用户(包括内部用户,如_xpack)包含access_granted事件,请在事件类型列表中添加system_access_granted,除了access_granted。默认情况下不包含system_access_granted权限,以避免日志混乱。

示例
{"type":"audit", "timestamp":"2020-12-30T22:30:06,947+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"transport", "event.action":
"access_granted", "authentication.type":"REALM", "user.name":"user1", "user
realm":"default_native", "user.roles":["test_role"], "origin.type":"rest",
"origin.address":"[::1]:52434", "request.id":"yKOgWn2CRQCKYgZRz3phJw",
"action":"indices:data/write/bulk", "request.name":"BulkRequest"}
anonymous_access_denied

当请求因缺少身份验证凭据而被拒绝时记录。

示例
{"type":"audit", "timestamp":"2020-12-30T21:56:43,608+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"rest", "event.action":
"anonymous_access_denied", "origin.type":"rest", "origin.address":
"[::1]:50543", "url.path":"/twitter/_async_search", "url.query":"pretty",
"request.method":"POST", "request.id":"TqA9OisyQ8WTl1ivJUV1AA"}
authentication_failed

当身份验证凭据无法匹配到已知用户时记录。

示例
{"type":"audit", "timestamp":"2020-12-30T22:10:15,510+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"rest", "event.action":
"authentication_failed", "user.name":"elastic", "origin.type":"rest",
"origin.address":"[::1]:51504", "url.path":"/_security/user/user1",
"url.query":"pretty", "request.method":"POST",
"request.id":"POv8p_qeTl2tb5xoFl0HIg"}
authentication_success

用户成功认证时记录。

示例
{"type":"audit", "timestamp":"2020-12-30T22:03:35,018+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"rest", "event.action":
"authentication_success", "authentication.type":"REALM", "user.name":
"elastic", "user.realm":"reserved", "origin.type":"rest", "origin.address":
"[::1]:51014", "realm":"reserved", "url.path":"/twitter/_search",
"url.query":"pretty", "request.method":"POST",
"request.id":"nHV3UMOoSiu-TaSPWCfxGg"}
change_disable_user

当调用启用用户API来禁用本地用户或内置用户时记录。

您必须包含 security_config_change 事件类型以审计相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-30T23:17:28,308+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change", "event.
action":"change_disable_user", "request.id":"qvLIgw_eTvyK3cgV-GaLVg",
"change":{"disable":{"user":{"name":"user1"}}}}
change_enable_user

当调用启用用户API来启用本地用户或内置用户时记录。

您必须包含 security_config_change 事件类型以审计相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-30T23:17:34,843+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change", "event.
action":"change_enable_user", "request.id":"BO3QU3qeTb-Ei0G0rUOalQ",
"change":{"enable":{"user":{"name":"user1"}}}}
change_password

当调用更改密码 API来更改本地或内置用户的密码时记录。

您必须包含 security_config_change 事件类型以审核相关的事件操作。

示例
{"type":"audit", "timestamp":"2019-12-30T22:19:41,345+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change", "event.
action":"change_password", "request.id":"bz5a1Cc3RrebDMitMGGNCw",
"change":{"password":{"user":{"name":"user1"}}}}
create_service_token

当调用创建服务账户令牌API来为服务账户创建一个新的基于索引的令牌时记录。

您必须包含 security_config_change 事件类型以审核相关的事件操作。

示例
{"type":"audit", "timestamp":"2021-04-30T23:17:42,952+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change", "event.
action":"create_service_token", "request.id":"az9a1Db5QrebDMacQ8yGKc",
"create":{"service_token":{"namespace":"elastic","service":"fleet-server","name":"token1"}}}`
connection_denied

当传入的TCP连接未通过特定配置文件的 IP过滤器时记录。

示例
{"type":"audit", "timestamp":"2020-12-30T21:47:31,526+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"ip_filter", "event.action":
"connection_denied", "origin.type":"rest", "origin.address":"10.10.0.20:52314",
"transport.profile":".http", "rule":"deny 10.10.0.0/16"}
connection_granted

当传入的TCP连接通过特定配置文件的IP过滤器时记录。

示例
{"type":"audit", "timestamp":"2020-12-30T21:47:31,526+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"ip_filter", "event.action":
"connection_granted", "origin.type":"rest", "origin.address":"[::1]:52314",
"transport.profile":".http", "rule":"allow ::1,127.0.0.1"}
create_apikey

当调用创建 API 密钥授予 API 密钥 API 来创建新的 API 密钥时记录。

您必须包含 security_config_change 事件类型以审核相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-31T00:33:52,521+0200", "node.id":
"9clhpgjJRR-iKzOw20xBNQ", "event.type":"security_config_change", "event.action":
"create_apikey", "request.id":"9FteCmovTzWHVI-9Gpa_vQ", "create":{"apikey":
{"name":"test-api-key-1","expiration":"10d","role_descriptors":[{"cluster":
["monitor","manage_ilm"],"indices":[{"names":["index-a*"],"privileges":
["read","maintenance"]},{"names":["in*","alias*"],"privileges":["read"],
"field_security":{"grant":["field1*","@timestamp"],"except":["field11"]}}],
"applications":[],"run_as":[]},{"cluster":["all"],"indices":[{"names":
["index-b*"],"privileges":["all"]}],"applications":[],"run_as":[]}],
"metadata":{"application":"my-application","environment":{"level": 1,
"tags":["dev","staging"]}}}}}
change_apikey

当调用更新 API 密钥 API 来更新现有 API 密钥的属性时记录。

您必须包含 security_config_change 事件类型以审核相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-31T00:33:52,521+0200", "node.id":
"9clhpgjJRR-iKzOw20xBNQ", "event.type":"security_config_change", "event.action":
"change_apikey", "request.id":"9FteCmovTzWHVI-9Gpa_vQ", "change":{"apikey":
{"id":"zcwN3YEBBmnjw-K-hW5_","role_descriptors":[{"cluster":
["monitor","manage_ilm"],"indices":[{"names":["index-a*"],"privileges":
["read","maintenance"]},{"names":["in*","alias*"],"privileges":["read"],
"field_security":{"grant":["field1*","@timestamp"],"except":["field11"]}}],
"applications":[],"run_as":[]},{"cluster":["all"],"indices":[{"names":
["index-b*"],"privileges":["all"]}],"applications":[],"run_as":[]}],
"metadata":{"application":"my-application","environment":{"level": 1,
"tags":["dev","staging"]}},"expiration":"10d"}}}
change_apikeys

当调用批量更新 API 密钥 API 来更新多个现有 API 密钥的属性时记录。

您必须包含 security_config_change 事件类型以审核相关的事件操作。

示例
{"type":"audit","timestamp":"2020-12-31T00:33:52,521+0200","node.id":
"9clhpgjJRR-iKzOw20xBNQ","event.type":"security_config_change",
"event.action":"change_apikeys","request.id":"9FteCmovTzWHVI-9Gpa_vQ",
"change":{"apikeys":
{"ids":["zcwN3YEBBmnjw-K-hW5_","j7c0WYIBqecB5CbVR6Oq"],"role_descriptors":
[{"cluster":["monitor","manage_ilm"],"indices":[{"names":["index-a*"],"privileges":
["read","maintenance"]},{"names":["in*","alias*"],"privileges":["read"],
"field_security":{"grant":["field1*","@timestamp"],"except":["field11"]}}],
"applications":[],"run_as":[]},{"cluster":["all"],"indices":[{"names":
["index-b*"],"privileges":["all"]}],"applications":[],"run_as":[]}],
"metadata":{"application":"my-application","environment":{"level":1,
"tags":["dev","staging"]}},"expiration":"10d"}}}
delete_privileges

当调用 删除应用程序权限 API 以删除一个或多个应用程序权限时记录。

您必须包含 security_config_change 事件类型以审核相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-31T00:39:30,246+0200", "node.id":
"9clhpgjJRR-iKzOw20xBNQ", "event.type":"security_config_change", "event.
action":"delete_privileges", "request.id":"7wRWVxxqTzCKEspeSP7J8g",
"delete":{"privileges":{"application":"myapp","privileges":["read"]}}}
delete_role

当调用删除角色 API来删除角色时记录。

您必须包含 security_config_change 事件类型以审核相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-31T00:08:11,678+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change", "event.action":
"delete_role", "request.id":"155IKq3zQdWq-12dgKZRnw",
"delete":{"role":{"name":"my_admin_role"}}}
delete_role_mapping

当调用删除角色映射API 以删除角色映射时记录。

您必须包含 security_config_change 事件类型以审核相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-31T00:12:09,349+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change", "event.
action":"delete_role_mapping", "request.id":"Stim-DuoSTCWom0S_xhf8g",
"delete":{"role_mapping":{"name":"mapping1"}}}
delete_service_token

当调用删除服务账户令牌API来删除服务账户的基于索引的令牌时记录。

您必须包含 security_config_change 事件类型以审核相关的事件操作。

示例
{"type":"audit", "timestamp":"2021-04-30T23:17:42,952+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change", "event.
action":"delete_service_token", "request.id":"az9a1Db5QrebDMacQ8yGKc",
"delete":{"service_token":{"namespace":"elastic","service":"fleet-server","name":"token1"}}}
delete_user

当调用删除用户 API来删除特定本地用户时记录。

您必须包含 security_config_change 事件类型以审核相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-30T22:19:41,345+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change",
"event.action":"delete_user", "request.id":"au5a1Cc3RrebDMitMGGNCw",
"delete":{"user":{"name":"jacknich"}}}
invalidate_apikeys

当调用失效 API 密钥 API来失效一个或多个 API 密钥时记录。

您必须包含 security_config_change 事件类型以审计相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-31T00:36:30,247+0200", "node.id":
"9clhpgjJRR-iKzOw20xBNQ", "event.type":"security_config_change", "event.
action":"invalidate_apikeys", "request.id":"7lyIQU9QTFqSrTxD0CqnTQ",
"invalidate":{"apikeys":{"owned_by_authenticated_user":false,
"user":{"name":"myuser","realm":"native1"}}}}
put_privileges

当调用创建或更新权限 API 以添加或更新一个或多个应用程序权限时记录。

您必须包含 security_config_change 事件类型以审计相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-31T00:39:07,779+0200", "node.id":
"9clhpgjJRR-iKzOw20xBNQ", "event.type":"security_config_change",
"event.action":"put_privileges", "request.id":"1X2VVtNgRYO7FmE0nR_BGA",
"put":{"privileges":[{"application":"myapp","name":"read","actions":
["data:read/*","action:login"],"metadata":{"description":"Read access to myapp"}}]}}
put_role

当调用创建或更新角色 API来创建或更新角色时记录。

您必须包含 security_config_change 事件类型以审计相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-30T22:27:01,978+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change",
"event.action":"put_role", "request.id":"tDYQhv5CRMWM4Sc5Zkk2cQ",
"put":{"role":{"name":"test_role","role_descriptor":{"cluster":["all"],
"indices":[{"names":["apm*"],"privileges":["all"],"field_security":
{"grant":["granted"]},"query":"{\"term\": {\"service.name\": \"bar\"}}"},
{"names":["apm-all*"],"privileges":["all"],"query":"{\"term\":
{\"service.name\": \"bar2\"}}"}],"applications":[],"run_as":[]}}}}
put_role_mapping

当调用创建或更新角色映射 API来创建或更新角色映射时记录。

您必须包含 security_config_change 事件类型以审计相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-31T00:11:13,932+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change", "event.
action":"put_role_mapping", "request.id":"kg4h1l_kTDegnLC-0A-XxA",
"put":{"role_mapping":{"name":"mapping1","roles":["user"],"rules":
{"field":{"username":"*"}},"enabled":true,"metadata":{"version":1}}}}
put_user

当调用创建或更新用户 API来创建或更新本地用户时记录。请注意,用户更新也可能更改用户的密码。

您必须包含 security_config_change 事件类型以审计相关的事件操作。

示例
{"type":"audit", "timestamp":"2020-12-30T22:10:09,749+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"security_config_change",
"event.action":"put_user", "request.id":"VIiSvhp4Riim_tpkQCVSQA",
"put":{"user":{"name":"user1","enabled":false,"roles":["admin","other_role1"],
"full_name":"Jack Sparrow","email":"jack@blackpearl.com",
"has_password":true,"metadata":{"cunning":10}}}}
realm_authentication_failed

每个未能提供有效身份验证令牌的领域都会记录此日志。

示例
{"type":"audit", "timestamp":"2020-12-30T22:10:15,510+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"rest", "event.action":
"realm_authentication_failed", "user.name":"elastic", "origin.type":"rest",
"origin.address":"[::1]:51504", "realm":"myTestRealm1", "url.path":
"/_security/user/user1", "url.query":"pretty", "request.method":"POST",
"request.id":"POv8p_qeTl2tb5xoFl0HIg"}
run_as_denied

当经过身份验证的用户尝试 另一个用户身份运行,而他们没有必要的 权限来执行此操作时,会记录此事件。

示例
{"type":"audit", "timestamp":"2020-12-30T22:49:34,859+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"transport", "event.action":
"run_as_denied", "user.name":"user1", "user.run_as.name":"user1",
"user.realm":"default_native", "user.run_as.realm":"default_native",
"user.roles":["test_role"], "origin.type":"rest", "origin.address":
"[::1]:52662", "request.id":"RcaSt872RG-R_WJBEGfYXA",
"action":"indices:data/read/search", "request.name":"SearchRequest", "indices":["alias1"]}
run_as_granted

当经过身份验证的用户尝试 另一个用户身份运行时记录,前提是他们具有这样做的必要权限。

示例
{"type":"audit", "timestamp":"2020-12-30T22:44:42,068+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type":"transport", "event.action":
"run_as_granted", "user.name":"elastic", "user.run_as.name":"user1",
"user.realm":"reserved", "user.run_as.realm":"default_native",
"user.roles":["superuser"], "origin.type":"rest", "origin.address":
"[::1]:52623", "request.id":"dGqPTdEQSX2TAPS3cvc1qA", "action":
"indices:data/read/search", "request.name":"SearchRequest", "indices":["alias1"]}
system_access_granted

仅记录access_granted事件, 针对内部用户,例如_xpack。如果你包含此设置 以及access_granted,那么access_granted事件将 记录给所有用户。

此事件类型默认情况下被禁用,以避免日志过于杂乱。

tampered_request

当安全功能检测到请求已被篡改时记录。通常与search/scroll请求相关,当滚动ID被认为已被篡改时。

示例
{"type":"audit", "timestamp":"2019-11-27T22:00:00,947+0200", "node.id":
"0RMNyghkQYCc_gVd1G6tZQ", "event.type": "rest", "event.action":
"tampered_request", "origin.address":"[::1]:50543", "url.path":
"/twitter/_async_search", "url.query":"pretty", "request.method":"POST",
"request.id":"TqA9OisyQ8WTl1ivJUV1AA"}

审计事件属性

edit

审计事件以JSON文档格式记录,每个事件在审计日志中单独打印在一行。这些条目本身不包含行尾分隔符。更多详情,请参阅日志条目格式

以下列表显示了所有审计事件类型共有的属性:

@timestamp
事件发生的时间,采用ISO9601格式。
node.name
节点的名称。这可以在 elasticsearch.yml 配置文件中更改。
node.id
节点ID。这是自动生成的,并且在整个集群重新启动后仍然保持不变。
host.ip
节点的绑定IP地址,通过该地址可以与节点进行通信。
host.name
未解析节点的主机名。
event.type
生成事件的内部处理层: resttransportip_filtersecurity_config_change。 这与 origin.type 不同,因为源自 REST API 的请求被转换为多个传输消息,生成带有 origin.type: restevent.type: transport 的审计事件。
event.action

发生的事件类型:anonymous_access_deniedauthentication_failedauthentication_successrealm_authentication_failedaccess_deniedaccess_grantedconnection_deniedconnection_grantedtampered_requestrun_as_deniedrun_as_granted

此外,如果 event.type 等于 security_config_changeevent.action 属性将取以下值之一: put_userchange_passwordput_roleput_role_mappingchange_enable_userchange_disable_userput_privilegescreate_apikeydelete_userdelete_roledelete_role_mappinginvalidate_apikeysdelete_privilegeschange_apikeychange_apikeys

request.id
一个可以用于关联与特定REST请求相关事件的综合标识符。

此外,所有类型为 resttransportip_filter 的事件(但不包括 security_config_change)都具有以下额外属性,这些属性显示了有关请求客户端的更多详细信息:

origin.address
与该事件关联的请求的源IP地址。这可能是远程客户端的地址、另一个集群节点的地址,或者是本地节点绑定的地址(如果请求源自本地)。除非远程客户端直接连接到集群,否则客户端地址实际上将是集群前第一个OSI第3层代理的地址。
origin.type
与该事件关联的请求的来源类型: rest(请求源自REST API请求), transport(请求通过传输通道接收), 或 local_node(本地节点发出的请求)。
opaque_id
与该事件关联的请求的 X-Opaque-Id HTTP 头(如果存在)的值。 了解更多:X-Opaque-Id HTTP 头 - API 约定
trace_id
从与该事件关联的请求的 traceparent HTTP 头中提取的标识符(如果存在)。 它允许将审计日志显示到 Elastic APM 的 Trace Logs 功能中。
x_forwarded_for
与审计事件关联的请求的X-Forwarded-For HTTP请求头的逐字值(如果存在)。此头通常由代理在转发请求时添加,其值为代理客户端的地址。当请求穿越多个代理时,该头是一个逗号分隔的列表,最后一个值是倒数第二个代理服务器的地址(最后一个代理服务器的地址由origin.address字段指定)。

rest 事件类型的审计事件属性

edit

事件中event.type等于rest的具有以下event.action属性值之一:authentication_successanonymous_access_deniedauthentication_failedrealm_authentication_failedtampered_requestrun_as_denied。这些事件还具有以下额外属性(除了常见的属性外):

url.path
REST请求的URL路径部分(位于端口和查询字符串之间)与该事件相关联。 这是URL编码的。
url.query
与该事件关联的REST请求的URL查询部分(如果有“?”,则在“?”之后)。这是URL编码的。
request.method
与该事件关联的REST请求的HTTP方法。它是GET、POST、PUT、DELETE、OPTIONS、HEAD、PATCH、TRACE和CONNECT之一。
request.body
与该事件相关的REST请求的完整内容(如果已启用)。这包含HTTP请求体。 请求体根据JSON RFC 4627作为字符串值进行转义。

审计事件属性,属于transport事件类型

edit

事件中event.type等于transport的具有以下event.action属性值之一:authentication_successanonymous_access_deniedauthentication_failedrealm_authentication_failedaccess_grantedaccess_deniedrun_as_grantedrun_as_deniedtampered_request。这些事件还具有以下额外属性(除了常见的属性外):

action
执行的传输操作的名称。 这类似于REST请求的URL。
indices
与该事件相关的请求所涉及的索引名称数组(在适用的情况下)。
request.name
执行的请求处理程序的名称。

审计事件属性 of the ip_filter 事件类型

edit

事件的 event.type 等于 ip_filter 时,其 event.action 属性值为以下之一:connection_grantedconnection_denied。 这些事件还具有以下额外属性(除了常见的属性外):

transport_profile
请求所针对的传输配置文件。
rule
拒绝请求的IP过滤规则。

审计security_config_change事件类型的属性

edit

具有 event.type 属性等于 security_config_change 的事件具有以下 event.action 属性值之一:put_userchange_passwordput_roleput_role_mappingchange_enable_userchange_disable_userput_privilegescreate_apikeydelete_userdelete_roledelete_role_mappinginvalidate_apikeysdelete_privilegeschange_apikeychange_apikeys

这些事件还具有以下额外属性之一(除了常见的属性外),这些属性特定于event.type属性。属性的值是一个嵌套的JSON对象:

put
正在创建的安全配置的对象表示,或现有配置的覆盖。 它包含用于用户角色角色映射或应用程序权限的配置。
delete
正在删除的安全配置的对象表示。它可以是针对用户角色角色映射或应用程序权限的配置。
change
正在更改的安全配置的对象表示。它可以是本机或内置用户的密码启用禁用配置对象。如果更新了API密钥,配置对象将是apikey
create
正在创建的新安全配置的对象表示。目前仅用于API密钥审计。如果API密钥是使用 创建API密钥API创建的,它仅包含一个apikey配置对象。如果API密钥是使用 授予API密钥API创建的,它还包含一个grant配置对象。
invalidate
正在失效的安全配置的对象表示。 目前唯一支持失效的配置是apikeys,通过 失效API密钥API

上述安全配置对象的模式如下。它们与相应安全API的请求体非常相似。

user

一个类似的对象:

`{"name": , "enabled": , "roles": ,
"full_name": , "email": , "has_password": ,
"metadata": }`.

如果为空,则省略full_nameemailmetadata字段。

role

一个类似的对象:

`{"name": , "role_descriptor": {"cluster": , "global":
{"application":{"manage":{:}}}, "indices": [                             {"names": , "privileges": , "field_security":
{"grant": , "except": }, "query": ,
"allow_restricted_indices": }], "applications":[{"application": ,
"privileges": , "resources": }], "run_as": ,
"metadata": }}`.

如果为空,则省略 globalfield_securityexceptqueryallow_restricted_indicesmetadata 字段。

role_mapping

一个类似的对象:

`{"name": , "roles": , "role_templates": [{"template": ,
"format": }], "rules": , "enabled": , "metadata": }`.

如果为空,则省略rolesrole_templates字段。 rules对象具有递归嵌套的架构,与传递给角色映射的API请求中的内容相同。

privileges

一个对象数组,例如:

`{"application": , "name": , "actions": ,
"metadata": }`.
password

一个简单的对象,例如:

`{"user":{"name": }}`
enable

一个简单的对象,例如:

`{"user":{"name": }}`
disable

一个简单的对象,例如:

`{"user":{"name": }}`
apikey

一个像这样的对象:

`{"id": , "name": , "expiration": , "role_descriptors": [],
"metadata": []}`

The role_descriptors 对象与上述 role 配置对象中的 role_descriptor 对象具有相同的模式。

API 密钥更新的对象将有所不同,因为它不会包含 name

grant

一个类似的对象:

`{"type": , "user": {"name": , "has_password": },
"has_access_token": }`
apikeys

一个类似的对象:

`{"ids": , "name": , "owned_by_authenticated_user":
, "user":{"name": , "realm": }}`

对于批量API密钥更新的对象将有所不同,因为它不会包含nameowned_by_authenticated_useruser。相反,它可能包含metadatarole_descriptors,这些字段与上述apikey配置对象中的字段具有相同的模式。

service_token

一个类似的对象:

`{"namespace":,"service":,"name":}`

特定事件的额外审计事件属性

edit

除了之前描述的那些事件外,还有一些事件具有一些额外的属性:

  • 认证成功:

    realm
    成功认证用户的安全域的名称。如果使用API密钥进行认证,这是特殊值 _es_api_key。这是一个简写属性,用于描述由user.realmuser.run_by.realmauthentication.type属性描述的相同信息。
    user.name
    有效用户的名称。这通常与认证用户相同,但如果使用 run as授权功能 这表示被模拟用户的名称。如果使用API密钥进行认证,这是API密钥所有者的名称。 如果使用服务账户令牌进行认证,这是服务账户主体,即namespace/service_name
    user.realm
    有效用户所属的安全域的名称。如果使用API密钥进行认证,这是API密钥所有者所属的安全域的名称。
    user.run_by.name
    仅当请求使用run as授权功能时,此属性存在, 并表示认证用户的名称,也称为模拟者
    user.run_by.realm
    认证模拟者)用户所属的安全域的名称。 仅当请求使用run as授权功能时,此属性提供。
    authentication.type
    用于认证用户的方法。 可能的值为REALMAPI_KEYTOKENANONYMOUSINTERNAL
    apikey.id
    创建API密钥请求返回的API密钥ID。 此属性仅在通过API密钥进行认证时提供。
    apikey.name
    创建API密钥请求中提供的API密钥名称。 此属性仅在通过API密钥进行认证时提供。
    authentication.token.name
    服务账户令牌的名称。 此属性仅在通过服务账户令牌进行认证时提供。
    authentication.token.type
    服务账户令牌的类型。 此属性仅在通过服务账户令牌进行认证时提供。
  • 认证失败:

    user.name
    认证失败的用户名称。 如果请求认证令牌无效或无法解析,此信息可能缺失。
    authentication.token.name
    服务账户令牌的名称。 此属性仅在通过服务账户令牌进行认证时提供。 如果请求认证令牌无效或无法解析,此信息可能缺失。
    authentication.token.type
    服务账户令牌的类型。 此属性仅在通过服务账户令牌进行认证时提供。 如果请求认证令牌无效或无法解析,此信息可能缺失。
  • realm_authentication_failed:

    user.name
    认证失败的用户名称。
    realm
    拒绝此认证的安全域的名称。 此事件为链中每个被咨询的安全域生成。
  • run_as_deniedrun_as_granted:

    user.roles
    认证用户的角色名称数组,该用户被授予或拒绝模拟操作。 如果作为服务账户进行认证, 这始终是一个空数组。
    user.name
    被授予或拒绝模拟操作的认证用户的名称。
    user.realm
    认证用户所属的安全域的名称。
    user.run_as.name
    模拟操作被授予或拒绝的用户的名称。
    user.run_as.realm
    被模拟用户所属的安全域的名称。
  • access_grantedaccess_denied:

    user.roles
    用户的角色名称数组。如果使用API密钥进行认证,这包含API密钥所有者的角色名称。 如果作为服务账户进行认证, 这始终是一个空数组。
    user.name
    有效用户的名称。这通常与认证用户相同,但如果使用 run as授权功能 这表示被模拟用户的名称。如果使用API密钥进行认证,这是API密钥所有者的名称。
    user.realm
    有效用户所属的安全域的名称。如果使用API密钥进行认证,这是API密钥所有者所属的安全域的名称。
    user.run_by.name
    仅当请求使用run as授权功能时,此属性存在, 并表示认证用户的名称,也称为模拟者
    user.run_by.realm
    仅当请求使用run as授权功能时,此属性存在, 并表示认证模拟者)用户所属的安全域的名称。
    authentication.type
    用于认证用户的方法。 可能的值为REALMAPI_KEYTOKENANONYMOUSINTERNAL
    apikey.id
    创建API密钥请求返回的API密钥ID。 此属性仅在通过API密钥进行认证时提供。
    apikey.name
    创建API密钥请求中提供的API密钥名称。 此属性仅在通过API密钥进行认证时提供。
    authentication.token.name
    服务账户令牌的名称。 此属性仅在通过服务账户令牌进行认证时提供。
    authentication.token.type
    服务账户令牌的类型。 此属性仅在通过服务账户令牌进行认证时提供。

日志文件审计输出

edit

审计输出中,logfile 是唯一的输出方式。它将数据写入日志目录中的 _audit.json 文件。

如果你覆盖了log4j2.properties并且没有为任何审计跟踪指定附加器,审计事件将被转发到根附加器,根附加器默认指向elasticsearch.log文件。

日志条目格式

edit

审计事件以JSON文档格式记录,每个事件在_audit.json文件中单独打印一行。这些条目本身不包含行尾分隔符。 审计事件的JSON格式有些特殊,因为大多数字段遵循点分隔的名称语法,是有序的,并且包含非空字符串值。这种格式创建了一个结构化的列式方面,类似于CSV,可以更容易地进行视觉检查(与等效的嵌套JSON文档相比)。

然而,有少数属性是上述格式的例外。putdeletechangecreateinvalidate 属性仅在具有 event.type: "security_config_change" 属性的事件中存在,包含安全更改生效的嵌套JSON表示。因此,安全配置更改的内容不会作为审计事件文档中的顶级点命名字段显示。这是因为这些字段特定于特定类型的安全更改,并且不会出现在任何其他审计事件中。因此,列式格式的优势非常有限;在这种情况下,嵌套结构的空间节省优势是更受青睐的权衡。

request.body 属性存在时(参见 审计搜索查询),它包含一个字符串值,该值包含完整的HTTP请求体,按照JSON RFC 4677进行转义。

这里有一份审计事件类型的列表,指定了每个条目类型的字段集以及示例。

日志文件输出设置

edit

可以通过在 elasticsearch.yml 文件中的设置来控制记录的事件和其他信息。请参阅 审计事件设置本地节点信息设置

请注意,当在审计事件中包含请求体时,敏感数据可能会以明文形式被审计,尽管所有安全API(如更改用户密码的API)在审计时都会过滤掉凭证信息。

您还可以在位于 ES_PATH_CONFlog4j2.properties 文件中配置日志文件的写入方式(或查看 源代码中的 log4j2.properties 的相关部分)。默认情况下,审计信息会附加到位于标准 Elasticsearch logs 目录中的 _audit.json 文件中(通常位于 $ES_HOME/logs)。该文件还会在每天或达到 1GB 文件大小限制时进行轮换和归档。

日志文件审计事件忽略策略

edit

综合审计跟踪是确保问责制所必需的。它在事件响应期间提供了巨大的价值,甚至可能需要用于证明合规性。

审计系统的缺点表现为不可避免的性能损失。 事实上,审计日志消耗了I/O操作,这些操作不再可用于用户的查询。 有时,审计日志的冗长可能会成为一个问题,即使通过includeexclude定义的事件类型限制也无法缓解。

审计事件忽略策略是一种更精细的方式来调整审计日志的详细程度。 这些策略定义了匹配审计事件的规则,这些事件将被忽略(即:不打印)。 规则匹配审计事件属性的值,并补充includeexclude方法。 想象一下审计事件的语料库和策略,它们会切断不需要的事件。 除了一个例外,所有审计事件都受忽略策略的约束。 例外的是类型为security_config_change的事件,除非完全排除,否则不能被过滤掉。

在使用审计事件忽略策略时,您需要认识到可能存在的责任漏洞,这些漏洞可能导致非法行为无法被检测到。请在系统架构发生变化时,花时间审查这些策略。

策略是一组命名的过滤规则。每个过滤规则适用于单个事件属性,即 usersrealmsactionsrolesindices 属性之一。过滤规则定义了一个 Lucene 正则表达式 列表,其中任何一个都必须与审计事件属性的值匹配,规则才能匹配。 如果构成策略的 所有 规则都与事件匹配,则策略匹配该事件。 因此,如果审计事件匹配 任何 策略,则该事件将被忽略,不会打印。所有其他不匹配的事件将照常打印。

所有策略都在 xpack.security.audit.logfile.events.ignore_filters 设置命名空间下定义。例如,以下名为 example1 的策略匹配来自 kibana_systemadmin_user 主体的事件,这些事件操作于通配符形式为 app-logs* 的索引:

xpack.security.audit.logfile.events.ignore_filters:
  example1:
    users: ["kibana_system", "admin_user"]
    indices: ["app-logs*"]

kibana_system用户生成的审计事件并操作多个索引,其中一些索引与索引通配符不匹配,将不会匹配。 正如预期的那样,由所有其他用户生成的操作(即使仅在匹配索引过滤器的索引上操作)也不会匹配此策略。

不同类型的审计事件可能具有不同的属性。 如果某个事件不包含某些策略定义过滤器的属性,则该事件将不会匹配该策略。 例如,以下策略将永远不会匹配authentication_successauthentication_failed事件,无论用户的角色如何,因为这些事件模式不包含role属性:

xpack.security.audit.logfile.events.ignore_filters:
  example2:
    roles: ["admin", "ops_admin_*"]

同样,任何具有多个角色且其中一些角色不符合正则表达式的用户事件,将不会匹配此策略。

为了完整性,尽管实际使用场景应该很少,但可以使用空字符串("")或空列表([])来匹配事件中缺失的属性。例如,以下策略将匹配没有indices属性的事件(如anonymous_access_deniedauthentication_success和其他类型)以及下一个索引上的事件。

xpack.security.audit.logfile.events.ignore_filters:
  example3:
    indices: ["next", ""]

审计搜索查询

edit

没有专门用于搜索查询的审计事件类型。搜索查询会被分析然后处理;处理过程会触发授权操作,这些操作会被审计。然而,原始的原始查询,即客户端提交的查询,在授权审计发生时是不可访问的。

搜索查询包含在HTTP请求体中,然而,某些由REST层在协调节点上生成的审计事件可以切换为将请求体输出到审计日志中。因此,必须审计请求体以审计搜索查询。

要使某些审计事件包含请求体,请在 elasticsearch.yml 文件中编辑以下设置:

xpack.security.audit.logfile.events.emit_request_body: true

在审计时不会进行过滤,因此当审计事件包含请求体时,敏感数据可能会以明文形式被审计。此外,请求体可能包含恶意内容,这些内容可能会破坏消费审计日志的解析器。

请求体以转义的JSON字符串值(RFC 4627)打印到request.body事件属性中。

并非所有事件都包含 request.body 属性,即使上述设置已启用。包含该属性的事件有:authentication_successauthentication_failedrealm_authentication_failedtampered_requestrun_as_deniedanonymous_access_deniedrequest.body 属性仅在协调节点上打印(处理 REST 请求的节点)。大多数这些事件类型默认不包含

一个实用的建议是,将 authentication_success 添加到被审计的事件类型中(将其添加到 xpack.security.audit.logfile.events.include 列表中),因为默认情况下不会审计此事件类型。

通常,包含列表中还包含其他事件类型,例如 access_grantedaccess_denied