如何为Logstash HTTP输入添加API Token身份验证
给Logstash HTTP输入添加API Token身份验证
Logstash的HTTP输入插件本身没有像Elasticsearch输出那样内置的api_key配置项,但可以通过检查请求头+过滤不符合条件的请求来实现API Token验证,下面是具体的配置方案:
修改后的完整配置
input { http { host => "0.0.0.0" port => 8080 ssl => false # 开启捕获请求头,用于后续验证 request_headers => true } } filter { # 校验Authorization头的格式与令牌值 if [headers][Authorization] !~ /^ApiKey\s+my_api_key$/ { # 验证失败时返回401未授权响应 mutate { add_field => { "[@metadata][http_response_code]" => 401 "[@metadata][http_response_body]" => '{"error": "Invalid or missing API Token"}' } } # 丢弃验证失败的事件,不进入后续输出流程 drop {} } } output { stdout { codec => rubydebug } elasticsearch { hosts => "elasticsearch:9200" api_key => "my_api_key" index => "my-local-index" # 仅处理验证通过的事件 if ![@metadata][http_response_code] { } } }
配置说明
- 输入部分:开启
request_headers => true,让Logstash捕获请求的HTTP头信息,后续可通过[headers][Authorization]获取授权头内容。 - 过滤部分:使用正则表达式匹配
Authorization头的格式(必须为ApiKey 你的令牌值),不匹配则标记响应状态码与内容,直接丢弃事件。注意把my_api_key替换为你实际使用的令牌。 - 输出部分:通过
@metadata中的标记,确保只有验证通过的事件才会输出到Elasticsearch,stdout可用于调试验证结果。
测试验证
合法请求(验证通过)
curl -d '{"message": "my log"}' -H 'Content-Type: application/json' -H 'Authorization: ApiKey my_api_key' http://localhost:8080
此时Logstash会正常接收事件,输出到stdout和Elasticsearch。
非法请求(验证失败)
# 缺少Authorization头 curl -d '{"message": "invalid log"}' -H 'Content-Type: application/json' http://localhost:8080 # 令牌错误 curl -d '{"message": "invalid log"}' -H 'Content-Type: application/json' -H 'Authorization: ApiKey wrong_key' http://localhost:8080
这两种情况都会收到401响应,事件会被Logstash丢弃,不会进入输出环节。
内容的提问来源于stack exchange,提问作者Shepler
相关产品推荐
相关产品推荐

