mcpField
E
elasticsearch-audit

elasticsearch-audit

github.com/elastic安全6022.9k 次安装今天更新
代码仓库

关于 elasticsearch-audit

elasticsearch-audit 是面向 Elasticsearch 管理员与安全团队的审计日志配置技能,可通过集群设置控制事件、输出和过滤,并查询审计记录以支持合规与事件调查。

主要功能

  1. 01启用或关闭审计日志
  2. 02选择记录的安全事件
  3. 03按用户、角色或索引过滤
  4. 04配置日志文件与索引输出
  5. 05查询失败登录及拒绝访问记录

适用场景

  1. 01配置合规审计事件
  2. 02调查未授权访问或权限提升
  3. 03识别暴力登录尝试
  4. 04减少繁忙集群中的日志噪声

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/elastic/agent-skills --skill elasticsearch-audit

安装后在 Claude Code 中输入/elasticsearch-audit确认已加载。

附带文件references/api-reference.md

详细介绍

Elasticsearch 审计日志

通过集群设置 API 启用并配置 Elasticsearch 的安全审计日志。审计日志会记录安全事件,例如身份验证尝试、访问授权和拒绝、角色变更以及 API 密钥操作,是合规审查和事件调查的重要依据。

如需了解 Kibana 审计日志(已保存对象访问、登录/登出、空间操作),请参阅 kibana-audit。如需了解身份验证和 API 密钥管理,请参阅 elasticsearch-authn。如需了解角色和用户管理,请参阅 elasticsearch-authz。如需诊断安全错误,请参阅 elasticsearch-security-troubleshooting。

如需了解详细的 API 端点和事件类型,请参阅 references/api-reference.md。

部署说明: 不同部署类型的审计日志配置有所不同。详情请参阅 部署兼容性。

待完成的任务

  • 在集群上启用或禁用安全审计日志
  • 选择要记录的安全事件(身份验证、访问、配置变更)
  • 创建筛选策略以减少审计日志噪声
  • 查询审计日志中的身份验证失败尝试
  • 调查未经授权的访问或权限提升事件
  • 设置以合规为重点的审计配置
  • 根据审计数据检测暴力破解登录模式
  • 将审计输出配置到索引,以便通过程序查询

前提条件

项目说明
Elasticsearch URL集群端点(例如 https://localhost:9200 或 Cloud 部署 URL)
身份验证有效凭据(请参阅 elasticsearch-authn 技能)
集群权限更新集群设置需要 manage 集群权限
许可证审计日志需要 gold、platinum、enterprise 或 trial 许可证

如有任何缺失值,请向用户询问。

启用审计日志

无需重启即可动态启用审计日志:

curl -X PUT "${ELASTICSEARCH_URL}/_cluster/settings" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "persistent": {
      "xpack.security.audit.enabled": true
    }
  }'

如需禁用,请将 xpack.security.audit.enabled 设为 false。验证当前状态:

curl "${ELASTICSEARCH_URL}/_cluster/settings?include_defaults=true&flat_settings=true" \
  <auth_flags> | jq '.defaults | with_entries(select(.key | startswith("xpack.security.audit")))'

审计输出

审计事件可以写入两种输出位置,也可以同时启用两者。

输出设置值说明
logfilelogfile写入 <ES_HOME>/logs/<cluster>_audit.json。默认选项。
indexindex写入 .security-audit-* 索引。可通过 API 查询。
通过 API 配置输出
curl -X PUT "${ELASTICSEARCH_URL}/_cluster/settings" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "persistent": {
      "xpack.security.audit.enabled": true,
      "xpack.security.audit.outputs": ["index", "logfile"]
    }
  }'

通过程序查询审计事件需要使用 index 输出。logfile 输出适合通过 Filebeat 将日志发送到外部 SIEM 工具。

注意: 在自管理集群上,较旧版本(8.x 之前)的 xpack.security.audit.outputs 可能需要在 elasticsearch.yml 中设为静态设置。在 8.x 及更高版本中,建议使用集群设置 API。

选择要记录的事件

控制要包含或排除的事件类型。默认情况下,启用审计功能后会记录所有事件。

仅包含特定事件
curl -X PUT "${ELASTICSEARCH_URL}/_cluster/settings" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "persistent": {
      "xpack.security.audit.logfile.events.include": [
        "authentication_failed",
        "access_denied",
        "access_granted",
        "anonymous_access_denied",
        "tampered_request",
        "run_as_denied",
        "connection_denied"
      ]
    }
  }'
排除嘈杂事件
curl -X PUT "${ELASTICSEARCH_URL}/_cluster/settings" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "persistent": {
      "xpack.security.audit.logfile.events.exclude": [
        "access_granted"
      ]
    }
  }'

