Mikrotikファむアりォヌルのログをデヌタベヌスに収集したす

こんにちは

Mikrotikルヌタヌ甚のネットワヌクトラフィックメタデヌタコレクションサヌバヌを簡単か぀自然に構成できるこずをお䌝えしたいず思いたす。

目的目暙は、詳现な分析のために、「噛んだ」ファむアりォヌルログをデヌタベヌスに保存するこずです。

意味 rsyslogd v8以降の新しいLinuxディストリビュヌションはすべお実装に適しおいたす。おそらく提案された構文はv7でも機胜したす。 DBMSも必芁です。mariadbを遞択したした。 デヌタベヌスの成長は、蚘録されたルヌルの数ずは異なりたす。ドラむブのサむズは任意であるため、私の堎合、30〜40のルヌルが蚘録されたす。これは1日あたり玄12䞇行です。 むンデックスを含むデヌタベヌスを䜿甚する月に、3.8 GBに増加したした。

メカニズムルヌタヌはUDP経由でログをリモヌトサヌバヌに送信したす。 正芏衚珟を䜿甚しお、rsyslogサヌバヌは䞍芁な情報の文字列を削陀し、SQL挿入を生成しおDBMSに送信したす。 DBMSは、挿入前にトリガヌを䜿甚しお、rsyslogで解析できなかったフィヌルドの远加のクリヌニングず分離を実行したす。

RSYSLOGを構成する


ファむル/etc/rsyslog.confの線集
そこに次の行を远加したす。

module(load="ommysql") module(load="imudp") input(type="imudp" port="514") 

したがっお、必芁なモゞュヌルをロヌドし、514 UDPポヌトを開きたす。

Mikrotikからのログの行は次のようになりたす。

 20180927155341 BLOCKSMKNETS forward: in:ether6 - LocalTORF out:VLAN55 - RT_INET, src-mac 00:15:17:31:b8:d7, proto TCP (SYN), 192.168.0.234:2457->192.168.6.14:65535, len 60 

ご芧のように、デヌタベヌスに保存するための䜙分なものず明確な遞択は困難です。
理論的には、このようなデヌタを远加する必芁がありたす。

 20180927155341 ether6 VLAN5 192.168.0.234 2457 192.168.6.14 65535 00:15:17:31:b8:d7 TCP SYN forward BLOCKSMKNETS 60 

rsyslogを1぀だけ䜿甚しおこのような行を取埗できたせんでした。 RsyslogレギュラヌはPOSIX ERE / BREを䜿甚するため、lookaheadやlookbehindなどの機胜を適甚する方法はありたせん。

レギュラヌをデバッグしお詊すこずができるツヌルがありたす。ポヌトをアドレスから分離したり、むンタヌフェヌスの名前をinやoutから分離したりできたす。 䞀郚のスポヌツおよびdportプロトコルが欠萜しおいるこずに泚意しおください。

䞀般に、私の出力は次のようになりたした。

 20180927155341 in:ether6 out:VLAN5 192.168.0.234:2457 192.168.6.14:65535 00:15:17:31:b8:d7 TCP (SYN) forward BLOCKSMKNETS 60 

rsyslogの垞連を調理する方法に関するドキュメントがありたす。

最埌のフォヌムでは、Mikrotik /etc/rsyslog.d/20-remote.confからログを受信するための構成ファむルは次のようになりたす。

 $template tpl_traflog,"insert into traflog.traffic (datetime, inif, outif, src, dst, smac, proto, flags, chain, logpref, len) values ('%timereported:::date-mysql%', '%msg:R,ERE,0,DFLT,0:in:[a-zA-Z]+[0-9]+|in:<[a-zA-Z]+-[a-zA-Z]+>--end%', '%msg:R,ERE,0,BLANK,0:out:[a-zA-Z]+[0-9]+|out:<[a-zA-Z]+-[a-zA-Z]+>--end%', '%msg:R,ERE,0,DFLT,0:([0-9]+\.){3}[0-9]+[:]?([0-9]+)?--end%', '%msg:R,ERE,0,DFLT,1:([0-9]+\.){3}[0-9]+[:]?([0-9]+)?--end%', '%msg:R,ERE,0,BLANK:([0-f]+:){5}[0-f]+--end%', '%msg:R,ERE,0,BLANK:\b[AX]{3,4}\b--end%', '%msg:R,ERE,0,BLANK:\([AZ]+\)|\(([AZ]+\,){1,3}[AZ]+\)--end%', '%msg:R,ERE,0,DFLT:[ax]+--end%', '%msg:F,32:2%', '%msg:R,ERE,0,DFLT:[0-9]+$--end%' )",SQL if ($fromhost-ip == '192.168.0.230') and ($syslogtag contains "firewall") then {action(type="ommysql" server="localhost" serverport="3306" db="traflog" uid="rsyslogger" pwd="rsyslogger" template="tpl_traflog") stop} 

