关于 elasticsearch-audit
elasticsearch-audit 是面向 Elasticsearch 管理员与安全团队的审计日志配置技能,可通过集群设置控制事件、输出和过滤,并查询审计记录以支持合规与事件调查。
主要功能
- 01启用或关闭审计日志
- 02选择记录的安全事件
- 03按用户、角色或索引过滤
- 04配置日志文件与索引输出
- 05查询失败登录及拒绝访问记录
适用场景
- 01配置合规审计事件
- 02调查未授权访问或权限提升
- 03识别暴力登录尝试
- 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")))'
审计输出
审计事件可以写入两种输出位置,也可以同时启用两者。
| 输出 | 设置值 | 说明 |
|---|---|---|
| logfile | logfile | 写入 <ES_HOME>/logs/<cluster>_audit.json。默认选项。 |
| index | index | 写入 .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-*"]
}
}
}
}'
过滤策略字段
| 字段 | 类型 | 说明 |
|---|---|---|
users | array[string] | 要排除的用户名(支持通配符) |
realms | array[string] | 要排除的领域名称 |
roles | array[string] | 要排除的角色名称 |
indices | array[string] | 要排除的索引名称或模式(支持 *) |
actions | array[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。
部署兼容性
| 功能 | 自行管理 | ECH | Serverless |
|---|---|---|---|
| 通过集群设置配置 ES 审计 | 是 | 是 | 不可用 |
| ES logfile 输出 | 是 | 通过 Cloud UI | 不可用 |
| ES 索引输出 | 是 | 是 | 不可用 |
| 通过集群设置配置筛选策略 | 是 | 是 | 不可用 |
查询 .security-audit-* | 是 | 是 | 不可用 |
**ECH 说明:**通过集群设置 API 配置 ES 审计。可通过 Cloud 控制台中的部署日志访问 logfile 输出。索引输出与自行管理的方式相同。
Serverless 说明:
- Serverless 上的审计日志记录无法由用户配置。安全事件由 Elastic 作为平台的一部分进行管理。
- 如果用户询问 Serverless 上的审计功能,请引导他们联系 Elastic Cloud 控制台或其客户团队。