排除 access_granted 可以显著减少繁忙集群上的日志量;如果只关心失败事件,请使用此设置。

事件类型参考
事件触发时机
authentication_failed凭据被拒绝
authentication_success用户成功通过身份验证
access_granted执行了已获授权的操作
access_denied因权限不足而拒绝了操作
anonymous_access_denied拒绝了未经身份验证的请求
tampered_request检测到请求遭到篡改
connection_granted节点加入集群(传输层)
connection_denied拒绝了节点连接
run_as_granted授权了 run-as 身份模拟
run_as_denied拒绝了 run-as 身份模拟
security_config_change安全设置已更改(角色、用户、API 密钥等)

请参阅 references/api-reference.md,了解完整的事件类型列表及字段详情。

过滤策略

过滤策略允许按用户、领域、角色或索引抑制特定审计事件,而无需全局禁用该事件类型。可以同时启用多个策略——只有在没有策略将事件过滤掉时,才会记录该事件。

忽略系统用户和内部用户
curl -X PUT "${ELASTICSEARCH_URL}/_cluster/settings" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "persistent": {
      "xpack.security.audit.logfile.events.ignore_filters": {
        "system_users": {
          "users": ["_xpack_security", "_xpack", "elastic/fleet-server"],
          "realms": ["_service_account"]
        }
      }
    }
  }'
忽略特定索引上的运行状况检查流量
curl -X PUT "${ELASTICSEARCH_URL}/_cluster/settings" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "persistent": {
      "xpack.security.audit.logfile.events.ignore_filters": {
        "health_checks": {
          "users": ["monitoring-user"],
          "indices": [".monitoring-*"]
        }
      }
    }
  }'
过滤策略字段
字段类型说明
usersarray[string]要排除的用户名(支持通配符)
realmsarray[string]要排除的领域名称
rolesarray[string]要排除的角色名称
indicesarray[string]要排除的索引名称或模式(支持 *)
actionsarray[string]要排除的操作名称(例如 indices:data/read/*)

如果事件符合单个策略中所有指定字段的条件,就会被过滤掉。

移除过滤策略

将策略设为 null:

curl -X PUT "${ELASTICSEARCH_URL}/_cluster/settings" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "persistent": {
      "xpack.security.audit.logfile.events.ignore_filters.health_checks": null
    }
  }'

查询审计事件

启用 index 输出后,审计事件会存储在 .security-audit-* 索引中,可以进行查询。

搜索身份验证失败的尝试
curl -X POST "${ELASTICSEARCH_URL}/.security-audit-*/_search" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "bool": {
        "filter": [
          { "term": { "event.action": "authentication_failed" } },
          { "range": { "@timestamp": { "gte": "now-24h" } } }
        ]
      }
    },
    "sort": [{ "@timestamp": { "order": "desc" } }],
    "size": 50
  }'
搜索特定索引上的访问拒绝事件
curl -X POST "${ELASTICSEARCH_URL}/.security-audit-*/_search" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "bool": {
        "filter": [
          { "term": { "event.action": "access_denied" } },
          { "term": { "indices": "logs-*" } },
          { "range": { "@timestamp": { "gte": "now-7d" } } }
        ]
      }
    },
    "sort": [{ "@timestamp": { "order": "desc" } }],
    "size": 20
  }'
搜索安全配置更改
curl -X POST "${ELASTICSEARCH_URL}/.security-audit-*/_search" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "bool": {
        "filter": [
          { "term": { "event.action": "security_config_change" } },
          { "range": { "@timestamp": { "gte": "now-7d" } } }
        ]
      }
    },
    "sort": [{ "@timestamp": { "order": "desc" } }],
    "size": 50
  }'

这会捕获角色的创建和删除、用户变更、API 密钥操作以及角色映射更新。

按类型统计事件并检测暴力破解模式

使用 event.action 上的 terms 聚合(并设置 size: 0),统计某个时间段内各类型事件的数量。要检测暴力破解尝试,可按 source.ip 聚合 authentication_failed 事件,并设置 min_doc_count: 5。完整的聚合查询示例请参阅 references/api-reference.md。

与 Kibana 审计日志关联

Kibana 有自己的审计日志,用于记录 Elasticsearch 无法看到的应用层事件(已保存对象的 CRUD 操作、Kibana 登录、空间操作)。用户在 Kibana 中执行操作时,Kibana 会代表用户向 Elasticsearch 发送请求。两个系统都会记录相同的 trace.id(通过 X-Opaque-Id 标头传递),它是主要的关联键。

前提条件: 必须在 kibana.yml 中单独启用 Kibana 审计。设置说明、事件类型和 Kibana 专属过滤策略请参阅 kibana-audit 技能。

查找由 Kibana 操作触发的 ES 审计事件

