====les filtres rsyslog==== Nous allons prendre des logs qui ont cette forme : Mar 1 09:16:42 10.200.200.254 id=firewall time="2017-03-01 09:16:42" fw="TKI-FW01" tz=+0100 startime="2017-03-01 09:16:42" pri=4 confid=00 srcif="Ethernet0" srcifname="WAN" ipproto=icmp icmptype=3 icmpcode=13 proto=icmp src=86.79.71.137 srcmac=70:fc:8c:05:05:23 dst=37.71.110.18 dstname=Firewall_WAN ipv=4 action=block msg="Message ICMP invalide (replay)" class=protocol classification=0 alarmid=67 logtype="alarm" afin de pouvoir envoyer tout cela a un serveur kibana/elasticsearch/logstash nous devons formaliser cela en json. Pour faire cela nous allons utiliser des filtres rsyslog : en voici un : template(name="extractPri" type="string" string="%msg:F,61:6%") set $!pri = exec_template("extractPri"); On commence par définir un template chargé de filtré la valeur voulu. puis nous mettons le résultat dans une variable. Voyons en détail le filtre : %msg:F,61:6%" msg est une variable de rsyslog. Dans cette variable nous allons filtrer un champ ( F ) qui commence par égale ( 61 est le code décimal de égale ). La valeur filtrer ira jusqu'au prochain égale. Et enfin le 6 de la fin défini qu'il ne doit retenir que la sixième occurrence. Vous allez me dire que sa ne correspond pas a la valeur voulu : certe c'est pourquoi on va refiltrer ce résultat : template(name="extractPri" type="string" string="%msg:F,61:6%") set $!pri = exec_template("extractPri"); template(name="extractPriBis" type="string" string="%$!pri:F,32:1%") set $!pri = exec_template("extractPriBis"); Avec le deuxième filtre on sépare la chaine en fonction des espace et on prend le premier résultat autrement dit la valeur voulu Une fois cela fait pour toutes les valeur il ne reste plus qu'a les ranger dans un template charger de formatter cela en json : template(name="json_lines" type="list" option.json="on") { constant(value="{") constant(value="\"timestamp\":\"") property(name="timereported" dateFormat="rfc3339") constant(value="\",\"time\":\"") property(name="$!time") constant(value="\",\"fw\":\"") property(name="$!fw") constant(value="\",\"StartTime\":\"") property(name="$!StartTime") constant(value="\",\"srcif\":\"") property(name="$!srcif") constant(value="\",\"srcifname\":\"") property(name="$!srcifname") constant(value="\",\"Message\":\"") property(name="$!Msg") constant(value="\",\"pri\":\"") property(name="$!pri") constant(value="\",\"proto\":\"") property(name="$!proto") constant(value="\",\"src\":\"") property(name="$!src") constant(value="\",\"dst\":\"") property(name="$!dst") constant(value="\",\"dstname\":\"") property(name="$!dstname") constant(value="\",\"srcmac\":\"") property(name="$!srcmac") constant(value="\",\"ipv\":\"") property(name="$!ipv") constant(value="\",\"action\":\"") property(name="$!action") constant(value="\",\"class\":\"") property(name="$!classe") constant(value="\",\"classification\":\"") property(name="$!classification") constant(value="\",\"alarmid\":\"") property(name="$!alarm") constant(value="\",\"logtype\":\"") property(name="$!logtype") constant(value="\"} \n") Vous allez me dire à ce moment que cela fonctionne mais que la conséquence est que rsyslog ne peut traiter d'autre type de log: C'est pour cela que nous avons mis des condition sur l'application des templates : if ( $!fw == 'TKI-FW01' ) then { *.* @10.200.200.215:10514;json_lines } else { *.* @10.200.200.215:10514;ls_json } $!fw est une valeur connu si les logs viennes du firwall par consuquent si il n'est pas égale à TKI-FW01 c'est que les log doivent être traité par un filtre plus généraliste d'ou notre dernier template : $template ls_json,“{%timestamp:::date-rfc3339,jsonf:@timestamp%,%source:::jsonf:@source_host%,\”@source\“:\”syslog:%fromhost-ip:::json%\“,\”@message\“:\”%timestamp% %app-name%:%msg:::jsonf:@cee%\“,\”@fields\“:{%syslogfacility-text:::jsonf:facility%,%syslogseverity-text:::jsonf:severity%,%app-name:::jsonf:program%,%procid:::jsonf:processid%}}” if ( $!fw == 'TKI-FW01' ) then { *.* @10.200.200.215:10514;json_lines } else { *.* @10.200.200.215:10514;ls_json } Voici le code intégrale : template(name="extractFw" type="string" string="%msg:F,34:4%") set $!fw = exec_template("extractFw"); template(name="extractTime" type="string" string="%msg:F,34:2%") set $!time = exec_template("extractTime"); template(name="extractStartTime" type="string" string="%msg:F,34:6%") set $!StartTime = exec_template("extractStartTime"); template(name="extractSrcif" type="string" string="%msg:F,34:8%") set $!srcif = exec_template("extractSrcif"); template(name="extractSrcifName" type="string" string="%msg:F,34:10%") set $!srcifname = exec_template("extractSrcifName"); template(name="extractMsg" type="string" string="%msg:F,34:12%" ) set $!Msg = exec_template("extractMsg"); # entre = et space #priority template(name="extractPri" type="string" string="%msg:F,61:6%") set $!pri = exec_template("extractPri"); template(name="extractPriBis" type="string" string="%$!pri:F,32:1%") set $!pri = exec_template("extractPriBis"); #protocole template(name="extractproto" type="string" string="%msg:F,61:10%") set $!proto = exec_template("extractproto"); template(name="extractprotoBis" type="string" string="%$!proto:F,32:1%") set $!proto = exec_template("extractprotoBis"); #src template(name="extractsrc" type="string" string="%msg:F,61:14%") set $!src = exec_template("extractsrc"); template(name="extractsrcBis" type="string" string="%$!src:F,32:1%") set $!src = exec_template("extractsrcBis"); #srcmac template(name="extractsrcmac" type="string" string="%msg:F,61:15%") set $!srcmac = exec_template("extractsrcmac"); template(name="extractsrcmacBis" type="string" string="%$!srcmac:F,32:1%") set $!srcmac = exec_template("extractsrcmacBis"); #destination template(name="extractdst" type="string" string="%msg:F,61:16%") set $!dst = exec_template("extractdst"); template(name="extractdstBis" type="string" string="%$!dst:F,32:1%") set $!dst = exec_template("extractdstBis"); # destination name template(name="extractdstname" type="string" string="%msg:F,61:17%") set $!dstname = exec_template("extractdstname"); template(name="extractdstnameBis" type="string" string="%$!dstname:F,32:1%") set $!dstname = exec_template("extractdstnameBis"); # ip version template(name="extractipv" type="string" string="%msg:F,61:18%") set $!ipv = exec_template("extractipv"); template(name="extractipvBis" type="string" string="%$!ipv:F,32:1%") set $!ipv = exec_template("extractipvBis"); #action template(name="extractaction" type="string" string="%msg:F,61:19%") set $!action = exec_template("extractaction"); template(name="extractactionBis" type="string" string="%$!action:F,32:1%") set $!action = exec_template("extractactionBis"); #classe template(name="extractclasse" type="string" string="%msg:F,61:21%") set $!classe = exec_template("extractclasse"); template(name="extractclasseBis" type="string" string="%$!classe:F,32:1%") set $!classe = exec_template("extractclasseBis"); #classification template(name="extractclassification" type="string" string="%msg:F,61:22%") set $!classification = exec_template("extractclassification"); template(name="extractclassificationBis" type="string" string="%$!classification:F,32:1%") set $!classification = exec_template("extractclassificationBis"); # alarmID template(name="extractalarm" type="string" string="%msg:F,61:23%") set $!alarm = exec_template("extractalarm"); template(name="extractalarmBis" type="string" string="%$!alarm:F,32:1%") set $!alarm = exec_template("extractalarmBis"); # logtype template(name="extractlogtype" type="string" string="%msg:F,61:23%") set $!logtype = exec_template("extractlogtype"); template(name="extractlogtypeBis" type="string" string="%$!logtype:F,32:1%") set $!logtype = exec_template("extractlogtypeBis"); template(name="json_lines" type="list" option.json="on") { constant(value="{") constant(value="\"timestamp\":\"") property(name="timereported" dateFormat="rfc3339") constant(value="\",\"time\":\"") property(name="$!time") constant(value="\",\"fw\":\"") property(name="$!fw") constant(value="\",\"StartTime\":\"") property(name="$!StartTime") constant(value="\",\"srcif\":\"") property(name="$!srcif") constant(value="\",\"srcifname\":\"") property(name="$!srcifname") constant(value="\",\"Message\":\"") property(name="$!Msg") constant(value="\",\"pri\":\"") property(name="$!pri") constant(value="\",\"proto\":\"") property(name="$!proto") constant(value="\",\"src\":\"") property(name="$!src") constant(value="\",\"dst\":\"") property(name="$!dst") constant(value="\",\"dstname\":\"") property(name="$!dstname") constant(value="\",\"srcmac\":\"") property(name="$!srcmac") constant(value="\",\"ipv\":\"") property(name="$!ipv") constant(value="\",\"action\":\"") property(name="$!action") constant(value="\",\"class\":\"") property(name="$!classe") constant(value="\",\"classification\":\"") property(name="$!classification") constant(value="\",\"alarmid\":\"") property(name="$!alarm") constant(value="\",\"logtype\":\"") property(name="$!logtype") constant(value="\"} \n") } $template ls_json,"{%timestamp:::date-rfc3339,jsonf:@timestamp%,%source:::jsonf:@source_host%,\"@source\":\"syslog://%fromhost-ip:::json%\",\"@message\":\"%timestamp% %app-name%:%msg:::jsonf:@cee%\",\"@fields\":{%syslogfacility-text:::jsonf:facility%,%syslogseverity-text:::jsonf:severity%,%app-name:::jsonf:program%,%procid:::jsonf:processid%}}" if ( $!fw == 'TKI-FW01' ) then { *.* @10.200.200.215:10514;json_lines } else { *.* @10.200.200.215:10514;ls_json } {{tag> rsyslog log linux logstash kibana elasticsearch }}