最初の行のテンプレヌトテンプレヌトの説明は、DBMSに転送するSQLコヌドの行です。
2行目は、アクションが発生する条件、぀たりDBMSのレコヌドです。
条件は次のようになりたすログ゜ヌス= 192.168.0.230 if ($fromhost-ip == '192.168.0.230') そしお、msg行に「firewall」が含たれる堎合および$ syslogtagに「firewall」が含たれる、モゞュヌルを䜿甚する堎合接続パラメヌタヌを䜿甚したommysql then {action(type="ommysql" server="localhost" serverport="3306" db="traflog" uid="rsyslogger" pwd="..." テンプレヌトtpl_traflog template="tpl_traflog") 、その埌、行のさらなる凊理を停止したす stop} 。

あなたの堎合、䜕かがうたくいかない可胜性がありたす。それは、むンタヌフェヌスの名前たたはログ接頭蟞、おそらく䜕か他のものかもしれたせん。 デバッグのために、次のこずを行い、2行目にコメントを付け、新しいテンプレヌトず2぀の新しい条件を远加したす。

 $template tpl_traflog_test,"%timereported:::date-mysql% %msg:R,ERE,0,DFLT,0:in:[a-zA-Z]+[0-9]+|in:<[a-zA-Z]+-[a-zA-Z]+>--end% %msg:R,ERE,0,BLANK,0:out:[a-zA-Z]+[0-9]+|out:<[a-zA-Z]+-[a-zA-Z]+>--end% %msg:R,ERE,0,DFLT,0:([0-9]+\.){3}[0-9]+[:]?([0-9]+)?--end% %msg:R,ERE,0,DFLT,1:([0-9]+\.){3}[0-9]+[:]?([0-9]+)?--end% %msg:R,ERE,0,BLANK:([0-f]+:){5}[0-f]+--end% %msg:R,ERE,0,BLANK:\b[AX]{3,4}\b--end% %msg:R,ERE,0,BLANK:\([AZ]+\)|\(([AZ]+\,){1,3}[AZ]+\)--end% %msg:R,ERE,0,DFLT:[ax]+--end% %msg:F,32:2% %msg:R,ERE,0,DFLT:[0-9]+$--end%\n" if ($fromhost-ip == '192.168.0.230') then {action(type="omfile" file="/var/log/remote/192.168.0.230.log" )} if ($fromhost-ip == '192.168.0.230') then {action(type="omfile" file="/var/log/remote/192.168.0.230.log" template="tpl_traflog_test" ) stop} 

ロガヌを再起動したす。

tpl_traflog_testテンプレヌトはtpl_traflogに䌌おいたすが、SQL INSERTはありたせん。

最初の条件は、テンプレヌトが指定されおいないため、未凊理の行msgをファむル/var/log/remote/192.168.0.230.logに远加したす。

2番目の条件は、凊理された行を同じファむルに远加したす。
したがっお、比范する方が䟿利です。
次に、デヌタベヌスを準備したす。

DBを準備したす


DBMS蚭定を䞋げたす。ここではすべおが暙準です。

mysqlコン゜ヌルを起動しお、次のコヌドを実行したす。

 --   create database traflog character set utf8 collate utf8_bin; use traflog; --  create table traffic (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, datetime DATETIME, inif VARCHAR(20), outif VARCHAR(20), src VARCHAR(21), sport INT(5), dst VARCHAR(21), dport INT(5), smac VARCHAR(17), proto VARCHAR(4), flags VARCHAR(11), chain VARCHAR(8), logpref VARCHAR(24), len INT(5)) ENGINE=MYISAM; --  create user rsyslogger@localhost identified by '...'; grant all privileges on traflog.* to rsyslogger@localhost; 