给定 Kibana 审计事件中的 trace.id,搜索 ES 审计索引,查看底层的 Elasticsearch 操作:

curl -X POST "${ELASTICSEARCH_URL}/.security-audit-*/_search" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "bool": {
        "filter": [
          { "term": { "trace.id": "'"${TRACE_ID}"'" } },
          { "range": { "@timestamp": { "gte": "now-24h" } } }
        ]
      }
    },
    "sort": [{ "@timestamp": { "order": "asc" } }]
  }'
按用户和时间范围进行关联

当 trace.id 不可用时(例如直接 API 调用),改用用户和时间范围进行关联:

curl -X POST "${ELASTICSEARCH_URL}/.security-audit-*/_search" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "bool": {
        "filter": [
          { "term": { "user.name": "'"${USERNAME}"'" } },
          { "range": { "@timestamp": { "gte": "now-5m" } } }
        ]
      }
    },
    "sort": [{ "@timestamp": { "order": "asc" } }]
  }'

次要关联字段:user.name、source.ip 和 @timestamp。

统一查询

通过 Filebeat 将 Kibana 审计日志发送到 Elasticsearch(参见 kibana-audit 中的 Filebeat 配置),这样就可以在单个多索引查询中同时搜索 .security-audit-*(ES)和 kibana-audit-*(Kibana)索引,并按 trace.id 过滤。

示例

启用审计日志以满足合规要求

请求:“启用审计日志,并记录所有失败的访问和身份验证事件。”

curl -X PUT "${ELASTICSEARCH_URL}/_cluster/settings" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "persistent": {
      "xpack.security.audit.enabled": true,
      "xpack.security.audit.logfile.events.include": [
        "authentication_failed",
        "access_denied",
        "anonymous_access_denied",
        "run_as_denied",
        "connection_denied",
        "tampered_request",
        "security_config_change"
      ]
    }
  }'

这会捕获所有拒绝事件和安全变更事件,同时排除数量较多的成功事件。

调查疑似未授权访问尝试

请求:“有人可能尝试访问 secrets-* 索引。检查审计日志。”

curl -X POST "${ELASTICSEARCH_URL}/.security-audit-*/_search" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "bool": {
        "filter": [
          { "terms": { "event.action": ["access_denied", "authentication_failed"] } },
          { "wildcard": { "indices": "secrets-*" } },
          { "range": { "@timestamp": { "gte": "now-48h" } } }
        ]
      }
    },
    "sort": [{ "@timestamp": { "order": "desc" } }],
    "size": 100
  }'

查看结果中的 user.name、source.ip 和 event.action,以识别行为者及其操作模式。

减少繁忙集群上的审计噪声

请求:“审计日志太大了。过滤掉监控流量和成功读取事件。”

从事件类型中排除 access_granted,然后为监控用户和索引添加筛选策略。完整语法请参阅筛选策略。

指南

优先使用索引输出进行程序化访问

启用 index 输出,以便查询审计事件。logfile 输出更适合通过 Filebeat 将日志发送到外部 SIEM 工具,但无法通过 Elasticsearch API 查询。

先采用严格限制,再逐步放宽

首先仅记录失败事件(authentication_failed、access_denied、security_config_change)。仅在需要时添加成功事件,因为这类事件会产生大量数据。

使用筛选策略,而不是禁用事件

使用筛选策略抑制特定用户或索引的事件,而不是排除整个事件类型。

监控审计索引大小

设置 ILM 策略,以滚动更新并删除旧的 .security-audit-* 索引。通常保留 30-90 天。

启用 Kibana 审计以实现全面覆盖

对于应用层事件(保存对象访问、Kibana 登录、空间操作),也请启用 Kibana 审计日志。设置方法请参阅 kibana-audit 技能。使用 trace.id 进行关联——参见上文与 Kibana 审计日志关联。

避免使用超级用户凭据

使用专用管理员用户或具有 manage 权限的 API 密钥。仅在紧急恢复时使用 elastic。

部署兼容性

功能自行管理ECHServerless
通过集群设置配置 ES 审计是是不可用
ES logfile 输出是通过 Cloud UI不可用
ES 索引输出是是不可用
通过集群设置配置筛选策略是是不可用
查询 .security-audit-*是是不可用

**ECH 说明:**通过集群设置 API 配置 ES 审计。可通过 Cloud 控制台中的部署日志访问 logfile 输出。索引输出与自行管理的方式相同。

Serverless 说明:

  • Serverless 上的审计日志记录无法由用户配置。安全事件由 Elastic 作为平台的一部分进行管理。
  • 如果用户询问 Serverless 上的审计功能,请引导他们联系 Elastic Cloud 控制台或其客户团队。

评论

支持 Markdown