要查明某台服务器是否向Elasticsearch添加了数据库,最直接的方法是交叉比对ES集群的审计日志与服务器端的网络连接记录。 下面我从集群审计、服务器端排查、API监控三个维度,拆解具体操作步骤。
怎么查看服务器向ES写入数据的审计日志
审计日志是ES集群内置的写入记录开关,开启后可以精确记录哪个客户端IP、什么用户、在什么时间执行了写操作,这是追溯数据源头的第一选择。
开启审计日志的步骤
在ES配置文件elasticsearch.yml中加入以下内容,然后重启集群(或滚动重启):
xpack.security.audit.enabled: true xpack.security.audit.logfile.events.include: ["access_denied", "authentication_failed", "anonymous_access_denied"]
如果希望记录所有写操作,可以把事件范围扩大到["access_denied", "access_granted", "authentication_success", "tampered_request"],但全量记录会占用大量磁盘,建议在排查期间临时开启,排查结束后关闭。
- 日志文件默认位于
ES_HOME/logs/目录,文件名包含_audit.log字样。 - 每条日志包含
request.method(如POST、PUT)、indices(涉及索引名)、principal(认证用户)、source.ip_address(来源IP)。
从审计日志中提取写入来源
拿到审计日志后,用grep过滤索引写入操作:
grep "PUT" audit.log | grep "your_index_name" | awk '{print $8}'
其中$8通常是source.ip_address字段,具体位置因日志格式不同可以调整,如果日志是JSON格式,可以用jq解析:
jq 'select(.request.method == "PUT") | .source.ip_address' audit.log
列出所有向目标索引写入的IP,再对照服务器IP清单,就能定位到具体机器。
结合Kibana可视化分析写入来源
如果ES集群已经接入Kibana,可以在“监控”面板中查看“索引速率”和“节点写入量”,但更细粒度的方式是把审计日志导入到单独的索引,然后用Kibana的“Discover”直接过滤:
- 创建索引模式匹配
audit。 - 在过滤栏输入
request.method: PUT或request.method: POST。 - 按
source.ip_address进行聚合统计,生成饼图或数据表。
这样一眼就能看出哪台服务器在频繁写入,省去逐行翻日志的麻烦。
如何从服务器端排查ES数据库写入来源
如果ES集群没有审计日志,或者你想多一层验证,从服务器端反向排查同样有效,核心思路是检查服务器上哪些进程在连接ES,以及它们发送了什么数据。
检查采集器(Filebeat/Logstash)配置
大多数业务服务器的ES写入走的是Filebeat、Logstash或Fluentd这类采集器,先确认这些进程是否在运行:
ps aux | grep -E "filebeat|logstash|fluentd"
如果有,查看它们的配置文件:
- Filebeat:
filebeat.yml,重点关注output.elasticsearch段,里面会定义ES集群地址和索引名。 - Logstash:
pipelines.yml或具体配置文件,看output{ elasticsearch {} }块。
通过这些配置,可以确定该服务器确实在向ES写入数据,甚至能知道写入了哪些索引。
使用tcpdump抓取ES端口流量
直接抓取服务器与ES集群之间的网络包,直观看到发送了哪些HTTP请求,ES默认端口是9200,抓包命令:
tcpdump -i any -s 0 -A "port 9200" -w es_capture.pcap
-
-A:以ASCII形式显示内容,能看到HTTP body。 - 把抓包文件拉到本地用Wireshark打开,过滤
http.request,查看POST或PUT请求的URL路径,就能知道索引名和文档内容。
如果流量很大,建议先按目标ES的IP做过滤:
tcpdump host <ES_IP> and port 9200 -w es_capture.pcap
查看应用日志中的ES写入痕迹
如果服务器跑的是业务应用(比如Java、Python服务),应用日志里通常会记录ES写入的细节,搜索关键词”elasticsearch”、”index”、”response code 201″等:
grep -r "elasticsearch" /var/log/app/ | grep -E "201|PUT|POST"
很多应用框架(如ELK Stack、Spring Data Elasticsearch)会打印调用ES的请求日志,从中可以提取出索引名、文档ID,以及调用来源。
对比服务器IP与ES访问日志的快速方法
当服务器数量较多,手动翻日志效率低时,可以借助ES自身的API做数据交叉比对。
通过ES _cat/nodes API获取节点信息
先确认ES集群当前有哪些节点,以及它们的IP角色:
curl -s http://localhost:9200/_cat/nodes?v
返回结果包含ip、node.role等字段,如果集群有多个节点,需要确认哪个节点处理了写请求,但单靠这个API看不到客户端来源。
利用_nodes/stats查看索引写入量
_nodes/stats接口可以按节点统计索引写入量(包括索引数、文档数、每秒写入速率),通过对比不同节点的写入量,可以推测数据是从哪个节点进入的,但无法直接定位到服务器。
更实用的方法是结合_nodes/stats的http字段,查看每个节点最近接收到的HTTP请求数:
curl -s http://localhost:9200/_nodes/stats/http | jq '.nodes[] | .http.total_opened'
如果某台服务器的IP出现在连接日志中,但你没有直接证据,可以借助ES的“慢日志”功能。
慢日志定位写操作来源
开启ES的慢写入日志,可以记录写操作的耗时和来源IP,在索引模板或具体索引的settings中设置:
{
"index.search.slowlog.threshold.query.warn": "10s",
"index.indexing.slowlog.threshold.index.warn": "5s"
}
慢日志默认记录在ES_HOME/logs/,文件名包含_index_indexing_slowlog.log会包含client字段,表示客户端IP。
使用慢日志的优点是不需要全局开启审计日志,仅针对特定索引启用,性能开销小。
怎么查看服务器往es里添加数据库的常见问题
审计日志没开启,能否通过ES的查询日志追溯写入来源?
可以,但只能查写入记录,无法直接看到来源IP,ES的查询日志(_search)不会记录源IP,只有慢日志和审计日志才会,如果没开审计日志,最快的方法是到服务器上抓包或看应用日志。
如何区分是服务器直接写入还是通过中间件(如Logstash)写入?
看审计日志中的source.ip_address和principal字段,如果IP是中间件服务器的IP,且用户是logstash_system或自定义用户,说明是中间件写入,如果IP是业务服务器直接出现,且用户是elastic或应用用户,则可能是直接写入。
为什么ES中能看到数据,但服务器上找不到对应的写入进程?
可能的原因有两个:一是数据通过其他服务器转发的,比如中间件集群;二是服务器上的采集器进程已经停止,但遗留的缓存数据还在发送,建议检查ES集群的慢日志,看最后写入时间,再对照服务器上的进程启动时间,判断是否由历史数据造成。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/557203.html




