SQL データベースのネットフロー データを使用して DoS 検出プログラムを作成しようとしています。これまでのところ、これを達成する方法についての一般的なアイデアはありますが、方向性が必要です。
ここまでのプログラムの流れは次のとおりです。
<?php
$run = 'true';
$servername = "10.1.80.50";
$username = "netflow";
$password = "********";
$dbname = "netflow";
$flowQuery = 'SELECT distinct TIMESTAMP, SRCADDR, DSTADDR, SRCPORT, DSTPORT, PROT FROM netflow.flows ORDER BY DSTADDR ASC';
// Query flows for unique timed flows
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$flows = mysqli_query($conn, $flowQuery);
// Begin creating baseline data
while ($run == 'true') {
while($row = $flows->fetch_assoc()) {
$baselineQuery = 'SELECT FROM_UNIXTIME((UNIX_TIMESTAMP(TIMESTAMP) div (5*60))*(5*60)+(5*60)) as timeIntervals,
ROUND(SUM(DPKTS),0) as PACKETDATA,
MIN(DPKTS) AS MINPACKETS,
MAX(DPKTS) AS MAXPACKETS,
ROUND(SUM(DOCTETS),0) as OCTETDATA,
MIN(DOCTETS) AS MINOCTETS,
MAX(DOCTETS) AS MAXOCTETS
FROM (
SELECT FLOW_ID,TIMESTAMP,EXADDR,SRCADDR,DSTADDR,SRCPORT,DSTPORT,DPKTS,DOCTETS
FROM netflow.flows WHERE SRCADDR = "'.$row["SRCADDR"].'" AND DSTADDR = "'.$row["DSTADDR"].'" AND DSTPORT = "'.$row["DSTPORT"].'" AND SRCPORT = "'.$row["SRCPORT"].'" AND PROT = "'.$row["PROT"].'"
ORDER BY FLOW_ID DESC LIMIT 500
) AS custom
GROUP BY 1 ORDER BY timeIntervals DESC
LIMIT 240';
$baselines = mysqli_query($conn, $baselineQuery);
}
usleep(60000000);
}
print_r($baselines);
?>
私の論理は次のとおりです。
- 過去 8 時間の一意のフローをすべて検索します。
- このデータを使用して、これらの固有のフローごとにすべてのフロー データを見つけます。
- 作成した配列をフローごとにサブ配列または個々の配列に分割します。
- 各フローが独自の配列を持つと、パケットとデータが平均化され、疑似ベースラインが取得されます。
- 最新のフロー エントリをこれらの平均値と比較し、異常があるかどうかを判断します (一方向のデータ フローで 200% を超える増加/減少)。
- 異常が検出された場合は、イベントについて警告する電子メールを送信します。
- 60 秒待ってから、ループを再開します。
コードが完成には程遠く、非常にずさんである可能性が高いことは承知していますが、どんな助けも大歓迎です!