如何在Logstash中移除command-shell字段的 字符
解决Logstash解析/etc/passwd时command-shell字段残留\r字符的问题
问题描述
出于安全审计需求,需解析/etc/passwd文件排查过期或异常账户。使用以下Logstash过滤器后,其他字段解析均正常,但command-shell字段始终残留\r字符,即使已通过mutate/gsub处理,Logstash无报错且运行正常。
当前使用的过滤器配置
filter { grok { match => {"message" => [ "%{WORD:username}:%{WORD:password}:%{NUMBER:userid}:%{NUMBER:groupid}:%{DATA:useridinfo}:%{DATA:homedir}:%{GREEDYDATA:command-shell}" ] } } mutate { remove_field => [ "@version", "log", "host", "@timestamp", "event", "message" ] } mutate { gsub => [ "command-shell", "\\r", "" ] } }
示例输出
{"useridinfo":"guest","userid":"405","groupid":"100","homedir":"/dev/null","username":"guest","password":"x","command-shell":"/sbin/nologin\r"} {"useridinfo":"nobody","userid":"65534","groupid":"65534","homedir":"/","username":"nobody","password":"x","command-shell":"/sbin/nologin\r"}
原始文件内容
guest:x:405:100:guest:/dev/null:/sbin/nologin nobody:x:65534:65534:nobody:/:/sbin/nologin
已尝试将GREEDYDATA替换为DATA,但在Grok Debugger中无效,故保留GREEDYDATA;尝试过现有gsub规则但问题未解决。
解决方案
方案1:修正gsub的转义写法
你当前的gsub规则中,"\\r"会被Logstash解析为匹配字符\和r,而非回车符\r。需要将转义符调整为单个\:
mutate { gsub => [ "command-shell", "\r", "" ] }
如果只想移除字段结尾的\r,可以用正则限定位置,避免误删字段内的合法字符:
mutate { gsub => [ "command-shell", "\r$", "" ] }
方案2:在Grok阶段直接排除\r
修改Grok匹配规则,通过正向预查忽略行尾的\r,从根源避免捕获该字符:
grok { match => {"message" => [ "%{WORD:username}:%{WORD:password}:%{NUMBER:userid}:%{NUMBER:groupid}:%{DATA:useridinfo}:%{DATA:homedir}:%{GREEDYDATA:command-shell}(?=\r?$)" ] } }
(?=\r?$)表示匹配行尾可选的\r,但不会将其捕获到command-shell字段中。
方案3:在Input阶段统一处理换行符
如果你的/etc/passwd文件实际是Windows格式(CRLF换行),可以在Input配置中直接指定换行格式,提前处理\r:
input { file { path => "/etc/passwd" codec => plain { newline => "LF" charset => "UTF-8" } } }
这样Logstash读取文件时会自动将CRLF转换为LF,后续无需额外处理。
内容的提问来源于stack exchange,提问作者FatsGordon
相关产品推荐
相关产品推荐