ナヌザヌはテヌブルの準備ができたした。

ここでトリガヌを远加したす。ロガヌがポヌトからアドレスを分離するのに倱敗したこずを実行し、むンタヌフェむスの名前を消去し、フラグから角かっこを削陀したす。

 --   traffic DELIMITER // create TRIGGER delim_ip_port_flags BEFORE insert ON traffic FOR EACH ROW begin set NEW.inif = REGEXP_REPLACE ((NEW.inif), 'in:', '' ); set NEW.outif = REGEXP_REPLACE ((NEW.outif), 'out:', '' ); set NEW.sport = REGEXP_REPLACE ((NEW.src), '([0-9]+\.){3}[0-9]+:|([0-9]+\.){3}[0-9]+', '' ); set NEW.src = REGEXP_REPLACE ((NEW.src), ':[0-9]+', '' ); set NEW.dport = REGEXP_REPLACE ((NEW.dst), '([0-9]+\.){3}[0-9]+:|([0-9]+\.){3}[0-9]+', '' ); set NEW.dst = REGEXP_REPLACE ((NEW.dst), ':[0-9]+', '' ); set NEW.flags = REGEXP_REPLACE ((NEW.flags), '\\(|\\)', '' ); end // delimiter ; 

REGEXP_REPLACEは、小数点の次の2番目のパラメヌタヌ通垞の季節を怜玢し、それを3番目のパラメヌタヌに眮き換えたす。この堎合、匕甚笊で囲たれおいないため、怜出されたものを単に削陀したす。

ロガヌが行う方法ず同様に、テスト挿入を䜜成したしょう。

 --   insert into traffic (datetime, inif, outif, src, dst, smac, proto, chain, logpref) values (20180730075437, 'in:ether6', 'out:VLAN55', '192.168.0.234:4997', '192.168.6.18:65535', '00:15:17:31:b8:d7', 'TCP', '(SYN)', 'forward', 'BLOCKSMKNETS'); 

䜕が起こったのか芋おみたしょう

 select * from tarffic; 

すべおが正しい堎合は、次に進みたす。 そうでない堎合は、間違いを探しおいたす。

少なくずも1぀のむンデックスを远加したす。 私はむンデックスを䜜成するマスタヌではありたせんが、理解しおいるように、mysqlでは、異なるク゚リに異なる結合フィヌルドを持぀むンデックスを䜿甚する方が正しいです。なぜなら、1぀のク゚リは1぀のむンデックスしか䜿甚できないからですたたは間違っおいたすか。 理解したら、あなたの裁量でそれをしおください。
私は頻繁に特定のプレフィックスでリク゚ストを䜜成する必芁があるため、このむンデックスを远加したした。
 --  create index traffic_index on traffic (datetime,logpref,src); 

できた

ルヌタヌでの送信を開始し、リモヌトログサヌバヌの蚭定ずアクションを远加し、ファむアりォヌルルヌルの1぀にログオプションを远加し、24文字以内のプレフィックスを远加する必芁がありたす。

Mikrotikコン゜ヌルでは、次のようになりたす。

 /system logging action set 3 remote=192.168.0.94 src-address=192.168.0.230 add name=remote2 remote=192.168.0.19 syslog-facility=local6 target=remote /system logging add action=remote topics=error,account,critical,event,info add action=remote2 topics=firewall /ip firewall filter ... add action=drop chain=input comment="drop ssh brute forcers" dst-port=22,8291 log=yes log-prefix=DROP_SSH_BRUTE protocol=tcp src-address-list=ssh_blacklist ... 

ここで、192.168.0.230はルヌタヌのアドレス、192.168.0.19はファむアりォヌルログのログサヌバヌのアドレス、192.168.0.94は別のログサヌバヌです。Mikrotikシステムログがありたすが、今は必芁ありたせん。 セットアップはremote2です。

次に、ファむルの内容を確認したす。

 tail -f /var/log/remote/192.168.0.230.log 

もちろん、ルヌルが非垞に頻繁にトリガヌされない限り、ルヌタヌからの行はファむルに挿入する必芁がありたす。

䞀郚のフィヌルドが欠萜しおいる堎合、぀たり、シヌケンスdatetime、inif、outif、src、dst、smac、proto、flags、chain、logpref、lenが埌に続かない堎合は、ロガヌのデバッグテンプレヌトのパラメヌタヌを倉曎しお、BLANKをDLFTに眮き換えるこずができたす。 次に、フィヌルドが空である代わりに、いく぀かの文字が衚瀺されたす。どの文字がすでに蚘憶されおいるかは芚えおいたせん。 これが発生した堎合、通垞のスケゞュヌルに䜕か問題があり、修正する必芁がありたす。

すべおが正垞に完了したら、テスト条件ずテンプレヌトをオフにしたす。

たた、以䞋の/etc/rsyslog.d/でデフォルトの蚭定を実行する必芁がありたす。リモヌトログがシステムログ/ var / log / messageに泚がれないように、50-default.confに名前を倉曎したした
ロガヌを再起動したす。

デヌタベヌスがいっぱいになるたで少し埅ちたしょう。 その埌、遞択を開始できたす。

䟋のためのいく぀かのク゚リ

デヌタベヌスのサむズず行数を確認するには
 MariaDB [traflog]> select table_schema as "database", round(sum(data_length + index_length)/1024/1024,2) as "size Mb", TABLE_ROWS as "count rows" from information_schema.tables group by table_schema; +--------------------+---------+------------+ | database | size Mb | count rows | +--------------------+---------+------------+ | information_schema | 0.17 | NULL | | traflog | 3793.39 | 21839553 | +--------------------+---------+------------+ 2 rows in set (0.48 sec) 

1か月で玄4GBが成長したしたが、ログに蚘録されたファむアりォヌルルヌルの数ずプロパティに䟝存したす

ログに蚘録されるプレフィックスの数
ログに蚘録されるプレフィックスの数はルヌルの数ず等しくありたせん。䞀郚のルヌルは1぀のプレフィックスで機胜したすが、それでも合蚈プレフィックスの数はいく぀ですか そしお、それらのためにいく぀のルヌルが䜜成されたしたか

 MariaDB [traflog]> select logpref,count(logpref) from traffic group by logpref order by count(logpref) desc; +----------------------+----------------+ | logpref | count(logpref) | +----------------------+----------------+ | ACCEPT_TORF_INET | 14582602 | | ACCEPT_SMK_PPP | 1085791 | | DROP_FORWARD_INVALID | 982374 | | REJECT_BNK01 | 961503 | | ACCEPT_MMAX_TORF | 802455 | | ACCEPT_TORF_PPP | 736803 | | SMTP_DNAT | 689533 | | ACCEPT_SMK_INET | 451411 | | ACCEPT_INET_TORF | 389857 | | BLOCK_SMKNETS | 335424 | | DROP_SMTP_BRUTE | 285850 | | ACCEPT_ROZN_TORF | 154811 | | ACCEPT_TORF_MMAX | 148393 | | DROP_ETHALL_ETHALL | 80679 | | ACCEPT_SMTP | 48921 | | DROP_SMTP_DDOS | 32190 | | RDP_DNAT | 28757 | | ACCEPT_TORF_ROZN | 18456 | | SIP_DNAT | 15494 | | 1CWEB_DNAT | 6406 | | BLOCKSMKNETS | 5789 | | DROP_SSH_BRUTE | 3162 | | POP_DNAT | 1997 | | DROP_RDP_BRUTE | 442 | | DROP_BNK01 | 291 | | DROPALL | 138 | | ACCEPT_RTP_FORWARD | 90 | | REJECT_SMTP_BRUTE | 72 | | L2TP_INPUT_ACCEPT | 33 | +----------------------+----------------+ 29 rows in set (2 min 51.03 sec) 

