启用审计日志
edit启用审计日志记录
edit您可以记录与安全相关的事件,例如身份验证失败和拒绝的连接,以监控您的集群是否存在可疑活动(包括数据访问授权和用户安全配置更改)。
审计日志还在发生攻击时提供了法医证据。
审计日志默认是禁用的。您必须显式启用审计日志记录。
审计日志仅在某些订阅级别可用。 有关更多信息,请参阅 https://www.elastic.co/subscriptions。
要启用审计日志记录:
-
在
elasticsearch.yml中将xpack.security.audit.enabled设置为true。 - 重启 Elasticsearch。
当启用审计日志记录时,安全事件会被持久化到主机文件系统中每个集群节点上的专用文件中。更多信息,请参阅日志文件审计输出。
您可以配置其他选项来控制记录哪些事件以及在审计日志中包含哪些信息。 有关更多信息,请参阅审计设置。
审计事件
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 -
生成事件的内部处理层:
rest、transport、ip_filter或security_config_change。 这与origin.type不同,因为源自 REST API 的请求被转换为多个传输消息,生成带有origin.type: rest和event.type: transport的审计事件。 -
event.action -
发生的事件类型:
anonymous_access_denied、authentication_failed、authentication_success、realm_authentication_failed、access_denied、access_granted、connection_denied、connection_granted、tampered_request、run_as_denied或run_as_granted。此外,如果
event.type等于security_config_change,event.action属性将取以下值之一:put_user、change_password、put_role、put_role_mapping、change_enable_user、change_disable_user、put_privileges、create_apikey、delete_user、delete_role、delete_role_mapping、invalidate_apikeys、delete_privileges、change_apikey或change_apikeys。 -
request.id - 一个可以用于关联与特定REST请求相关事件的综合标识符。
此外,所有类型为 rest、transport 和 ip_filter 的事件(但不包括 security_config_change)都具有以下额外属性,这些属性显示了有关请求客户端的更多详细信息:
-
origin.address - 与该事件关联的请求的源IP地址。这可能是远程客户端的地址、另一个集群节点的地址,或者是本地节点绑定的地址(如果请求源自本地)。除非远程客户端直接连接到集群,否则客户端地址实际上将是集群前第一个OSI第3层代理的地址。
-
origin.type -
与该事件关联的请求的来源类型:
rest(请求源自REST API请求),transport(请求通过传输通道接收), 或local_node(本地节点发出的请求)。 -
opaque_id -
与该事件关联的请求的
X-Opaque-IdHTTP 头(如果存在)的值。 了解更多:X-Opaque-IdHTTP 头 - API 约定 -
trace_id -
从与该事件关联的请求的
traceparentHTTP 头中提取的标识符(如果存在)。 它允许将审计日志显示到 Elastic APM 的 Trace Logs 功能中。 -
x_forwarded_for -
与审计事件关联的请求的
X-Forwarded-ForHTTP请求头的逐字值(如果存在)。此头通常由代理在转发请求时添加,其值为代理客户端的地址。当请求穿越多个代理时,该头是一个逗号分隔的列表,最后一个值是倒数第二个代理服务器的地址(最后一个代理服务器的地址由origin.address字段指定)。
rest 事件类型的审计事件属性
edit事件中event.type等于rest的具有以下event.action属性值之一:authentication_success、anonymous_access_denied、authentication_failed、realm_authentication_failed、tampered_request或run_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_success、anonymous_access_denied、authentication_failed、realm_authentication_failed、access_granted、access_denied、run_as_granted、run_as_denied或tampered_request。这些事件还具有以下额外属性(除了常见的属性外):
-
action - 执行的传输操作的名称。 这类似于REST请求的URL。
-
indices - 与该事件相关的请求所涉及的索引名称数组(在适用的情况下)。
-
request.name - 执行的请求处理程序的名称。
审计事件属性 of the ip_filter 事件类型
edit事件的 event.type 等于 ip_filter 时,其 event.action 属性值为以下之一:connection_granted 或 connection_denied。
这些事件还具有以下额外属性(除了常见的属性外):
-
transport_profile - 请求所针对的传输配置文件。
-
rule - 拒绝请求的IP过滤规则。
审计security_config_change事件类型的属性
edit具有 event.type 属性等于 security_config_change 的事件具有以下
event.action 属性值之一:put_user、change_password、put_role、put_role_mapping、
change_enable_user、change_disable_user、put_privileges、create_apikey、delete_user、
delete_role、delete_role_mapping、invalidate_apikeys、delete_privileges、change_apikey
或 change_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_name、email和metadata字段。 -
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": 如果为空,则省略
global、field_security、except、query、allow_restricted_indices和metadata字段。 -
role_mapping -
一个类似的对象:
`{"name":, "roles": , "role_templates": [{"template": , "format": }], "rules": 如果为空,则省略
roles和role_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密钥更新的对象将有所不同,因为它不会包含
name、owned_by_authenticated_user或user。相反,它可能包含metadata和role_descriptors,这些字段与上述apikey配置对象中的字段具有相同的模式。 -
service_token -
一个类似的对象:
`{"namespace":,"service": ,"name": }`
特定事件的额外审计事件属性
edit除了之前描述的那些事件外,还有一些事件具有一些额外的属性:
-
认证成功:-
realm -
成功认证用户的安全域的名称。如果使用API密钥进行认证,这是特殊值
_es_api_key。这是一个简写属性,用于描述由user.realm、user.run_by.realm和authentication.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 -
用于认证用户的方法。
可能的值为
REALM、API_KEY、TOKEN、ANONYMOUS或INTERNAL。 -
apikey.id - 由创建API密钥请求返回的API密钥ID。 此属性仅在通过API密钥进行认证时提供。
-
apikey.name - 在创建API密钥请求中提供的API密钥名称。 此属性仅在通过API密钥进行认证时提供。
-
authentication.token.name - 服务账户令牌的名称。 此属性仅在通过服务账户令牌进行认证时提供。
-
authentication.token.type - 服务账户令牌的类型。 此属性仅在通过服务账户令牌进行认证时提供。
-
-
认证失败: -
realm_authentication_failed:-
user.name - 认证失败的用户名称。
-
realm - 拒绝此认证的安全域的名称。 此事件为链中每个被咨询的安全域生成。
-
-
run_as_denied和run_as_granted:-
user.roles - 认证用户的角色名称数组,该用户被授予或拒绝模拟操作。 如果作为服务账户进行认证, 这始终是一个空数组。
-
user.name - 被授予或拒绝模拟操作的认证用户的名称。
-
user.realm - 认证用户所属的安全域的名称。
-
user.run_as.name - 模拟操作被授予或拒绝的用户的名称。
-
user.run_as.realm - 被模拟用户所属的安全域的名称。
-
-
access_granted和access_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 -
用于认证用户的方法。
可能的值为
REALM、API_KEY、TOKEN、ANONYMOUS或INTERNAL。 -
apikey.id - 由创建API密钥请求返回的API密钥ID。 此属性仅在通过API密钥进行认证时提供。
-
apikey.name - 在创建API密钥请求中提供的API密钥名称。 此属性仅在通过API密钥进行认证时提供。
-
authentication.token.name - 服务账户令牌的名称。 此属性仅在通过服务账户令牌进行认证时提供。
-
authentication.token.type - 服务账户令牌的类型。 此属性仅在通过服务账户令牌进行认证时提供。
-
日志文件审计输出
edit审计输出中,logfile 是唯一的输出方式。它将数据写入日志目录中的 文件。
如果你覆盖了log4j2.properties并且没有为任何审计跟踪指定附加器,审计事件将被转发到根附加器,根附加器默认指向elasticsearch.log文件。
日志条目格式
edit审计事件以JSON文档格式记录,每个事件在文件中单独打印一行。这些条目本身不包含行尾分隔符。
审计事件的JSON格式有些特殊,因为大多数字段遵循点分隔的名称语法,是有序的,并且包含非空字符串值。这种格式创建了一个结构化的列式方面,类似于CSV,可以更容易地进行视觉检查(与等效的嵌套JSON文档相比)。
然而,有少数属性是上述格式的例外。put、delete、change、create 和 invalidate 属性仅在具有 event.type: "security_config_change" 属性的事件中存在,包含安全更改生效的嵌套JSON表示。因此,安全配置更改的内容不会作为审计事件文档中的顶级点命名字段显示。这是因为这些字段特定于特定类型的安全更改,并且不会出现在任何其他审计事件中。因此,列式格式的优势非常有限;在这种情况下,嵌套结构的空间节省优势是更受青睐的权衡。
当 request.body 属性存在时(参见 审计搜索查询),它包含一个字符串值,该值包含完整的HTTP请求体,按照JSON RFC 4677进行转义。
这里有一份审计事件类型的列表,指定了每个条目类型的字段集以及示例。
日志文件输出设置
edit可以通过在 elasticsearch.yml 文件中的设置来控制记录的事件和其他信息。请参阅
审计事件设置 和
本地节点信息设置。
请注意,当在审计事件中包含请求体时,敏感数据可能会以明文形式被审计,尽管所有安全API(如更改用户密码的API)在审计时都会过滤掉凭证信息。
您还可以在位于 ES_PATH_CONF 的 log4j2.properties 文件中配置日志文件的写入方式(或查看 源代码中的 log4j2.properties 的相关部分)。默认情况下,审计信息会附加到位于标准 Elasticsearch logs 目录中的 文件中(通常位于 $ES_HOME/logs)。该文件还会在每天或达到 1GB 文件大小限制时进行轮换和归档。
日志文件审计事件忽略策略
edit综合审计跟踪是确保问责制所必需的。它在事件响应期间提供了巨大的价值,甚至可能需要用于证明合规性。
审计系统的缺点表现为不可避免的性能损失。
事实上,审计日志消耗了I/O操作,这些操作不再可用于用户的查询。
有时,审计日志的冗长可能会成为一个问题,即使通过由include和exclude定义的事件类型限制也无法缓解。
审计事件忽略策略是一种更精细的方式来调整审计日志的详细程度。
这些策略定义了匹配审计事件的规则,这些事件将被忽略(即:不打印)。
规则匹配审计事件属性的值,并补充include或exclude方法。
想象一下审计事件的语料库和策略,它们会切断不需要的事件。
除了一个例外,所有审计事件都受忽略策略的约束。
例外的是类型为security_config_change的事件,除非完全排除,否则不能被过滤掉。
在使用审计事件忽略策略时,您需要认识到可能存在的责任漏洞,这些漏洞可能导致非法行为无法被检测到。请在系统架构发生变化时,花时间审查这些策略。
策略是一组命名的过滤规则。每个过滤规则适用于单个事件属性,即 users、realms、actions、roles 或 indices 属性之一。过滤规则定义了一个 Lucene 正则表达式 列表,其中任何一个都必须与审计事件属性的值匹配,规则才能匹配。
如果构成策略的 所有 规则都与事件匹配,则策略匹配该事件。
因此,如果审计事件匹配 任何 策略,则该事件将被忽略,不会打印。所有其他不匹配的事件将照常打印。
所有策略都在 xpack.security.audit.logfile.events.ignore_filters 设置命名空间下定义。例如,以下名为 example1 的策略匹配来自 kibana_system 或 admin_user 主体的事件,这些事件操作于通配符形式为 app-logs* 的索引:
xpack.security.audit.logfile.events.ignore_filters:
example1:
users: ["kibana_system", "admin_user"]
indices: ["app-logs*"]
由kibana_system用户生成的审计事件并操作多个索引,其中一些索引与索引通配符不匹配,将不会匹配。 正如预期的那样,由所有其他用户生成的操作(即使仅在匹配索引过滤器的索引上操作)也不会匹配此策略。
不同类型的审计事件可能具有不同的属性。
如果某个事件不包含某些策略定义过滤器的属性,则该事件将不会匹配该策略。
例如,以下策略将永远不会匹配authentication_success或
authentication_failed事件,无论用户的角色如何,因为这些事件模式不包含role属性:
xpack.security.audit.logfile.events.ignore_filters:
example2:
roles: ["admin", "ops_admin_*"]
同样,任何具有多个角色且其中一些角色不符合正则表达式的用户事件,将不会匹配此策略。
为了完整性,尽管实际使用场景应该很少,但可以使用空字符串("")或空列表([])来匹配事件中缺失的属性。例如,以下策略将匹配没有indices属性的事件(如anonymous_access_denied、authentication_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_success、authentication_failed、realm_authentication_failed、tampered_request、run_as_denied 和 anonymous_access_denied。request.body 属性仅在协调节点上打印(处理 REST 请求的节点)。大多数这些事件类型默认不包含。
一个实用的建议是,将 authentication_success 添加到被审计的事件类型中(将其添加到 xpack.security.audit.logfile.events.include 列表中),因为默认情况下不会审计此事件类型。
通常,包含列表中还包含其他事件类型,例如
access_granted 或 access_denied。