【问题标题】:POSIX ERE Regex - Creating Efficient RegexPOSIX ERE 正则表达式 - 创建高效的正则表达式
【发布时间】:2022-12-05 07:13:09
【问题描述】:

我正在努力创建一些格式正确且高效的正则表达式条目。我会强调高效的,因为这些正则表达式条目每秒可以看到数千条日志。低效的正则表达式条目可能会导致严重的性能影响。

问题:regex101(通过一种风格)是否支持 POSIX ERE Regex?谷歌搜索表明 PCRE2 应该支持 BRE+ERE 等等。

正则表达式类型:POSIX ERE

系统日志应用程序:rsyslog (EL7)

示例有效负载(格式正确 - 敏感信息已删除):

Jul 10 00:00:00 Firewall-Name-Removed CEF:0|Fortinet|FortiGate-removed|1.2.3,build1111 (GA)|0000000013|转发流量接受|5|start=2022 年 7 月 10 日 00:00:00 logver =604091966 deviceExternalId=FG9A9A9A9999999 dvchost=Firewall-Name-Removed ad.vd=root ad.eventtime=1111111111111111111 ad.tz=-9999 ad.logid=0000000013 cat=traffic ad.subtype=转发设备1hostSeverity=1.notice sever =RandomHost1 spt=62119 deviceInboundInterface=DII-Out ad.srcintfrole=lan ad.srcssid=SSID 已删除 ad.apsn=ABC123D ad.ap=CHL-07 ad.channel=157 ad.radioband=802.11ac n-only ad .signal=-40 ad.snr=55 dst=2.2.2.2 dpt=53 deviceOutboundInterface=DOI-Out ad.dstintfrole=undefined ad.srccountry=Reserved ad.dstcountry=CountryRemoved externalID=123456789 proto=00 act=accept ad.policyid =000 ad.policytype=policy ad.poluuid=UUID-Removed ad.policyname=policy_name_removed app=DNS ad.trandisp=noop ad.appid=16195 ad.app=DNS ad.appcat=Network.Service ad.apprisk=elevated ad .applist=UTM 名称 - 删除了 ad.duration=180 out=0 in= 205 ad.sentpkt=0 ad.rcvdpkt=1 ad.utmaction=允许 ad.countdns=1 ad.osname=Windows ad.srcswversion=10 ad.mastersrcmac=MAC 已删除 ad.srcmac=MAC 已删除 ad.srcserver=0 tz= “-9999”

我试图做的是删除不需要的特定日志。通常我会在 SIEM 级别通过路由规则(我可以在其中使用字段)之类的东西来执行此操作,但在可预见的未来这是不可能的。在这种特殊情况下:我试图排除以下信息。

源IP:在特定范围内

deviceOutboundInterface:是 DOI-Out

当前正则表达式:“\bsrc=1.1.1[4-5]{0,1}.[0-9]{0,3}\b.*?\bdeviceOutboundInterface=DOI-Out\b“(PCRE2 中的Regex101 链接)。如果匹配,则拒绝日志(通过停止调用)。否则,它会移至其他条目以检查不必要的日志。

我的大多数正则表达式条目都是低两位数,因为它们要简单得多。有没有更好的方法可以使更复杂的正则表达式更高效?

感谢您提供的任何见解。

【问题讨论】:

    标签: regex posix-ere


    【解决方案1】:

    您也许可以通过以下方式节省时间:

    src=1.1.1[4-5]{0,1}.[0-9]{0,3}.*?deviceOutboundInterface=DOI-Out
    

    变化:

    • 删除单词边界
    • 更改 .至 。在IP地址

    regex101 的原始效率为 383 步,新的是 301,因此可能节省约 21%。不可怕,但您需要确保所有删除操作都正常。

    老实说,我觉得你的东西不错。

    【讨论】:

    • 仍然比我拥有的要好!我会试试这个,但我仍然担心它对于生产工作负载来说过于紧张。其中一些服务器可以很好地扩展到每秒 10k 条消息的范围,因此即使是轻微的低效也会很快对长期性能造成致命影响。我的目标是创造“两场比赛”,而不必抓住它之间的一切,理想情况下将步数从 300 秒增加到 100 秒。有点像 src=1.1.1[4-5]{0,1}.[0-9]{0,3} "&" deviceOutboundInterface=DOI-Out。并将不贪婪的角色抓取放在中间。
    • POSIX ERE 不支持惰性量词。
    • 这是有问题的,但我想我可能有解决我的问题和缺少惰性量词的方法。 RSyslog 支持 if/else-if/else 统计信息,其中包括对“and”的支持,我认为 ($msg ereregex "<expression>" 和 $msg ereregex "<expression2>")。我会玩弄那个。
    【解决方案2】:

    此 RE 将 Reg101 上的步骤数从 383 减少到 270 (~ -29.5%):

    src=1.1.1[45]?.d{0,3}.*?O[boundIter]*?face=DOI-Out
    

    原来的 RE 已经很简单了,只匹配一个模式和一个文字串,很难优化。但是如果我们知道(从相关文本的文档,这里是 Log Message 手册)知道一个更简单的模式不会导致歧义,我们就可以这样做。

    变化:

    • 尽可能匹配文字文本
    • 用简单元素替换范围“4-5”
    • 不匹配长的“deviceOutboundInterface=”,而是使用一个模式,该模式将勉强匹配此字符串,但可能会匹配其他单词(如果它们曾经出现在日志消息中)——但我们知道它们不会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2015-12-29
      相关资源
      最近更新 更多