AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 929752
Accepted
Server Fault
Server Fault
Asked: 2018-09-07 07:19:44 +0800 CST2018-09-07 07:19:44 +0800 CST 2018-09-07 07:19:44 +0800 CST

拆分 syslog-ng 消息

  • 772

我想将sshd日志条目中的源 IP 地址保存到 mysql 数据库中syslog-ng。目前,我定义了一个过滤器,它匹配所需日志条目的子字符串。

我可以将日志条目完整地保存到数据库中,但是$MSG系统日志条目的一部分包含很多我不想要的额外数据。有没有办法将系统日志条目的字段“拆分”为仅将 IP 地址写入数据库?

这是我的配置:

filter f_sshd
{
   # (log entry) Sep  5 14:59:20 myhost4 sshd Starting session: shell on pts/0 for rbackup from 10.120.192.25 port 36894 id 0
   match("Starting session:" value ("MESSAGE") );
};


destination d_sshd
{
   sql( type(mysql)
   username("xxxxx")
   password("xxxxxxx")
   database("syslog")
   host("localhost")
   table("ssh")
   columns("host", "facility", "priority", "level", "pid", "tag", "timestamp", "program", "msg")
   values("$HOST", "$FACILITY", "$PRIORITY", "$LEVEL", "$PID", "$TAG","$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC","$PROGRAM", "$MSG")
   indexes("timestamp", "host", "program", "pid", "message"));
};

log
{
   # s_stunnel is defined in syslog-ng/conf.d/stunnel.conf
   source(s_stunnel);
   filter(f_sshd);
   destination(d_sshd);
};
syslog-ng
  • 1 1 个回答
  • 1051 Views

1 个回答

  • Voted
  1. Best Answer
    krisFR
    2018-09-07T18:30:40+08:002018-09-07T18:30:40+08:00

    您可以使用syslog-ng-patterndb创建解析器来提取部分消息。

    创建 XML 文件以定义解析器 ( /etc/syslog-ng/template_sshd.xml):

    <patterndb version='4' pub_date='2010-10-17'>
        <ruleset name='ssh' id='123456678'>
            <pattern>ssh</pattern>
                <rules>
                    <rule provider='me' id='182437592347598' class='system'>
                        <patterns>
                            <pattern>Starting session: shell on @ESTRING:SSH_TERMINAL: @for @ESTRING:SSH_USERNAME: @from @ESTRING:SSH_CLIENT_ADDRESS: @port @NUMBER:SSH_PORT_NUMBER:@ id @NUMBER:SSH_ID@</pattern>
                        </patterns>
                        <examples>
                            <example>
                                <test_message program="ssh">Starting session: shell on pts/0 for rbackup from 10.120.192.25 port 36894 id 0</test_message>
                                <test_values>
                                    <test_value name="SSH_TERMINAL">pts/0</test_value>
                                    <test_value name="SSH_USERNAME">sampleuser</test_value>
                                    <test_value name="SSH_CLIENT_ADDRESS">192.168.10.12</test_value>
                                    <test_value name="SSH_PORT_NUMBER">42156</test_value>
                                    <test_value name="SSH_ID">1</test_value>
                                </test_values>
                           </example>
                        </examples>
                    </rule>
                </rules>
        </ruleset>
    </patterndb>
    

    然后在你的syslog-ng.conf:

    定义解析器:

    parser sshd_pattern { db_parser(file("/etc/syslog-ng/template_sshd.xml")); };
    

    在您的日志指令中调用解析器:

    log
    {
       # s_stunnel is defined in syslog-ng/conf.d/stunnel.conf
       source(s_stunnel);
       parser(sshd_pattern);  <---- call parser
       filter(f_sshd);
       destination(d_sshd);
    };
    

    在目标中使用解析器中的变量SSH_CLIENT_ADDRESS:

    destination d_sshd
    {
      file("/var/log/sshd.log"
      template("${SSH_USERNAME}; ${SSH_CLIENT_ADDRESS}; ${HOST}; ${FACILITY}; ${PRIORITY}; ${LEVEL}; ${PID}; ${TAG}; ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MIN}:${SEC}; ${PROGRAM}; \n")
      template_escape(no)
     );
    };
    

    单元测试运行:

    pdbtool match -P "ssh" -M "Starting session: shell on pts/0 for rbackup from 10.120.192.25 port 36894 id 0" -p template_sshd.xml -c -D -v
    

    应该返回:

    SSH_TERMINAL=pts/0
    SSH_USERNAME=rbackup
    SSH_CLIENT_ADDRESS=10.120.192.25
    SSH_PORT_NUMBER=36894
    SSH_ID=0
    

    改编自此链接:https ://gist.github.com/linickx/8002981


    编辑以下关于您的评论:

    理想情况下,SSH_TERMINAL 键可以在 session: 到 from bareword 之后吞下所有内容

    像这样更改 XML 中的模式:

    <pattern>Starting session: @ESTRING:SSH_TERMINAL:from @@ESTRING:SSH_CLIENT_ADDRESS: @port @NUMBER:SSH_PORT_NUMBER:@ id @NUMBER:SSH_ID@</pattern>
    

    哪个返回:

    # pdbtool match -P "ssh" -M "Starting session: shell on pts/0 for rbackup from 10.120.192.25 port 36894 id 0" -p template_sshd.xml -c -D -v
    
    SSH_TERMINAL=shell on pts/0 for rbackup  <-- you got all between "session:" to "from"
    SSH_CLIENT_ADDRESS=10.120.192.25
    SSH_PORT_NUMBER=36894
    SSH_ID=0
    

    关于模式解析器的进一步阅读:https ://www.syslog-ng.com/technical-documents/doc/syslog-ng-open-source-edition/3.16/administration-guide/72

    • 2

相关问题

  • syslog-ng:过滤未分类的消息

  • Windows服务器上的cygwin64,syslog数据在一行中打印出来

  • syslog-ng 日志以主机名年份日期存储

  • syslog-ng 不解析消息

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve