2011-05-06 12 views
0

私はsnortのスキーマを使用して、自分のプログラムに関連する情報を抽出しようとしています。私はIPs.Theクエリの特定のセットのための指定期間内に起こったアラートを抽出するために、次のクエリを使用し は私が指定した時間後に発生するアラートを(取得する必要がありますMySQLは 'WHERE'節の複数の範囲に参加します

select event.sid,event.cid,event.signature,event.timestamp,iphdr.ip_proto,iphdr.ip_src,iphdr.ip_dst from 
event join iphdr 
where event.sid=iphdr.sid and event.cid=iphdr.cid and iphdr.ip_dst >= inet_aton('x.x.x.1') and iphdr.ip_dst <= inet_aton('x.x.x.255') 
or iphdr.ip_dst >= inet_aton('x.x.y.1') and iphdr.ip_dst <= inet_aton('x.x.y.255') 
and event.timestamp > "2011-05-06 00:00:00" order by timestamp 

のようなものです

1組のIP(192.168.1.0/24など)のためのクエリの実行(つまり、192.168.1.1と192.168.1.0との間)および192.168.1.255)は高速で簡単です

WHERE句に複数の範囲があると問題が発生します。例えば。 192.168.1.1から192.168.1.255の間、または10.21.18.1から10.21.18.255の間のIP。このような場合には

上記のクエリで与えられるよう、MySQLのクエリの実行が(私は30分のためにそれを実行して、MySQLのデーモンを殺すために持っていた)私はそれがあると確信しています

を実行するのに長い時間がかかりますまたは問題を引き起こしているが、それを修正する方法がわからない部分。

イベントテーブルとiphdrテーブルの両方には、すべて150,000行

私のプログラムでは、ユーザーはアラートを表示する複数のサブネットを指定できるため、WHERE句の範囲の数に関係なくシームレスに実行するクエリが必要です。

+0

あなたはISD、CID、ip_dstとタイムスタンプ列のインデックスを持っていますか?両方のテーブルの –

+0

(sid、cid)のみが主キーです。インデックスはありません(少なくとも、Snortのスキーマのドキュメントからできることはありません) – RedBaron

答えて

1

ANDORその優先順位が高いです。

あなたのフィルターは、実際にはこれです:

(
event.sid=iphdr.sid and event.cid=iphdr.cid and iphdr.ip_dst >= inet_aton('x.x.x.1') and iphdr.ip_dst <= inet_aton('x.x.x.255') 
) 
or 
(
iphdr.ip_dst >= inet_aton('x.x.y.1') and iphdr.ip_dst <= inet_aton('x.x.y.255') and event.timestamp > "2011-05-06 00:00:00" 
) 

第二の条件は、そのサブセットの参加デカルトになりiphdreventとの間の相関関係を壊します。またこれらのインデックスを作成することもできます

event.sid=iphdr.sid 
AND event.cid=iphdr.cid 
AND 
(
iphdr.ip_dst BETWEEN inet_aton('x.x.x.1') AND inet_aton('x.x.x.255') 
OR 
iphdr.ip_dst BETWEEN inet_aton('x.x.y.1') AND inet_aton('x.x.y.255') 
) 
AND event.timestamp > "2011-05-06 00:00:00" 

はブラケットに OR句を入れ

iphdr (ip_dst) 
event (timestamp) 
+0

ありがとうございました。それを後で考え出す – RedBaron

1

WHEREのあなたのORはあなたの参加を破壊します。例えば、どこかORの周りに少なくとも使用括弧の外に加入取得してください。:SQL

select event.sid,event.cid,event.signature,event.timestamp, 
iphdr.ip_proto,iphdr.ip_src,iphdr.ip_dst 
from event join iphdr on (event.sid=iphdr.sid and event.cid=iphdr.cid) 
where iphdr.ip_dst >= inet_aton('x.x.x.1') 
and (
iphdr.ip_dst <= inet_aton('x.x.x.255') 
or iphdr.ip_dst >= inet_aton('x.x.y.1') 
) 
and iphdr.ip_dst <= inet_aton('x.x.y.255') 
and event.timestamp > "2011-05-06 00:00:00" 
order by timestamp 
関連する問題