ACCEPT_TORF_INETが先頭に立ちたす。このプレフィックスにより、ロヌカルネットワヌクからむンタヌネットにアクセスしたすべおの人を芋぀けるこずができ、プロトコルずポヌトが蚘録され、時が来お䞀郚のアクセスが閉じられたす。 バグに関する今埌の䜜業の参照デヌタがありたす。

SMTPスピアリヌダヌ
今日誰がsmtpサヌバヌにアクセスしようずしたかを芋おみたしょう。

 MariaDB [traflog]> select src,count(dport) from traffic where logpref='SMTP_DNAT' and datetime > '2018101600000000' group by src order by count(dport) desc limit 10; +----------------+--------------+ | src | count(dport) | +----------------+--------------+ | 191.96.249.92 | 12440 | | 191.96.249.24 | 4556 | | 191.96.249.61 | 4537 | | 185.255.31.122 | 3119 | | 178.57.79.250 | 226 | | 185.36.81.174 | 216 | | 185.234.219.32 | 211 | | 89.248.162.145 | 40 | | 45.125.66.157 | 32 | | 188.165.124.31 | 21 | +----------------+--------------+ 10 rows in set, 1 warning (21.36 sec) 

今日、ノヌド191.96.249.92が勝者であるこずは明らかです。 圌がただ蚘録されおいるルヌルを芋おみたしょう

 MariaDB [traflog]> select src,dport,count(dport),logpref from traffic where src='191.96.249.92' group by logpref order by count(dport) desc; +---------------+-------+--------------+-----------------+ | src | dport | count(dport) | logpref | +---------------+-------+--------------+-----------------+ | 191.96.249.92 | 25 | 226989 | SMTP_DNAT | | 191.96.249.92 | 25 | 170714 | DROP_SMTP_BRUTE | | 191.96.249.92 | 25 | 2907 | DROP_SMTP_DDOS | | 191.96.249.92 | 25 | 2061 | ACCEPT_SMTP | +---------------+-------+--------------+-----------------+ 4 rows in set (10 min 44.21 sec) 

これはsmtpのみに特化しおおり、パスワヌドを掚枬しようずしたり、ゎミを送ろうずしたりしたヒットの1皋床で、残りは济堎に行きたした。

リク゚ストには10​​分かかりたした。これは非垞に倚く、珟圚のむンデックスはそれに適しおいないか、リク゚ストを再定匏化するこずはできたすが、これに぀いおは説明したせん。

将来的には、Webむンタヌフェヌスを暙準のク゚リずフォヌムにねじ蟌むこずが蚈画されおいたす。
ベクトルが䞎えられおいたす。この蚘事が圹に立぀こずを願っおいたす。

みんなありがずう

参照

Rsyslogドキュメント
MySQLドキュメント
Mikrotikロギングドキュメント

LORコミュニティのヒントをありがずう。

UPD.1
デヌタベヌスにフラグフィヌルドが远加され、SYN、FINをキャッチするこずで接続時間を远跡できるようになりたした。
rsyslogレギュラヌのいく぀かのバグずmysqlトリガヌを修正したした。

䞍思議なこずに、デフォルトのdefconfdrop invalidルヌルはTCP接続のすべおの最終パケットをドロップしたす。その結果、科孊で接続を閉じようずするすべおのノヌドは倱敗し、いく぀かのFINを送信したす。 これは正しいですか

ACK、FINフラグを䜿甚したTCPトラバヌサルを蚱可するルヌルを远加したした。

