Dividir un mensaje syslog-ng

Dividir un mensaje syslog-ng

Quiero guardar la dirección IP de origen de una sshdentrada de registro en una base de datos MySQL desde dentro syslog-ng. Actualmente, tengo un filtro definido que coincide con una subcadena de la entrada de registro deseada.

Puedo guardar la entrada del registro, en su totalidad, en la base de datos; sin embargo, la $MSGparte de la entrada del syslog contiene muchos datos adicionales que no deseo. ¿Hay alguna manera de "dividir" los campos de la entrada de syslog para escribir solo la dirección IP en la base de datos?

Esta es mi configuración:

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);
};

Respuesta1

Podrías crear un analizador usandosyslog-ng-patterndbpara extraer partes del mensaje.

Cree el archivo XML para definir su analizador ( /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>

Luego en tu syslog-ng.conf:

Definir el analizador:

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

Llame al analizador en su directiva de registro:

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);
};

Utilice la variable SSH_CLIENT_ADDRESSdel analizador dentro de su destino:

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)
 );
};

Prueba unitaria en ejecución:

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

Debería regresar:

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

Adaptado de este enlace:https://gist.github.com/linickx/8002981


Edite con respecto a su comentario a continuación:

Idealmente, la clave SSH_TERMINAL podría tragarse todo, desde el espacio después de la sesión: hasta la palabra básica.

Cambie el patrón en el XML de esta manera:

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

Que devuelve:

# 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

Lecturas adicionales sobre analizadores de patrones:https://www.syslog-ng.com/technical-documents/doc/syslog-ng-open-source-edition/3.16/administration-guide/72

información relacionada