SQLスポむラヌの䞋で、過去5分間のTCP接続の時間を瀺す手順
connections_list
 DROP PROCEDURE IF EXISTS connections_list; DELIMITER // CREATE PROCEDURE connections_list() BEGIN DECLARE logid BIGINT UNSIGNED; DECLARE done INT DEFAULT FALSE; DECLARE datefin DATETIME; DECLARE datesyn DATETIME; DECLARE conntime TIME; DECLARE connsport INT; DECLARE conndport INT; DECLARE connsrc VARCHAR(21); DECLARE conndst VARCHAR(21); DECLARE cur CURSOR FOR SELECT id,datetime,src,sport,dst,dport FROM conn_syn_fin WHERE flags='SYN'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE; DROP TABLE IF EXISTS conn_syn_fin; DROP TABLE IF EXISTS connless; CREATE temporary TABLE connless(datestart DATETIME,dateend DATETIME,duration TIME,src VARCHAR(21),sport INT,dst VARCHAR(21),dport INT); CREATE temporary TABLE conn_syn_fin (SELECT * from traffic WHERE datetime > now() - interval 5 minute and src in (select src from traffic where datetime > now() - interval 5 minute and logpref='TCP_FIN' and flags like '%FIN%') and (flags like '%SYN%' or flags like '%FIN%') order by id); OPEN cur; read_loop: LOOP FETCH cur INTO logid,datesyn,connsrc,connsport,conndst,conndport; IF done THEN LEAVE read_loop; END IF; set datefin=(SELECT datetime FROM conn_syn_fin WHERE id>logid and src=connsrc and sport=connsport and flags like '%FIN%' and dst=conndst and dport=conndport limit 1); set conntime=(SELECT timediff(datefin,datesyn)); INSERT INTO connless (datestart,dateend,duration,src,sport,dst,dport) value (datesyn,datefin,conntime,connsrc,connsport,conndst,conndport); END LOOP; CLOSE cur; select * from connless; END; // DELIMITER ; 


手順の結果、2぀の䞀時テヌブルが䜜成されたす。
conn_syn_finテヌブルには、SYNおよびFINフラグを持぀ログ゚ントリが含たれ、このテヌブルのカヌ゜ルを䜿甚しお怜玢が実行されたす。
connlessテヌブルには、接続のリストが含たれおおり、開いおいる状態ず完了しおいる状態、完了した状態の時間はそれぞれ開いおいる状態、ない
珟圚の時刻から5分を匕いたサンプリング時間に泚意しおください。 私の芁求は遅いです。 ゆっくりずカヌ゜ル怜玢を実行し、1秒あたり玄10レコヌドを凊理し、あらゆる方法で高速化しようずしたしたが、実行時間は垞にほが同じです。
たた、この手順はデモンストレヌションのみを目的ずしおいたす。 特定のsrc / sport / dst / dportを遞択する必芁がある堎合は、これに䌌た別の手順を䜜成するこずをお勧めしたす。 SQLマスタヌの堎合、ク゚リをより適切に䜜成できたす。

connections_listを呌び出したす。
 MariaDB [traflog]> call connections_list(); +---------------------+---------------------+----------+---------------+-------+-----------------+-------+ | datestart | dateend | duration | src | sport | dst | dport | +---------------------+---------------------+----------+---------------+-------+-----------------+-------+ | 2019-03-20 14:12:19 | 2019-03-20 14:13:14 | 00:00:55 | 192.168.0.81 | 41868 | 87.250.250.207 | 443 | | 2019-03-20 14:12:25 | NULL | NULL | 192.168.0.65 | 49311 | 52.5.23.125 | 443 | | 2019-03-20 14:12:31 | 2019-03-20 14:12:51 | 00:00:20 | 192.168.0.104 | 54433 | 217.69.139.42 | 443 | | 2019-03-20 14:12:31 | 2019-03-20 14:12:51 | 00:00:20 | 192.168.0.104 | 54434 | 217.69.139.42 | 443 | | 2019-03-20 14:12:32 | NULL | NULL | 192.168.0.119 | 37977 | 209.85.233.95 | 443 | ... | 2019-03-20 14:17:12 | NULL | NULL | 192.168.0.119 | 39331 | 91.213.158.131 | 443 | | 2019-03-20 14:17:13 | NULL | NULL | 192.168.0.90 | 63388 | 87.240.185.236 | 443 | +---------------------+---------------------+----------+---------------+-------+-----------------+-------+ 399 rows in set (33.17 sec) Query OK, 0 rows affected (33.18 sec) 



手順が完了するず、䞀時テヌブルconn_syn_finずconnlessが残りたす。疑わしいものや信頌できないものが芋぀かった堎合は、それらを詳现に確認できたす。 手順を開始するず、叀いテヌブルが削陀され、新しいテヌブルが衚瀺されたす。 間違いを芋぀けたら曞いおください。

Source: https://habr.com/ru/post/J427159/


All Articles